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。现在给它加门禁,流程三步:

  1. 在 Authentik 里新建一个 Provider,类型选 Proxy ProviderExternal hosthttps://nas.yourdomain.com,流选默认的 default-authentication-flow
  2. 再建一个 Application,把上面的 Provider 绑上,slug 填 nas
  3. 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 玩家安排上。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注