ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

goauthentik/authentik部署指南:用OIDC与LDAP搭建统一登录中心

goauthentik/authentik部署指南:用OIDC与LDAP搭建统一登录中心 goauthentik / authentik 这个项目我会直接把它当成一套自建系统的统一登录入口来用。它是一个开源的、基于 Go 实现的身份认证和单点登录平台也就是常说的 IdP核心解决的是“一套账号登录多个内部应用”的问题。如果你手头有 NAS、代码仓库、监控面板、运维平台这类系统不想每个地方单独维护一套用户名密码authentik 值得先跑一遍。它最值得关注的点不是某个花哨的界面功能而是把登录、授权、MFA、LDAP 目录服务都集中到了同一个地方并且能通过标准协议和外部应用对接。下面按我从零部署到接入应用的路径把关键步骤和容易踩的坑拆开说。1. 先搞懂 goauthentik / authentik 在认证体系里的位置1.1 goauthentik 和 authentik 是什么关系项目标题里的 goauthentik 并不是某个分支版本而是 authentik 在 GitHub 上的组织和仓库名。简单说goauthentik/authentik 就是这个项目的源码仓库平时大家讨论的 authentik 产品本身也来自这里。后端选择 Go带来的直接好处是部署体量和内存占用比不少 Java 系身份认证产品轻。实际跑起来之后一个 docker-compose 项目里会同时出现多个服务包括 server、worker、PostgreSQL、Redis。server 负责对外提供 API 和页面worker 负责执行后台任务比如策略判断、流处理、凭证校验。两者共用同一个镜像只是启动命令不同。刚开始接触时不要以为“goauthentik”是一个只靠单一二进制就包打天下的工具它仍然需要依赖数据库和缓存这一点要先有预期。1.2 它适合放在什么位置authentik 在自托管体系里的定位可以概括成一句话面向应用提供认证能力面向用户提供统一登录入口。它常见的落地方式有三种作为 OIDC/OAuth2 服务端让 Grafana、GitLab、Nextcloud 这类支持标准协议的应用跳转登录。作为 LDAP 认证源给只支持 LDAP 的老系统或网络设备提供用户校验。作为反向代理认证网关在 Nginx 或 Traefik 后面统一拦截未登录请求。它和同类方案经常放在一起对比我看到的典型选择可以整理成一个表格方案部署方式协议广度配置复杂度Authelia单容器或二进制重定向认证为主较简单低Keycloak容器或独立服务OIDC、SAML高功能重authentikdocker-composeOIDC、SAML、LDAP、代理认证中等Casdoor容器或二进制OIDC 为主中等如果只是两三个应用并且只做简单登录用 Authelia 会更轻概念也更少。一旦开始考虑多协议、用户分组、MFA、审批流程、审计日志这些“组织级需求”authentik 的组件化设计才更有优势。我个人的体会是authentik 的复杂度属于“需要理解流程和策略但不需要像 Keycloak 那样配置大量领域模型”的程度。2. 部署之前环境、资源、网络策略要确定的内容2.1 我推荐的最低资源边界直接给结论我个人的最低推荐是 2 核 CPU、4G 内存、40G 以上磁盘。更低配置能不能跑能跑通但数据库连接、worker 后台任务和页面响应速度都会变差。如果只是 docker-compose 启一个学习环境1G 内存也未必起不来但我不建议拿这种配置去做真实的日常认证服务。资源占用和接入应用的数量有关。10 个以内应用的统一登录上面的配置一般够用。如果是几十个应用、每天大量登录跳转就要关注 PostgreSQL 的连接数、Redis 的缓存命中率和 worker 的任务堆积情况。我一般会先用小规模跑几天再根据内存和 CPU 曲线决定是否需要扩容。2.2 域名、反代端口和 HTTPS 策略authentik 启动后默认会同时监听 HTTP 9000 和 HTTPS 9443 两个端口。容器内部的配置是这样实际部署时我通常不会直接对外暴露这两个端口而是在前面放一层 Nginx 或 Caddy把 443 端口的请求转发到 9000。这里要提前统一一个判断标准所有回调地址、Provider 地址、应用跳转地址尽量使用同一个对外域名不要一会儿用 IP一会儿用内网域名。OIDC 对回调地址、Host 头、Scheme 非常敏感域名和端口不一致是最常见的登录失败原因。HTTPS 建议直接交给反向代理处理内部 9000 端口保持 HTTP 即可。如果反代配置不正确最常见的问题是回调地址被写成了http://127.0.0.1:9000导致登录成功后回不到应用。2.3 持久化目录和备份边界PostgreSQL 和 Redis 都涉及数据持久化。PostgreSQL 存用户、权限、Flow、Stage、Provider 这类核心数据Redis 主要存会话和缓存。Redis 丢了可以恢复PostgreSQL 丢了就等于整个认证体系重建。我部署时会把持久化目录单独拎出来比如/data/authentik/postgresql、/data/authentik/redis而不是让 Docker 默认 volume 埋在系统盘里。这样后面备份、迁移、升级时目录结构一眼就能看明白。3. 最小落地部署docker-compose 跑起来3.1 准备 .env 环境变量authentik 官方推荐用 docker-compose 部署。环境变量中最重要的是密钥和数据库配置。authentik 会把环境变量里AUTHENTIK_开头、用双下划线分隔的部分映射成配置项例如AUTHENTIK_SECRET_KEY对应全局密钥AUTHENTIK_POSTGRESQL__HOST对应 PostgreSQL 地址。生成密钥可以用这样一条命令openssl rand -base64 48把输出结果填到.env文件里。示例结构大致如下AUTHENTIK_SECRET_KEY这里填上面命令生成的一长串随机值 AUTHENTIK_POSTGRESQL__PASSWORD独立创建一个数据库密码 AUTHENTIK_REDIS__HOSTredis注意.env文件的换行和引号会影响读取不要粘贴之后随手加空格。密钥一旦生成后续升级和恢复都要使用同一个值不能随便更换。3.2 一个可参考的 docker-compose 服务结构下面这个 YAML 是演示用结构具体镜像版本和参数以官方仓库最新的 compose 文件为准services: postgresql: image: docker.io/library/postgres:16-alpine environment: POSTGRES_PASSWORD: ${AUTHENTIK_POSTGRESQL__PASSWORD} volumes: - /data/authentik/postgresql:/var/lib/postgresql/data restart: unless-stopped redis: image: docker.io/library/redis:7-alpine volumes: - /data/authentik/redis:/data restart: unless-stopped server: image: ghcr.io/goauthentik/server:latest command: server environment: AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY} AUTHENTIK_POSTGRESQL__HOST: postgresql AUTHENTIK_POSTGRESQL__PASSWORD: ${AUTHENTIK_POSTGRESQL__PASSWORD} AUTHENTIK_REDIS__HOST: redis ports: - 9000:9000 - 9443:9443 depends_on: - postgresql - redis restart: unless-stopped worker: image: ghcr.io/goauthentik/server:latest command: worker environment: AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY} AUTHENTIK_POSTGRESQL__HOST: postgresql AUTHENTIK_POSTGRESQL__PASSWORD: ${AUTHENTIK_POSTGRESQL__PASSWORD} AUTHENTIK_REDIS__HOST: redis depends_on: - postgresql - redis restart: unless-stopped实际使用时要特别注意server 和 worker 必须使用同一个镜像版本避免出现 API 和后台任务逻辑不一致的情况。3.3 启动顺序和验证先把目录和.env文件准备好然后执行docker compose up -d docker compose ps如果服务没有全部进入 running 状态不要急着配置页面先看日志docker compose logs -f server docker compose logs -f worker首次启动通常会有数据库初始化和迁移过程日志里出现大量迁移输出是正常的需要耐心等。启动完成后浏览器访问http://服务器IP:9000。如果一切正常应该能看到 authentik 的引导页面用于创建初始管理员账号如果你在环境变量里预置了 bootstrap 管理员相关的配置也会自动完成初始化。注意第一次打开时不要一上来就反复刷新。如果服务还在迁移数据库页面可能会短暂不可用等日志稳定后再试。4. 第一次真正接入应用OIDC/OAuth2 流程拆解4.1 在 authentik 里新建 Provider 和应用authentik 管理后台分为 Admin 和 User 两个入口。Admin 界面用于配置User 界面是普通用户登录后的门户。接入一个支持 OIDC 的应用要先创建 Provider。Provider 是技术服务端它定义了使用什么协议、回调地址、客户端类型。创建完成后authentik 会生成对应的 Client ID 和 Client Secret这两个值要复制给第三方应用使用。然后创建 Application。Application 是面向用户的可视化入口可以配置名称、图标、显示位置并且必须绑定一个 Provider。绑定之后用户登录门户里才会出现这个应用图标点击图标才能跳转到第三方应用。这里经常有一个理解偏差Provider 是协议层面的“服务端”Application 是展示层面的“应用入口”两者不是一回事。如果只创建 Provider 不创建 Application外部应用可能仍然能调通但用户门户里不会出现入口排查时会一头雾水。4.2 第三方应用侧要填哪些地址支持 OIDC 的应用一般需要配置这几项授权地址/application/o/authorize/Token 地址/application/o/token/用户信息地址/application/o/userinfo/回调地址必须和 Provider 里的 Redirect URI 完全一致完整 URL 由你自己的对外域名拼接而成例如https://auth.example.com/application/o/authorize/。不是所有客户端的字段名称都叫“授权地址”有的叫 Authorization Endpoint有的叫 Login URL但含义一致。常见的不兼容情况是末尾斜杠不一致。比如 Provider 里填了https://app.example.com/callback第三方应用里却写成https://app.example.com/callback/OIDC 会严格判断这两个地址不相同导致认证失败。4.3 验证登录流程的方法先用一个不影响生产的小应用验证建议流程如下未登录状态下打开第三方应用。应用跳转回 authentik 登录页。用户输入用户名密码。浏览器跳回应用应用拿到 token。应用请求用户信息并建立本地会话。整个过程中最重要的是观察浏览器 Network 面板里的 302 跳转顺序。正常情况下请求会从第三方应用跳到 authentik 的 authorize 地址再跳回应用的回调地址。如果回调地址匹配不上浏览器会直接显示“Invalid redirect URI”或类似的错误提示。提示第一次接入时先不要强制 MFA也不要隐藏注册入口先用默认登录流程跑通再逐层加策略。5. 深入 authentik 的核心概念Flow、Stage、Policy、Outpost5.1 Flow 和 Stage 是认证流程的骨架authentik 和其他简单认证工具最大的不同是它把登录逻辑拆成了 Flow 和 Stage。Flow 可以理解成一条认证流水线比如“登录流程”“注册流程”“密码找回流程”。Stage 是流水线上的一个具体环节比如“用户名密码校验”“TOTP 校验”“WebAuthn 校验”“写入 Session”。默认的登录 Flow 看起来可能只是一个登录框其实背后是由多个 Stage 组成的。自定义场景时可以插入一个新的 Stage比如在密码校验之后加一个“必须完成 MFA”的阶段。理解了这个模型很多看似复杂的需求就会变成“在哪个 Flow 的哪个位置插入什么 Stage”的问题。5.2 Policy 和 Binding 决定谁能通过Policy 是 authentik 里的判断规则。它可以绑定到 Flow、Stage、Application、Provider 上决定当前用户或当前请求是否满足继续执行的条件。常见的 Policy 有用户是否属于某个组属性是否满足表达式是否已经完成 MFA请求 IP 或浏览器信息判断Binding 指的是“把 Policy 绑定到某个对象”的动作。比如你要实现“只允许运维组访问 Grafana”可以在 Application 绑定一个用户组策略效果比在 Provider 里写死更灵活。Provider 只管协议Application 管访问控制后面换协议时不需要重写权限。5.3 Outpost 是连接外部代理认证的组件Outpost 是 authentik 用来管理某些外部服务连接的组件使用代理 Provider 时需要部署。它的作用大致是作为反向代理认证的后端接收请求检查 authentik 的会话状态没有登录就跳转登录页登录后放行并把用户信息传给后端应用。学习阶段可以先不碰 Outpost。先通过 OIDC 接入一两个应用理解 Flow 和 Policy 之后再去看代理认证会更顺。否则上来就部署 Outpost概念叠加在一起出了问题很难定位是 Outpost 连不上 authentik还是反代配置转发错地址。6. 扩展能力MFA、LDAP、反向代理认证6.1 MFA 的强制和测试方式authentik 支持 TOTP 验证码、WebAuthn 通行密钥、DUO 等。我的建议是先以 TOTP 或 WebAuthn 为主因为它们不需要额外的第三方服务。配置 MFA 的路径通常可以这样理解在登录 Flow 里加入 MFA Stage并通过 Policy 判断“用户是否已经绑定 MFA 设备”。如果用户没绑定先跳转注册 MFA 的阶段如果已绑定直接验证即可。关键点是不要一上来就把 MFA 设为全局强制。先在一个测试用户身上验证完整流程确认用户绑定、登录、解绑都正常再逐步放开策略。否则批量用户登录时才发现设备绑定失败会造成大面积登录卡顿。6.2 LDAP Provider 适合哪些场景LDAP 适合那些不支持 OIDC/SAML 的应用比如一些旧系统只允许配置 LDAP 地址和 bind 账号。authentik 提供 LDAP Provider 后会生成一个对外的 LDAP 地址和端口外部应用可以通过它读取用户目录和校验密码。使用 LDAP Provider 时需要把 base DN、bind DN、密码这些信息填到外部应用里。这里要提前纠正一个预期authentik 的 LDAP 主要用于用户认证和基础目录查询不是完整的企业 AD复杂目录同步、Exchange 集成这类功能不要过度期待。它能把 authentik 的用户带到支持 LDAP 的应用里但目录数据结构相对简洁。6.3 反向代理认证接入思路反向代理认证适合的场景是应用不支持 OIDC/SAML但可以通过统一网关转发。部署方式大致是创建一个 Proxy Provider填写你要保护的外部域名再部署 outpost由 outpost 监听一个本地端口反向代理把需要保护的路径转发到 outpost由 outpost 判断会话。认证成功之后后端应用会从请求头里读到 authentik 写入的用户信息例如用户名、邮箱、组。使用这个模式时要注意反代必须把原始 Host 头和用户请求 IP 透传给 outpost否则 Cookie 校验和会话识别可能失败。7. 排查链路启动失败、登录回跳、回调报错的定位顺序7.1 容器起不来先看数据库和 Redis遇到容器起不来不要先怀疑 authentik 本身先按这个顺序查docker compose ps看哪些服务是 restarting。docker compose logs postgresql看数据库是否正常启动。docker compose logs redis看缓存是否正常。docker compose logs server看 authentik 的报错信息。最常见的问题是 PostgreSQL 密码不一致。比如.env里的AUTHENTIK_POSTGRESQL__PASSWORD和 compose 文件中POSTGRES_PASSWORD取值不一致导致 server 连接数据库失败。另一个常见问题是AUTHENTIK_SECRET_KEY为空或在迁移后更换了所有签名和加密信息都会失效。这里我遇到过最多的情况是容器一直 restarting日志里提示数据库连接被拒绝。改完密码统一之后启动就正常了和 authentik 本身的镜像没有任何关系。7.2 登录后回不到应用回调地址和 Host 头优先登录后回不到第三方应用90% 是回调地址不一致。检查三个位置authentik Provider 里的 Redirect URI。第三方应用里配置的 Redirect URI。浏览器网络请求里实际跳转的 redirect_uri 参数。三个必须完全一致包括协议、域名、端口、路径、末尾斜杠。另外一种情况是反向代理没有保留 Host 头。Nginx 中至少要设置proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr;如果 Host 头不对OIDC 的 issuer 和回调拼接就会出错表现是页面能打开但跳转后报错或循环重定向。7.3 页面能进但没有用户或权限不对登录页面能正常打开但用户登录后看不到应用或者访问应用被拒绝优先检查授权逻辑。用户是通过注册流程创建的还是通过 LDAP 同步的。用户是否绑定了正确的组。Application 上绑定了哪些 Policy是否限制了用户组。注册流程是否默认禁用或要求审批。这类问题通常不会出现在 server 日志里而会出现在 worker 日志中。可以执行docker compose logs -f workerworker 负责执行策略和流程阶段权限判断失败时往往能在里面看到对应错误。7.4 会话失效和 Cookie 设置使用 HTTPS 反代时Cookie 的 Secure 属性会影响浏览器是否发送 Cookie。如果反代配置了 HTTPS但 authentik 认为自己运行在 HTTP 环境可能不会设置 Secure Cookie浏览器端行为会变得奇怪。处理办法是确保反代正确传递X-Forwarded-Proto并且在浏览器开发者工具里查看Set-Cookie和后续请求的Cookie头确认域名、路径、Secure 属性都符合预期。8. 生产化之前务必确认的几个边界8.1 版本固定和升级顺序学习环境可以直接使用 latest 镜像但生产环境不建议长期跟随 latest。每次升级都可能导致数据迁移不固定的版本会让环境难以重现。我建议的升级顺序是备份 PostgreSQL。记录当前版本号。查看官方升级说明确认有没有特殊的迁移步骤。修改镜像版本标签。执行docker compose up -d。观察 server 和 worker 日志。用测试账号完成一次完整登录。升级完成后不要马上把旧版本镜像删掉保留一份备用确认运行几天没问题再清理。8.2 备份策略要覆盖数据库和密钥备份 authentik最核心的是备份 PostgreSQL 数据库。可以用pg_dump导出也可以直接快照数据库目录。Redis 数据是缓存和会话丢失后用户会重新登录一般不作为关键备份对象。比数据库更隐蔽的是.env里的密钥。AUTHENTIK_SECRET_KEY如果丢失或更换所有基于签名的 token、会话、授权码都会失效。恢复旧数据库时必须使用旧的密钥否则业务无法衔接。备份时可以把.env单独保存到安全位置不要写进博客或仓库明文。8.3 什么时候不建议上 authentik如果你的场景只有两三个内部系统并且所有系统都只是简单登录直接上 authentik 会有一种“杀鸡用牛刀”的感觉。Flow、Stage、Application、Policy 这些概念需要学习成本维护也需要额外精力。这种情况下使用更轻量的单容器认证转发工具能把问题更快解决。反过来如果团队已经有很多应用协议需求混杂还需要分组授权、MFA、统一审计这时 authentik 的组件化设计才会真正体现出价值。它的复杂度不是无意义的只是要把配置成本和长期收益一起评估。我自己的体会是先跑通默认 Flow再考虑 MFA 和 LDAP先接一个 OIDC 应用再想批量接入。踩过几次之后我发现很多问题不是 authentik 能力不够而是前置环境、域名、回调地址和密钥没有处理干净。只要把这些基础项盯住这套系统能稳定承担整个内部应用体系的登录入口。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表