Authelia 自建认证网关:Docker 部署保护你的自建服务

1444 字
7 分钟
Authelia 自建认证网关:Docker 部署保护你的自建服务

痛点:自建服务越来越多,怎么统一保护?#

搭了一堆自建服务:GiteaNavidrome、Memos、Grafana……每个都有自己的登录页面。

但问题来了:

  • 暴露到公网的服务,每个都要独立配置 HTTPS 和登录认证
  • 有些服务没有自己的认证机制(比如 Dozzle、ntfy)
  • 密码管理混乱——每个服务一套账号密码,记不住
  • 没有统一的 2FA 保护——漏配一个服务就是安全漏洞

理想方案:一个统一登录入口,所有服务都在它后面

这就是 Authelia 做的事。

Authelia 是什么?#

Authelia 是一个用 Go 编写的开源认证授权服务器。它作为一个**反向代理的中间件**,为所有自建服务提供统一登录保护。

核心指标:

指标数据
⭐ GitHub Stars28.2k
🐹 语言Go(100%)
📦 最新版v4.38(2026-06 活跃开发中)
📄 许可证Apache-2.0
🐳 Docker 镜像authelia/authelia

工作原理:

用户 → Nginx/Traefik/Caddy → Authelia 认证 → 自建服务
↓(未登录)
登录页面(2FA可选)

Authelia 与反向代理配合使用:当用户访问被保护的服务时,反向代理先检查 Authelia 的 cookie,未登录则重定向到 Authelia 的登录页面,登录成功后才放行。

Authelia vs 其他方案#

特性AutheliaOAuth2 ProxyKeycloakCaddy(基础认证)
部署难度⭐⭐⭐⭐⭐⭐⭐⭐
2FA/TOTP内置 🏆
LDAP 集成
OIDC/OAuth最强
资源占用极低 🏆重(Java)最低
配置复杂度最简单
Docker 部署✅ 单容器✅ 单容器❌ 需数据库✅ 单容器

选型建议: 个人/家庭自建用 Authelia(轻量+功能够用),企业上 Keycloak(功能全)。

Docker 部署 Authelia#

前置准备#

需要一个域名用来访问 Authelia,还需要一块 Redis(用于会话存储)。

docker-compose.yml
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.0
port: 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

生成密码哈希:

Terminal window
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/dynamic

traefik-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: deny

FAQ#

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 是自建服务生态中不可或缺的一环:

  1. 统一认证——一个登录入口保护所有自建服务,告别每个服务各自一套密码
  2. 2FA/TOTP 内置——无需额外配置,开箱即用,大幅提升安全性
  3. 极轻量——Go 编写 + Redis 会话,100MB 内存搞定
  4. 灵活访问控制——按域名、路径、用户组精细控制访问权限
  5. Nginx/Traefik/Caddy 全兼容——适配主流反向代理

如果你搭了 3 个以上的自建服务并暴露到公网,Authelia 是值得花 30 分钟配置的安全投资。


本文由小啪撰写,基于 Authelia v4.38。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Authelia 自建认证网关:Docker 部署保护你的自建服务
https://www.kshare.top/posts/2026-authelia-自建认证网关docker部署保护你的自建服务/
作者
Kshare
发布于
2026-07-04
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
站点已开启广告(类型:弹窗广告),给您带来的不便敬请谅解。如有更好的广告建议,欢迎发送邮件至 t9uzrz6u@anonaddy.me,感谢您的支持!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
187
分类
9
标签
190
总字数
490,175
运行时长
0
最后活动
0 天前

文章目录