Authelia 自建认证网关:Docker 部署保护你的自建服务
痛点:自建服务越来越多,怎么统一保护?
搭了一堆自建服务:Gitea、Navidrome、Memos、Grafana……每个都有自己的登录页面。
但问题来了:
- 暴露到公网的服务,每个都要独立配置 HTTPS 和登录认证
- 有些服务没有自己的认证机制(比如 Dozzle、ntfy)
- 密码管理混乱——每个服务一套账号密码,记不住
- 没有统一的 2FA 保护——漏配一个服务就是安全漏洞
理想方案:一个统一登录入口,所有服务都在它后面。
这就是 Authelia 做的事。
Authelia 是什么?
Authelia 是一个用 Go 编写的开源认证授权服务器。它作为一个**反向代理的中间件**,为所有自建服务提供统一登录保护。
核心指标:
| 指标 | 数据 |
|---|---|
| ⭐ GitHub Stars | 28.2k |
| 🐹 语言 | Go(100%) |
| 📦 最新版 | v4.38(2026-06 活跃开发中) |
| 📄 许可证 | Apache-2.0 |
| 🐳 Docker 镜像 | authelia/authelia |
工作原理:
用户 → Nginx/Traefik/Caddy → Authelia 认证 → 自建服务 ↓(未登录) 登录页面(2FA可选)Authelia 与反向代理配合使用:当用户访问被保护的服务时,反向代理先检查 Authelia 的 cookie,未登录则重定向到 Authelia 的登录页面,登录成功后才放行。
Authelia vs 其他方案
| 特性 | Authelia | OAuth2 Proxy | Keycloak | Caddy(基础认证) |
|---|---|---|---|---|
| 部署难度 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
| 2FA/TOTP | ✅ 内置 🏆 | ✅ | ✅ | ❌ |
| LDAP 集成 | ✅ | ✅ | ✅ | ❌ |
| OIDC/OAuth | ✅ | ✅ | ✅ 最强 | ❌ |
| 资源占用 | 极低 🏆 | 低 | 重(Java) | 最低 |
| 配置复杂度 | 中 | 中 | 高 | 最简单 |
| Docker 部署 | ✅ 单容器 | ✅ 单容器 | ❌ 需数据库 | ✅ 单容器 |
选型建议: 个人/家庭自建用 Authelia(轻量+功能够用),企业上 Keycloak(功能全)。
Docker 部署 Authelia
前置准备
需要一个域名用来访问 Authelia,还需要一块 Redis(用于会话存储)。
version: "3.8"
services: redis: image: redis:7-alpine container_name: authelia-redis volumes: - ./redis:/data restart: unless-stopped
authelia: image: authelia/authelia:latest container_name: authelia volumes: - ./config:/config environment: - TZ=Asia/Shanghai ports: - "9091:9091" # Authelia 端口 depends_on: - redis restart: unless-stopped配置 Authelia
创建 config/configuration.yml:
# 主机与端口host: 0.0.0.0port: 9091
# 日志级别log: level: info
# TOTP(2FA 一次性密码)totp: issuer: authelia.example.com period: 30 skew: 1
# 身份验证后端——使用文件存储identity_validation: reset_password: enable: true
authentication_backend: file: path: /config/users.yml
# 访问控制规则access_control: default_policy: deny # 默认拒绝所有 rules: # 允许无需认证的路径 - domain: auth.example.com policy: bypass
# 需要双因素认证的服务 - domain: "*.secure.example.com" policy: two_factor
# 只需单因素认证的服务 - domain: "*.services.example.com" policy: one_factor
# 会话管理session: name: authelia_session secret: your-random-session-secret-change-me expiration: 1h # 会话超时 inactivity: 5m # 5分钟无操作自动登出 redis: host: redis port: 6379
# 重定向设置redirection: default_policy: deny # 自定义登录页面标题 customize: title: 洞察小屋 - 统一登录
# 监管设置regulation: max_retries: 5 find_time: 2m ban_time: 5m
# 通知——没有邮件的场景用文件通知notifier: filesystem: filename: /config/notifications.yml创建用户文件 config/users.yml:
users: admin: displayname: "管理员" password: "$argon2id$v=19$m=65536,t=3,p=4$..." # 使用 authelia hash-password 生成 email: admin@example.com groups: - admins生成密码哈希:
docker run authelia/authelia authelia hash-password 你的密码与 Nginx 集成
server { listen 443 ssl; server_name git.example.com;
location / { # 请求发到 Authelia 验证 auth_request /auth/verify; auth_request_set $auth_cookie $upstream_http_set_cookie; add_header Set-Cookie $auth_cookie;
# 认证通过后转发到 Gitea proxy_pass http://gitea:3000; }
# Authelia 验证端点 location = /auth/verify { internal; proxy_pass http://authelia:9091/api/verify; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URL $scheme://$http_host$request_uri; proxy_set_header X-Forwarded-Method $request_method; proxy_set_header X-Forwarded-Proto $scheme; }
# Authelia 登录页面 location /authelia { proxy_pass http://authelia:9091; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Uri $request_uri; }}与 Caddy 集成
git.example.com { # Authelia 验证端点——使用 Caddy 的 auth_portal 插件或手动配置 @protected { not path /authelia/* } reverse_proxy @protected gitea:3000
# Authelia 自身 handle /authelia/* { reverse_proxy authelia:9091 }}与 Traefik 集成(推荐方案)
使用 Traefik 的 ForwardAuth 中间件:
# docker-compose.yml 中的 Traefik 配置services: traefik: command: # ... 其他配置 # 添加 ForwardAuth 中间件 - "--experimental.plugins.authelia.moduleName=github.com/ClearlyClaire/traefik-forward-auth"
# 需要保护的服务 gitea: labels: - "traefik.http.routers.gitea.middlewares=authelia@file"
traefik: # 使用文件方式配置中间件 volumes: - ./traefik-config:/etc/traefik/dynamictraefik-config/authelia.yml:
http: middlewares: authelia: forwardAuth: address: http://authelia:9091/api/verify trustForwardHeader: true authResponseHeaders: - Remote-User - Remote-Groups - Remote-Email - Remote-Name常用配置场景
场景一:为 Grafana 添加 2FA 保护
access_control: rules: - domain: "grafana.example.com" policy: two_factor场景二:公开某些路径
如果你的应用需要公开 API:
access_control: rules: - domain: "api.example.com" resources: - "^/api/public/*$" policy: bypass - domain: "api.example.com" policy: one_factor场景三:不同用户不同权限
access_control: rules: - domain: "admin.example.com" subject: - "group:admins" policy: one_factor - domain: "admin.example.com" policy: denyFAQ
Q:Authelia 需要多大的服务器资源?
A:约 50MB 内存,CPU 几乎无占用。Redis 也只要 30MB 左右。总占用不到 100MB。
Q:有了 Authelia,我是否需要为每个服务配置 HTTPS?
A:不用。Authelia 通过反向代理统一管理 HTTPS,你只需要在反向代理层面配一次 TLS 证书,所有后端服务都可以通过 HTTP 通信(在内网)。
Q:用户登录后能访问所有服务吗?
A:可以,只要 session 有效,Authelia 在所有配置了 auth_request 的域名之间共享同一个会话。
Q:手机浏览器支持吗?
A:支持。Authelia 的登录页面是响应式设计,手机浏览器上也能正常使用 + TOTP 扫码。
Q:怎么添加新用户?
A:编辑 users.yml,用 authelia hash-password 生成密码哈希,重启容器即可。
Q:忘记管理员密码了怎么办?
A:重新生成哈希并更新 users.yml,重启容器。
总结
Authelia 是自建服务生态中不可或缺的一环:
- ✅ 统一认证——一个登录入口保护所有自建服务,告别每个服务各自一套密码
- ✅ 2FA/TOTP 内置——无需额外配置,开箱即用,大幅提升安全性
- ✅ 极轻量——Go 编写 + Redis 会话,100MB 内存搞定
- ✅ 灵活访问控制——按域名、路径、用户组精细控制访问权限
- ✅ Nginx/Traefik/Caddy 全兼容——适配主流反向代理
如果你搭了 3 个以上的自建服务并暴露到公网,Authelia 是值得花 30 分钟配置的安全投资。
本文由小啪撰写,基于 Authelia v4.38。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!