TL;DR — Resumo Rápido

Implante o Authelia como proxy SSO e 2FA. Cobre Docker Compose, integração com Traefik, TOTP, WebAuthn, backends LDAP e configuração de provedor OpenID Connect.

O Authelia é um portal de autenticação open-source que funciona como companion de forward-auth para o seu reverse proxy. Em vez de adicionar formulários de login a cada serviço auto-hospedado, o Authelia intercepta cada requisição, valida a sessão e aplica políticas de 2FA a partir de um único portal. Este guia cobre uma implantação completa em produção com Docker Compose, Traefik, TOTP e um provedor OpenID Connect.

Pré-requisitos

  • Docker e Docker Compose v2 em um host Linux.
  • Traefik v2/v3 configurado (ou Nginx/Caddy — notas de integração incluídas).
  • Um domínio com DNS apontando para o seu servidor (o Authelia requer um domínio real para cookies).
  • Conhecimento básico de YAML e redes de contêineres.

Arquitetura do Authelia

O fluxo de uma requisição é:

  1. O navegador solicita app.exemplo.com.
  2. O Traefik intercepta e chama o endpoint ForwardAuth em auth.exemplo.com/api/authz/forward-auth.
  3. O Authelia verifica o cookie de sessão, aplica regras de controle de acesso e retorna 200 OK ou 401 Unauthorized.
  4. Em caso de 401, o Traefik redireciona o usuário para o portal de login do Authelia.
  5. O usuário se autentica (senha + 2FA), recebe um cookie de sessão assinado e é redirecionado de volta.

Componentes principais:

  • Portal de autenticação — UI de login servida no subdomínio do Authelia.
  • Armazenamento de sessões — Redis para implantações distribuídas/HA; em memória para nó único.
  • Backend de armazenamento — SQLite (nó único) ou PostgreSQL/MySQL para HA.
  • Motor de políticas — Regras de controle de acesso avaliadas de cima para baixo.

Passo 1: Stack do Docker Compose

Crie /opt/authelia/docker-compose.yml:

version: "3.9"
networks:
  proxy:
    external: true

services:
  authelia:
    image: authelia/authelia:latest
    container_name: authelia
    restart: unless-stopped
    volumes:
      - ./config:/config
    environment:
      - AUTHELIA_JWT_SECRET_FILE=/config/secrets/jwt_secret
      - AUTHELIA_SESSION_SECRET_FILE=/config/secrets/session_secret
      - AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE=/config/secrets/storage_key
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.authelia.rule=Host(`auth.exemplo.com`)"
      - "traefik.http.routers.authelia.entrypoints=websecure"
      - "traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/authz/forward-auth"
      - "traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true"
      - "traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email"

  redis:
    image: redis:7-alpine
    container_name: authelia-redis
    restart: unless-stopped
    networks:
      - proxy
    volumes:
      - redis-data:/data

volumes:
  redis-data:

Gere os segredos:

mkdir -p /opt/authelia/config/secrets
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 > /opt/authelia/config/secrets/jwt_secret
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 > /opt/authelia/config/secrets/session_secret
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 > /opt/authelia/config/secrets/storage_key

Passo 2: Configuração Principal

Crie /opt/authelia/config/configuration.yml:

server:
  host: 0.0.0.0
  port: 9091

log:
  level: info

totp:
  issuer: exemplo.com
  period: 30
  skew: 1

authentication_backend:
  file:
    path: /config/users.yml
    password:
      algorithm: argon2id
      iterations: 3
      memory: 65536
      parallelism: 4

access_control:
  default_policy: deny
  rules:
    - domain: "auth.exemplo.com"
      policy: bypass
    - domain: "*.exemplo.com"
      subject: "group:admins"
      policy: two_factor
    - domain: "interno.exemplo.com"
      networks:
        - 192.168.1.0/24
      policy: one_factor

session:
  name: authelia_session
  domain: exemplo.com
  expiration: 1h
  inactivity: 5m
  remember_me: 1M
  redis:
    host: redis
    port: 6379

regulation:
  max_retries: 5
  find_time: 2m
  ban_time: 10m

storage:
  local:
    path: /config/db.sqlite3

