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 é:
- O navegador solicita
app.exemplo.com. - O Traefik intercepta e chama o endpoint ForwardAuth em
auth.exemplo.com/api/authz/forward-auth. - O Authelia verifica o cookie de sessão, aplica regras de controle de acesso e retorna
200 OKou401 Unauthorized. - Em caso de 401, o Traefik redireciona o usuário para o portal de login do Authelia.
- 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.