Authelia 日常运维手册
Authelia v4.39.28 运维实操:日常巡检、日志与 401/403 分层排障、SQLite 备份恢复、版本升级演练、封禁解封与会话失效处置,全部附真实回显
Authelia 日常运维手册
目标:为已上线的 Authelia v4.39.28 提供一份可照着敲的运维手册,覆盖日常巡检、日志排障、数据备份与恢复、版本升级、会话与安全事件处置(封禁/失效/401/403)、常见故障定位。已在 Ubuntu 22.04 实测通过(运维动作均在《Authelia Docker Compose 部署指南》环境完成并附真实回显)。
一、环境信息
- 操作系统:Ubuntu 22.04;部署形态:Docker Compose 三服务(Authelia + Nginx 反代 + 演示后端)
- Authelia:v4.39.28;配置目录:
/opt/authelia/authelia/data/(容器内/config) - 编排目录:
/opt/authelia/(compose.yml+.env密钥文件) - 存储后端:SQLite(
/config/db.sqlite3);会话后端:内存(默认);通知:filesystem - 演示账号:
admin/q1w2e3r4;域名家族:authelia.example.com:9091、app.example.com:8098 - 专用网络:
authnet(10.89.23.0/24) - 环境基准与参数含义见《Authelia 4.39 配置参数详解》,本篇只讲「怎么运维」
二、前置条件
- 熟悉部署篇的目录结构与端到端验证四步链路(本篇排障反复用到);
- 服务器上
sqlite3命令可用(备份/封禁处置需要); - 具备
docker compose操作权限与配置文件编辑权限。
三、日常巡检
建议每天(或接入监控后自动化)执行的三条巡检:
cd /opt/authelia
# 1) 三服务状态与 healthy
docker compose ps
实测回显:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
authelia-v4-app authelia/authelia:4.39.28 "/app/entrypoint.sh" authelia About an hour ago Up 30 minutes (healthy) 0.0.0.0:9091->9091/tcp, [::]:9091->9091/tcp
authelia-v4-demo nginx:alpine "/docker-entrypoint.…" demo About an hour ago Up 30 minutes 80/tcp
authelia-v4-nginx nginx:1.27-alpine "/docker-entrypoint.…" nginx About an hour ago Up 28 minutes 80/tcp, 0.0.0.0:8098->8098/tcp, [::]:8098->8098/tcp
# 2) 存活探针
curl -sk https://127.0.0.1:9091/api/health; echo
实测回显:
{"status":"OK"}
# 3) 认证错误趋势(近 24h 失败次数)
sqlite3 /opt/authelia/authelia/data/db.sqlite3 \
"SELECT COUNT(*) FROM authentication_logs WHERE successful=0 AND time > datetime('now','-1 day');"
实测回显:
4
巡检解读:healthy + health OK 说明双探针(编排 healthcheck 与应用自检)都过;失败认证计数用于发现爆破企图——持续走高的失败数应结合第五章的封禁排查处置。三服务中 demo 仅是演示载体,生产环境替换为真实后端后,巡检对象相应调整。
四、日志与排障
4.1 日志级别与动态观察
日常用 info 排障临时切 debug(configuration.yml 的 log.level,改完重启生效):
docker logs -f --tail 50 authelia-v4-app
debug 级别的实测输出(节选,含配置加载与认证尝试明细):
time="2026-10-18T07:45:21Z" level=debug msg="Loaded Configuration Sources" files="[/config/configuration.yml]" filters="[]"
time="2026-10-18T07:45:21Z" level=debug msg="Process user information" gid=0 name=root uid=0 username=root
time="2026-10-18T07:45:29Z" level=debug msg="Mark 1FA authentication attempt made by user 'admin'" method=POST path=/api/firstfactor remote_ip=10.89.23.1
⚠️ 注意:debug 会输出更多上下文(含用户名、来源 IP),长期开启既费盘又有泄露风险,排障完毕记得改回 info 并重启(本篇实测即如此操作)。
4.2 认证日志的数据库视角
结构化认证流水在 SQLite 的 authentication_logs 表,比日志更适合统计:
sqlite3 /opt/authelia/authelia/data/db.sqlite3 \
"SELECT datetime(time,'localtime') AS t,username,successful,remote_ip FROM authentication_logs ORDER BY time DESC LIMIT 5;"
实测回显:
2026-10-18 15:45:29|admin|1|10.89.23.1
2026-10-18 15:40:05|admin|1|10.89.23.1
2026-10-18 15:39:53|admin|1|10.89.23.1
2026-10-18 15:17:40|admin|0|10.89.23.1
2026-10-18 15:17:40|admin|0|10.89.23.1
回显解读:successful=1 成功、0 失败;remote_ip 是请求来源(经反代后为代理侧地址,本环境为 docker 网关 10.89.23.1——生产应配置反代传递真实 IP 并按官方文档让 Authelia 信任代理头,否则封禁与审计都指向代理而非真实客户端)。
4.3 典型故障:401 的分层定位
用户报「登录不上/一直跳登录页」时,按链路逐层复现(四步命令与预期回显见部署篇 4.11):
| 层 | 检查点 | 命令 | 正常表现 |
|---|---|---|---|
| 1. 服务层 | Authelia 活着 | /api/health | {"status":"OK"} |
| 2. 校验层 | verify 对有效 cookie | /api/verify + Cookie + X-Original-URL | 200 + Remote-User |
| 3. 策略层 | access_control 规则 | 同上改 X-Original-URL 为目标域 | one_factor 会话访问 one_factor 规则域应为 200 |
| 4. 反代层 | auth_request 转发 | 未登录 curl 目标应用 | 302 且 Location 带 ?rd= |
实测案例(每层真实回显):
- 层 2 失败——会话真的失效了(见 4.4):
HTTP/1.1 401 Unauthorized
- 层 3 失败——会话级别低于规则要求(如 one_factor 会话撞上 two_factor 规则,配置篇 5.7 实测):
401(verify)/ 302(跳补二因子)
- 层 4 失败——反代没把认证子请求转发出去,浏览器直接看到
502或 Authelia 的 403:
(nginx error log)connect() failed (111: Connection refused) while connecting to upstream
处理:docker compose exec nginx nginx -t 校验反代语法后 docker compose restart nginx;确认 proxy_pass https://authelia:9091 与服务名一致(服务间用服务名解析,不是 127.0.0.1)。
4.4 会话失效与时钟问题
内存会话随重启失效(本方案会话后端为内存,实测对照组):
# 重启前有效会话
curl -sk -o /dev/null -w '%{http_code}\n' https://127.0.0.1:9091/api/verify \
-H 'Cookie: authelia_session=IOgngIb^q4GpY…' -H 'X-Original-URL: https://app.example.com:8098/'
200
docker compose restart authelia && sleep 8
# 重启后同一 cookie
curl -sk -i https://127.0.0.1:9091/api/verify \
-H 'Cookie: authelia_session=IOgngIb^q4GpY…' -H 'X-Original-URL: https://app.example.com:8098/' | head -1
HTTP/1.1 401 Unauthorized
结论:每次重启 Authelia,所有登录用户都要重新登录(内存会话的固有代价)。运维窗口应选低峰;不希望失效就按配置篇 5.5 迁移 session.redis。
篡改/无效 cookie 被签名校验拒绝(实测把 cookie 首字符改掉):
HTTP/1.1 401 Unauthorized
出现大量此类 401 时,通常是 SESSION_SECRET 被更换或负载均衡各实例密钥不一致——排查 .env 与所有实例的环境变量。
时钟漂移与 NTP 警告:本环境启动日志持续出现(实测原文):
time="2026-10-18T07:15:18Z" level=warning msg="Could not determine the clock offset due to an error" error="error occurred reading ntp packet response to the connection: read udp 10.89.23.4:44577->162.159.200.1:123: i/o timeout"
影响与处置:该警告表示无法校验时钟偏移;时钟漂移会直接破坏 TOTP(±30s 窗口)与 token 时效判断。内网环境把 ntp.address 指向内部 NTP 源,或由宿主机 chrony 保证时间同步后关闭 Authelia 内建校验(ntp.disable_startup_check: true)。验证宿主机时间同步状态用 timedatectl status(观察 System clock synchronized: yes)。
五、安全事件处置
5.1 登录封禁(regulation)的确认与解封
配置篇 5.8 已完整实测封禁行为(3 次失败即封 5 分钟、封禁期正确密码也 401、记录持久化)。运维侧的处置流程:
# 1) 确认封禁记录(谁被封、何时解封)
sqlite3 /opt/authelia/authelia/data/db.sqlite3 'SELECT * FROM banned_user;'
实测回显:
1|2026-10-18 07:17:40|2026-10-18 07:22:40.353693774+00:00||0|admin|regulation|Exceeding Maximum Retries
# 2) 误封(如办公出口 IP 被同事连累)→ 立即解封
sqlite3 /opt/authelia/authelia/data/db.sqlite3 'DELETE FROM banned_user;'
# 3) 验证解封后可正常登录(实测 HTTP 200 + {"status":"OK"...})
真实攻击场景不要急着解封:先看 remote_ip 是否为外网扫描源,调大 ban_time、必要时在反代/防火墙层直接封 IP。IP 维度封禁在 banned_ip 表,处置方式相同。
5.2 密码重置
文件用户后端没有自助改密入口,运维改密的标准动作:
# 生成新哈希(以重置 admin 密码为例)
docker run --rm authelia/authelia:4.39.28 authelia crypto hash generate argon2 --password 'new-password-here'
实测回显(重置回 q1w2e3r4 的哈希,节选):
Digest: $argon2id$v=19$m=65536,t=3,p=4$COvCyJXZxaXzM4RRCMyEJQ$/CtM5BKqBlXD6Txbey1wQwPiz+CwbcSYjRxh811kG10
把 users.yml 中该用户的 password 替换为新哈希,docker compose restart authelia 生效;完成后按部署篇 4.11 第二步实测验证新密码可登录。门户的「忘记密码」流程(邮件重置链接)依赖 notifier 与 identity_validation.reset_password.jwt_secret,生产配置 SMTP 后即可启用。
六、备份与恢复
6.1 备份什么
| 对象 | 路径 | 说明 |
|---|---|---|
| SQLite 数据库 | /opt/authelia/authelia/data/db.sqlite3 | 唯一的运行时状态(认证流水、2FA 绑定、封禁、OIDC 会话) |
| 存储加密密钥 | .env 的 STORAGE_ENCRYPTION_KEY | 与数据库绑定,分开存放即白备份 |
| 配置与用户库 | configuration.yml、users.yml | 建议进 Git/配置管理 |
| TLS 证书 | certs/、authelia/data/certs/ | 可重新签发,建议仍纳入备份 |
6.2 冷备份实操
SQLite 在 Authelia 写入时直接 cp 有截断风险,标准做法是先停服再拷(窗口期秒级):
cd /opt/authelia
docker compose stop authelia
cp authelia/data/db.sqlite3 backup/db-backup-$(date +%Y%m%d).sqlite3
docker compose start authelia
ls -lh backup/
实测回显:
total 304K
-rw-r--r-- 1 root root 304K 10月 18 15:44 db-backup-20261018.sqlite3
备份后校验完整性(对原库执行):
sqlite3 /opt/authelia/authelia/data/db.sqlite3 'PRAGMA integrity_check;'
实测回显:
ok
6.3 恢复实操(实测)
cd /opt/authelia
docker compose stop authelia
rm authelia/data/db.sqlite3 # 只删库文件,配置/用户库/证书不动
cp backup/db-backup-20261018.sqlite3 authelia/data/db.sqlite3
docker compose start authelia
sleep 8 && docker compose ps --format '{{.Name}} {{.Status}}'
实测回显:
authelia-v4-app Up 9 seconds (healthy)
数据完整性验证(备份时刻的认证流水应完整回来):
sqlite3 /opt/authelia/authelia/data/db.sqlite3 'SELECT COUNT(*) FROM authentication_logs;'
curl -sk https://127.0.0.1:9091/api/health; echo
实测回显:
11
{"status":"OK"}
💡 说明:恢复演练做到「库文件可替换、启动 healthy、行数对得上」即为有效;若备份来自更换过 STORAGE_ENCRYPTION_KEY 的环境,恢复时必须用备份当时的密钥,否则 2FA 设备等加密列解不开。
七、版本升级
7.1 升级原则与检查项
- 先看 Release Notes:https://github.com/authelia/authelia/releases 逐条读目标版本的 breaking changes(4.38/4.39 就有多处键名破坏性变化,清单见配置篇 Q2);
- 先备份:按第六章完成备份再动手;
- 补丁版本(4.39.x)间升级:schema 兼容,直接换版本号;特性版本(4.38→4.39)升级:先在测试环境过一遍;
- 配置先校验:用
authelia validate-config(配置篇 3.1,有实测回显)确认新版本兼容现有配置。
7.2 升级实操(实测:4.39.27 → 4.39.28 演练)
cd /opt/authelia
# 1) 备份(见第六章)
docker compose stop authelia && cp authelia/data/db.sqlite3 backup/db-pre-upgrade.sqlite3 && docker compose start authelia
# 2) 拉取新镜像
docker pull authelia/authelia:4.39.28
实测回显:
Status: Downloaded newer image for authelia/authelia:4.39.28
# 3) 修改 compose.yml 中的镜像 tag 后重建
sed -i 's/authelia\/authelia:4.39.27/authelia\/authelia:4.39.28/' compose.yml
docker compose up -d authelia
实测回显:
Container authelia-v4-app Started
# 4) 版本确认与状态检查
docker exec authelia-v4-app authelia --version
docker compose ps --format '{{.Name}} {{.Status}}'
docker logs authelia-v4-app 2>&1 | grep -E 'schema|complete|error|fatal' | tail -3
实测回显(本次实测经 4.39.27↔4.39.28 双向演练,结果一致):
authelia version v4.39.28
authelia-v4-app Up 8 seconds (healthy)
time="2026-10-18T07:44:49Z" level=info msg="Storage schema is being checked for updates"
time="2026-10-18T07:44:49Z" level=info msg="Storage schema is already up to date"
time="2026-10-18T07:45:54Z" level=info msg="Startup complete"
Storage schema is already up to date 说明 schema 无变化(4.39 补丁版本间兼容);若出现 Storage schema migration from X to Y is being attempted,务必等日志出现 migration is complete 再做业务验证,中途强行回滚会留下半迁移状态。
# 5) 业务回归:四步链路(部署篇 4.11)+ health
curl -sk https://127.0.0.1:9091/api/health; echo
{"status":"OK"}
回滚:sed 把镜像 tag 改回旧版本 → docker compose up -d → 恢复升级前备份的数据库(若 schema 发生了向上迁移则不能直接回滚旧版本,需按官方降级指引处理)。本篇实测 4.39.28→4.39.27 回退、4.39.27→4.39.28 再升级均正常(healthy + schema up to date)。
八、常用命令速查
cd /opt/authelia
# —— 状态 ——
docker compose ps # 三服务与健康值
curl -sk https://127.0.0.1:9091/api/health # 应用存活
docker logs -f --tail 50 authelia-v4-app # 跟日志
# —— 配置变更 ——
vim authelia/data/configuration.yml # 或 users.yml
docker compose restart authelia # 全部配置改动都需要重启生效
# —— 备份恢复 ——
docker compose stop authelia && cp authelia/data/db.sqlite3 backup/db-$(date +%Y%m%d).sqlite3 && docker compose start authelia
sqlite3 authelia/data/db.sqlite3 'PRAGMA integrity_check;'
# —— 安全事件 ——
sqlite3 authelia/data/db.sqlite3 'SELECT * FROM banned_user;' # 查封禁
sqlite3 authelia/data/db.sqlite3 'DELETE FROM banned_user;' # 解封
# —— 升级 ——
docker pull authelia/authelia:<新版本>
# 改 compose.yml 的 image tag 后:
docker compose up -d authelia
# —— 反代 ——
docker compose exec nginx nginx -t # 反代配置语法校验
docker compose restart nginx
九、常见问题
Q1:每次重启 Authelia 用户都要重新登录,正常吗?
内存会话后端的固有行为(4.4 有实测对照组:同一 cookie 重启前 200、重启后 401)。两种改善路径:① 迁移 session.redis(配置篇 5.5),重启后登录态保留;② 升降级窗口选低峰期并在公告里预告。迁移 Redis 前注意 OIDC 等功能对会话后端的要求(见选型篇架构章节)。
Q2:日志里 read udp ...:123: i/o timeout 一直在刷。
Authelia 启动时向默认 NTP 源(time.cloudflare.com)校验时钟,出不了网 UDP 123 的环境就会持续告警(4.4 有实测原文)。处置:ntp.address 改内网 NTP,或宿主机已由 chrony 同步后设 ntp.disable_startup_check: true。不要放着不管——时钟漂移会让 TOTP 用户集体「验证码错误」。
Q3:/api/state 返回 403,但用户登录功能正常。
域名校验问题:/api/state 要求 Host 与 session.cookies[].domain 匹配,用 IP 直连就会 403(部署篇 Q5/Q6 有实测与解法,--resolve 用配置域名访问即可)。登录走门户域名正常说明服务本身没问题。
Q4:用户被封禁了,怎么快速处理?
第五章 5.1 的三步:查 banned_user → 确认是否误封 → 删记录解封(实测删除后立即恢复登录)。若反复触发,把失败来源 IP 与 4.2 的认证流水对齐,判断是爆破攻击还是规则太严(regulation 三参数调整见配置篇 5.8)。
Q5:升级后起不来,日志报 configuration key not expected。
新版本删了你还在用的旧配置键(4.38→4.39 的清单见配置篇 Q2)。先用 authelia validate-config 列出全部问题,逐项改成新键名再启动。这也是 7.1 要求「先校验再升级」的原因。
Q6:备份恢复后部分功能异常(如 2FA 报错)。
典型原因是「备份的数据库」与「现用的加密密钥」不配套——db.sqlite3 里的敏感列是用备份当时的 STORAGE_ENCRYPTION_KEY 加密的。恢复时成对还原(6.1 的绑定关系),或接受 2FA 设备需重新注册。
十、参考链接
- 官方升级/版本政策:https://www.authelia.com/overview/prologue/versioning/
- 官方安全公告页:https://www.authelia.com/security/
- 会话后端(Redis 迁移):https://www.authelia.com/configuration/session/introduction/
- regulation 配置:https://www.authelia.com/configuration/security/regulation/
- 命令行参考(validate-config / crypto hash):https://www.authelia.com/reference/cli/authelia/
- 本专栏部署篇(环境基准):https://www.quzuo.net/document/4M5uT6x7qTCW
- 本专栏配置篇(参数依据):https://www.quzuo.net/document/HBDKsIfwSQVd
- 本专栏选型篇:https://www.quzuo.net/document/ao7cgAvGtzVB