Authentik 统一登录实战:给家里一堆自建服务装一把总门禁
Authentik 统一登录实战:给家里一堆…
Authentik 统一登录实战:给家里一堆自建服务装一把”总门禁”
前几期我们聊了 Caddy 反向代理、Tailscale 组网、frp 内网穿透,核心就一句话:把藏在家里的服务安全地”放”出去。但放出去之后呢?你会发现一个尴尬的事实——每个服务都有自己的登录页,密码记一堆,家人用起来抓狂,而且这些五花八门的登录页,很多连个像样的两步验证都没有。
今天就把这个坑填上。我们用 Authentik 给所有自建服务套一层统一的身份认证(SSO),一个账号进所有门,还能强制开启 TOTP 两步验证。它和 Keycloak 是一类东西,但对个人和家庭场景更友好:Docker 一条命令起,界面干净,自带反向代理专用 Outpost,跟 Caddy 简直是天作之合。
先说清楚 Authentik 是干嘛的
Authentik 本质是一个”守门人”。你的真实服务(比如 NAS、监控、网盘)躲在它后面,用户访问时先被 Authentik 拦截,登录、验完两步验证,再由它放行。好处有三:密码集中管理、所有服务统一开 2FA、支持一堆协议(OAuth2、SAML、LDAP、Proxy)。对我们来说最常用的是”Forward Auth”——由反向代理在转发请求前先问一句 Authentik:”这人验过了吗?”
它有三层配置,第一次接触会懵,我一句话讲清:
- Flow(流程):决定用户怎么登录,输密码、刷指纹、还是扫码。
- Provider(提供方):决定 Authentik 以什么方式守护服务,比如”代理模式”。
- Application(应用):把某个服务和某个 Provider 绑起来,生成访问入口。
部署:一个 Compose 搞定
Authentik 由一个 server、一个 worker,加一个 PostgreSQL 和一个 Redis 组成。把这四个塞进一个 docker-compose.yml 即可:
services:
postgres:
image: docker.io/library/postgres:16-alpine
environment:
POSTGRES_DB: authentik
POSTGRES_USER: authentik
POSTGRES_PASSWORD: 换成强密码
volumes:
- ./pg:/var/lib/postgresql/data
redis:
image: docker.io/library/redis:alpine
server:
image: ghcr.io/goauthentik/server:2024.8
command: server
environment:
AUTHENTIK_SECRET_KEY: "openssl rand -base64 48 生成一串"
AUTHENTIK_ERROR_REPORTING__ENABLED: "false"
AUTHENTIK_POSTGRESQL__HOST: postgres
AUTHENTIK_POSTGRESQL__PASSWORD: 换成强密码
AUTHENTIK_REDIS__HOST: redis
ports:
- "9000:9000"
depends_on: [postgres, redis]
worker:
image: ghcr.io/goauthentik/server:2024.8
command: worker
environment:
AUTHENTIK_SECRET_KEY: "同上面一致"
AUTHENTIK_POSTGRESQL__HOST: postgres
AUTHENTIK_POSTGRESQL__PASSWORD: 换成强密码
AUTHENTIK_REDIS__HOST: redis
depends_on: [postgres, redis]
起来之后有两件必做:先跑数据库迁移,再创建管理员账号。
docker compose up -d
docker compose exec server ak migrate
docker compose exec server ak create_admin_user \
--email you@example.com --username admin
跑完 create_admin_user 它会让你输入密码。然后浏览器开 http://你的IP:9000 就能进管理后台了。别急着配应用,先把”站内”的基础设置过一遍:系统设置里把外部地址改成你将来真正访问用的域名,比如 https://auth.yourdomain.com。
跟 Caddy 联动:一个服务一个应用
假设你已经用 Caddy 反代了某个服务 https://nas.yourdomain.com。现在给它加门禁,流程三步:
- 在 Authentik 里新建一个 Provider,类型选
Proxy Provider,External host填https://nas.yourdomain.com,流选默认的default-authentication-flow。 - 再建一个 Application,把上面的 Provider 绑上,slug 填
nas。 - Provider 详情页里有个
Embedded Outpost,点开把里面那段 Caddy 片段复制出来。
Caddyfile 里长这样:
nas.yourdomain.com {
# 先问 Authentik,通过了再放行
forward_auth authentik:9000 {
uri /outpost.goauthentik.io/auth/caddy
copy_headers Authorization X-Authentik-Username X-Authentik-Groups
trusted_proxies 0.0.0.0/0
}
reverse_proxy nas:8080
}
这里有一个几乎人人都会踩的坑:Provider 的 External host 一定要填外网能解析的完整 URL(带 https),不能填 localhost 或内网 IP,否则登录完会被重定向回一个浏览器根本打不开的地址,表现为”登录成功但一直转圈”。Authentik 默认不信任自签证书,走 http 内网直连反而最省事。
最后一步:强制开两步验证
这步强烈建议做。在 Flows 里找到 default-authentication-flow,进入阶段编辑,在密码验证后面拖入一个 Authenticator Validation 阶段。这样所有走默认流的应用,登录时都会被要求输 TOTP 验证码。手机装个 Authy 或 Google Authenticator,进 Authentik 个人设置里扫码绑定即可。WebAuthn(硬件密钥/指纹)也原生支持,有的话一并加上。
折腾下来你会发现,最值钱的不是”方便”,而是”心里踏实”:以前每个服务一个弱密码裸奔,现在一个账号 + 一次两步验证全部罩住,家人手机上也能一键登录。这套组合——Caddy 反代 + Authentik 统一认证,基本就是个人自建服务的标配了,值得每个 Homelab 玩家安排上。
