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.

CampoDescriçãoExemplo
domainDomínio(s) com curinga"*.exemplo.com"
resourcesRegex de caminho URL["^/api/.*"]
subjectUsuário ou grupo"group:admins"
networksBlocos CIDR["10.0.0.0/8"]
policyAçãoone_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

RecursoAutheliaAuthentikKeycloakVouch ProxyOAuth2 Proxy
2FA/MFATOTP, WebAuthn, DuoTOTP, WebAuthn, DuoTOTP, WebAuthnDepende do IdPDepende do IdP
Provedor OIDCSim (v4.34+)Sim (IdP completo)Sim (enterprise)NãoNão
LDAP/ADSimSimSimNãoNão
RAM~50 MB~300 MB~512 MB~10 MB~10 MB
ComplexidadeBaixa-MédiaMédiaAltaBaixaBaixa

Solução de Problemas

ProblemaSolução
Loop 401 após loginVerifique que session.domain corresponda ao domínio de cookie de todos os serviços protegidos
Email de registro 2FA não recebidoTeste SMTP com startup_check_address; verifique logs do notifier
Registro WebAuthn falhaGaranta que HTTPS esteja ativo; o RP ID deve corresponder exatamente ao domínio de sessão
Auth LDAP falhaAtive log.level: debug; verifique credenciais do bind DN e base DN
Regulação bloqueando usuários legítimosRevise 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