Authelia 自托管单点登录(SSO)与多因子(MFA)认证部署

Authelia 是一款开源的开源身份验证网关,提供统一登录门户(Single Sign-On, SSO)与多因子二次验证(MFA / TOTP / Duo / WebAuthn 安全密钥),常与 Nginx / Traefik / Caddy 或 Cloudflare Tunnel 联动,保护自托管服务防范公网爆破。


一、 部署架构与目录设计

推荐采用 Docker Compose 配合 Redis(保存 Session 状态)与 SQLite(保存凭据和 MFA 密钥)的极简部署方案,放入系统的 cf-gateway 全局 Docker 网络中,无需外网暴露任何端口

# 创建部署工作目录
mkdir -p ~/authelia/config

二、 编写 docker-compose.yml

~/authelia/docker-compose.yml 中写入以下内容:

version: '3.8'
 
services:
  authelia:
    image: authelia/authelia:latest
    container_name: authelia
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/config
    networks:
      - cf-gateway
    depends_on:
      - authelia-redis
 
  authelia-redis:
    image: redis:alpine
    container_name: authelia-redis
    restart: unless-stopped
    volumes:
      - ./redis-data:/data
    networks:
      - cf-gateway
 
networks:
  cf-gateway:
    external: true

三、 主配置文件 (config/configuration.yml)

~/authelia/config/configuration.yml 中写入最小化配置:

theme: dark
jwt_secret: '[REDACTED_RANDOM_STRING_32_CHARS]'
default_redirection_url: https://auth.yourdomain.com
 
server:
  host: *.*.*.0
  port: 9091
 
log:
  level: info
 
authentication_backend:
  password_reset:
    disable: true
  file:
    path: /config/users_database.yml
 
session:
  name: authelia_session
  secret: '[REDACTED_RANDOM_STRING_32_CHARS]'
  expiration: 3600 # 1小时自动过期
  inactivity: 300  # 5分钟无操作自动锁定
  domain: yourdomain.com # 替换为你自己的主域名
  redis:
    host: authelia-redis
    port: 6379
 
storage:
  local:
    path: /config/db.sqlite
 
notifier:
  filesystem:
    filename: /config/notifications.txt

四、 用户与密码 Hash 生成

使用 Authelia 官方命令行生成 Argon2 加密密码,写入 config/users_database.yml

# 生成密码的 Argon2 哈希值
docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password '你的安全密码'

~/authelia/config/users_database.yml 中录入用户:

users:
  admin:
    disabled: false
    displayname: "系统管理员"
    password: "$argon2id$v=19$m=65536,t=3,p=4$..." # 粘贴上面生成的加密串
    email: admin@yourdomain.com
    groups:
      - admins
      - dev

五、 启动服务与 Cloudflare Tunnel 映射

1. 启动容器

cd ~/authelia && docker compose up -d

2. 绑定 Cloudflare Tunnel 反线

在 Cloudflare Zero Trust 控制台的主机名路由中添加:

  • Subdomain: auth (如 auth.yourdomain.com)
  • Type: HTTP
  • URL: authelia:9091 (直接使用容器名在 cf-gateway 内部网络中通信,无需暴露宿主机端口)

⚖️ 逆向防守与安全避坑 (Inversion)

  1. 密钥安全性jwt_secretsession.secret 必须使用至少 32 位的随机高强度字符串,切勿使用弱口令,否则可被黑客伪造身份 Cookie。
  2. 时钟同步依赖:使用基于时间的两步验证(TOTP,如 Google Authenticator)极其依赖 VPS 系统的精确时间。必须确保已经部署了 Chrony 高精度时间同步,否则会导致 TOTP 动态验证码永远报错失败。
  3. 数据备份:SQLite 数据库 config/db.sqlite 包含了用户已绑定的 MFA 2FA 密匙,需纳入自动备份范围。

相关链接