notifier:
  smtp:
    host: smtp.exemplo.com
    port: 587
    username: noreply@exemplo.com
    password: suasenha
    sender: "Authelia <noreply@exemplo.com>"

Passo 3: Backends de Autenticação

Baseado em Arquivo (users.yml)

users:
  joao:
    displayname: "João Silva"
    password: "$argon2id$v=19$m=65536,t=3,p=4$..."
    email: joao@exemplo.com
    groups:
      - admins
      - users

Gere hashes argon2:

docker run authelia/authelia:latest authelia crypto hash generate argon2 --password 'suasenha'

Backend LDAP / Active Directory

authentication_backend:
  ldap:
    address: ldap://ldap.exemplo.com:389
    implementation: activedirectory
    base_dn: dc=exemplo,dc=com
    username_attribute: sAMAccountName
    users_filter: "(&({username_attribute}={input})(objectClass=person))"
    groups_filter: "(member={dn})"
    user: cn=authelia,ou=ContasServico,dc=exemplo,dc=com
    password: ldappassword

Passo 4: Controle de Acesso

As regras são avaliadas de cima para baixo; a primeira correspondência vence.

Campo Descrição Exemplo
domain Domínio(s) com curinga "*.exemplo.com"
resources Regex de caminho URL ["^/api/.*"]
subject Usuário ou grupo "group:admins"
networks Blocos CIDR ["10.0.0.0/8"]
policy Ação one_factor, two_factor, bypass, deny

Passo 5: Métodos de Dois Fatores

TOTP

Os usuários se registram no portal do Authelia. Compatível com Google Authenticator, Authy e qualquer app TOTP.

WebAuthn / Passkeys FIDO2

Suportado em todos os navegadores modernos. Os usuários registram uma chave de hardware (YubiKey) ou autenticador de plataforma (Face ID, Windows Hello).

Duo Push

duo_api:
  hostname: api-XXXXXXXX.duosecurity.com
  integration_key: DIXXXXXXXXXXXXXXXXXX
  secret_key: seu_segredo_duo

Passo 6: Provedor OpenID Connect

identity_providers:
  oidc:
    hmac_secret: um_segredo_aleatorio_com_pelo_menos_32_chars
    clients:
      - id: grafana
        secret: "$argon2id$v=19$..."
        authorization_policy: two_factor
        redirect_uris:
          - "https://grafana.exemplo.com/login/generic_oauth"
        scopes:
          - openid
          - profile
          - email
          - groups
        pkce_challenge_method: S256

Authelia vs Alternativas

Recurso Authelia Authentik Keycloak Vouch Proxy OAuth2 Proxy
2FA/MFA TOTP, WebAuthn, Duo TOTP, WebAuthn, Duo TOTP, WebAuthn Depende do IdP Depende do IdP
Provedor OIDC Sim (v4.34+) Sim (IdP completo) Sim (enterprise) Não Não
LDAP/AD Sim Sim Sim Não Não
RAM ~50 MB ~300 MB ~512 MB ~10 MB ~10 MB
Complexidade Baixa-Média Média Alta Baixa Baixa

Solução de Problemas

Problema Solução
Loop 401 após login Verifique que session.domain corresponda ao domínio de cookie de todos os serviços protegidos
Email de registro 2FA não recebido Teste SMTP com startup_check_address; verifique logs do notifier
Registro WebAuthn falha Garanta que HTTPS esteja ativo; o RP ID deve corresponder exatamente ao domínio de sessão
Auth LDAP falha Ative log.level: debug; verifique credenciais do bind DN e base DN
Regulação bloqueando usuários legítimos Revise regulation.find_time; aumente max_retries se houver IPs compartilhados

Resumo

  • Authelia é um proxy SSO + 2FA leve com motor de políticas integrado.
  • O padrão forward-auth permite que qualquer reverse proxy aplique autenticação sem tocar nas apps upstream.
  • TOTP, WebAuthn e Duo oferecem opções flexíveis de 2FA.
  • O provedor OIDC permite ao Authelia atuar como IdP completo para apps OAuth2.
  • A regulação fornece proteção contra força bruta de forma nativa.

Artigos Relacionados