authentik 开源身份认证平台:SSO、Flow 编排与 Outpost 架构深度解析

authentik 应用仪表盘

当你管理超过三个需要登录的内部服务时,统一身份认证就有了硬性需求。每个应用各搞一套用户数据库,密码策略不一致,MFA 支持参差不齐,离职员工账号散落在十几个系统里没法统一清理。authentik 就是为解决这个问题而生的开源身份提供商(Identity Provider,IdP),在 GitHub 上积累了超过 24,000 颗 Star,近期日增接近 500 颗。

authentik 是什么

authentik 是一个用 Python/Django 构建的开源身份提供商和单点登录(SSO)平台。它把多个应用的认证流程收拢到一个中心化服务中,用户只需在一个地方登录,就能访问所有接入的应用。

它的核心定位是 Okta、Azure Entra ID、Auth0 这类商业 IdP 的自托管替代方案。许可证方面,社区版采用 MIT 协议,企业版额外提供 SLA 支持、企业级 SSO 源、FIPS 合规等功能。

协议支持矩阵

authentik 的协议覆盖面是其主要竞争力之一:

协议用途典型场景
OAuth2 / OIDC现代 Web 和移动应用认证SaaS 应用、API 网关、自研系统
SAML 2.0企业级联合认证Salesforce、Workday 等 SaaS
LDAP目录服务集成传统应用、邮件服务器
RADIUS网络设备认证Wi-Fi 认证、交换机 802.1X
SCIM自动用户配置跨系统用户同步
WS-FederationWindows 应用联合认证ADFS 集成
SSF共享信号框架实时安全事件通知

authentik 的 OIDC 实现通过了 OpenID 认证(OpenID Certified),这意味着它通过了 OpenID 基金会的合规性测试套件,不是自说自话的"兼容"。

核心架构:单体加 Outpost

authentik 的架构设计走了一条务实的路线:主体是单体应用,但为特定协议设计了独立的 Outpost 微服务。

单体服务器

authentik 服务器本身是一个 Django 应用,包含管理界面、用户门户、认证流程引擎、API 后端。它依赖两个外部组件:

  • PostgreSQL:存储用户、组、应用、策略、令牌等所有配置数据
  • Redis:消息队列(Celery)和缓存层

认证流程的核心抽象是 Flows 和 Stages。一个 Flow 是一次完整的认证过程(比如登录、注册、密码重置),由多个 Stage 串联而成。每个 Stage 代表一个验证步骤:输入用户名密码、TOTP 验证、WebAuthn 确认、条件策略检查等。管理员可以可视化地编排这些 Flow,定义不同的认证路径。

Outpost 微服务

Outpost 是 authentik 架构中有意思的部分。它把四种协议的执行从主服务器中拆分出来,用 Go 语言独立实现:

Proxy Outpost:为不支持原生认证协议的应用提供反向代理认证。当 NGINX、Traefik 或 Caddy 收到请求时,Outpost 检查用户的认证状态。如果未登录,重定向到 authentik 登录页面;已登录则放行,可选地把用户信息注入 HTTP Header 传给后端应用。

LDAP Outpost:LDAP 是二进制协议,直接在 Django/Python 里处理不自然。Go 生态有成熟的 LDAP 库(go-ldap),Outpost 用 Go 监听 LDAP 请求,转发给 authentik 服务器验证。启用缓存后,频繁的 LDAP 查询可以命中 Outpost 本地内存,减少到服务器的往返。

RADIUS Outpost:RADIUS 用于 Wi-Fi 认证和网络设备接入。这个协议本身安全性有限,把 Outpost 部署在靠近接入点(AP)或交换机的位置,可以缩短 RADIUS 流量的传输路径,其余验证事务走 HTTPS 回到 authentik 服务器。

RAC Outpost:远程访问控制器,基于 Apache Guacamole 实现 RDP、SSH、VNC 的远程连接。Outpost 内运行 guacd 进程处理协议转换,用户通过浏览器就能远程操作服务器,不需要 VPN 客户端。

这个设计的好处是 Outpost 可以部署在任何需要的地方。如果你的组织总部在欧洲,但在美国有办公点需要 LDAP 认证,在美国部署 LDAP Outpost 并开启缓存,就能避免每次认证都跨大西洋往返。

部署:Docker Compose 快速起步

authentik 的最小部署要求是 2 核 CPU 和 2GB 内存。官方推荐三种部署方式:

Docker Compose(测试和小规模生产)

bash
# 下载官方 compose 文件
curl -O https://docs.goauthentik.io/compose.yml

# 生成 PostgreSQL 密码和 secret key
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env

# 拉取镜像并启动
docker compose pull
docker compose up -d

启动后访问 http://<服务器IP>:9000,系统会提示设置 akadmin 用户的初始密码。compose 文件默认挂载 Docker socket 到 worker 容器,用于自动管理 Outpost 容器。如果担心安全风险,可以移除这个挂载改为手动管理 Outpost,或者使用 Docker Socket Proxy 做权限隔离。

Kubernetes(大规模部署)

官方维护 Helm Chart(github.com/goauthentik/helm),适合需要横向扩展和高可用的大规模部署。authentik 还提供了 Terraform Provider(github.com/goauthentik/terraform-provider-authentik),支持基础设施即代码管理。

其他选项

AWS CloudFormation 模板和 DigitalOcean Marketplace 一键部署也在官方支持列表中。所有部署方式共享同一套配置模型,从 Docker Compose 迁移到 Kubernetes 不需要重写配置。

安全特性

authentik 在安全方面的功能覆盖面值得关注:

多因素认证(MFA):支持 TOTP、WebAuthn/Passkey(硬件和软件)、SMS 和邮件验证。MFA 可以与 Flow 结合,按应用、用户组或条件策略差异化配置。

条件访问策略:管理员可以编写 Python 表达式策略,检查用户属性、组归属、时间窗口、IP 地址等条件。例如"只允许管理员组在工作时间从公司 IP 访问管理后台"。

GeoIP 与异常行程检测:根据登录请求的地理位置和用户的历史行程模式,自动标记可疑登录。如果用户 5 分钟前在中国登录,现在从美国尝试登录,系统会触发异常行程告警。

账户锁定(Account Lockdown):一键应急按钮,立即停用账户、清除密码、终止所有会话、撤销令牌。在账户泄露场景下快速止损。

设备合规检查:通过 Fleet(mTLS 证书)和 Google Chrome Device Trust 连接器检查设备安全态势,不满足条件的设备被拒绝访问。

审计日志:字段级别的变更追踪,满足合规审计需求。所有用户操作、管理员变更、认证事件都被记录。

authentik vs Keycloak vs Authelia

自托管 IdP 领域有三个主流选择,它们适合的场景差异明显:

维度authentikKeycloakAuthelia
技术栈Python/Django + GoJava/QuarkusGo
内存需求~2GB~1GB+(JVM 开销大)极低
协议支持OIDC/SAML/LDAP/RADIUS/SCIM/ProxyOIDC/SAML/LDAP(更成熟)OIDC/Forward Auth
管理界面现代 Web UI功能全面但复杂无完整管理 UI
Flow 可视化编排支持,高度可定制支持,配置复杂不支持
Proxy Provider内置,三模式需额外配置核心功能
社区规模~24k Star~24k Star~21k Star
企业支持authentik Security 公司Red Hat

Authelia 最轻量,适合 Homelab 和个人项目。它的核心是 Forward Auth 网关,部署快、资源占用少,但不具备完整的 IdP 功能和可视化管理界面。当你只需要在反向代理后面加一层认证时,Authelia 是最低成本的选择。

Keycloak 是 Red Hat 支持的企业级方案,协议实现成熟度最高,深度集成 Active Directory 和复杂 LDAP 目录。代价是 JVM 带来的资源开销和运维复杂度。大型企业、金融机构、医疗系统如果已经在 Red Hat 生态中,Keycloak 是稳妥选择。

authentik 在两者之间找到了平衡点。它的 UI 比 Keycloak 现代直观,Flow 编排系统让自定义认证流程变得可视化,Proxy Provider 解决了大量不支持原生认证协议的老应用接入问题。需要的资源比 Authelia 多(必须 PostgreSQL + Redis),但远低于 Keycloak 的运维复杂度。适合从 Homelab 升级、中小团队、需要 Proxy 认证和灵活 Flow 的场景。

选择建议可以简化为一个判断:五人以内的 Homelab 选 Authelia;大型企业深度绑 AD 的选 Keycloak;中间地带选 authentik。

实际接入:以 Grafana 为例

authentik 接入应用的方式取决于应用支持的协议。以常见的 Grafana 监控面板为例,通过 OIDC 接入:

  1. 在 authentik 管理界面创建一个 OAuth2/OpenID Provider,填写重定向 URI(https://grafana.example.com/login/generic_oauth
  2. 创建一个 Application,绑定上一步的 Provider
  3. 在 Grafana 配置文件中添加 OAuth 认证:
ini
[auth.generic_oauth]
enabled = true
client_id = <authentik 提供的 Client ID>
client_secret = <authentik 提供的 Client Secret>
auth_url = https://auth.example.com/application/o/authorize/
token_url = https://auth.example.com/application/o/token/
api_url = https://auth.example.com/application/o/userinfo/
  1. 配置 authentik 的 Property Mapping,把 authentik 中的组和角色映射为 Grafana 能识别的 claim

对于不支持任何认证协议的老旧应用(比如旧的 PHP 系统或静态站点),用 Proxy Provider 的 Forward Auth 模式。Traefik 或 NGINX 收到请求后先咨询 authentik Outpost,未认证的请求被重定向到 authentik 登录页,认证通过后带着 Cookie 回来,Outpost 验证 Cookie 并放行。

版本与许可

authentik 采用半年发布周期,当前稳定版为 2026.5,下一个版本已在预发布阶段。社区版(MIT 许可)包含完整的 IdP 功能:SSO、MFA、Flow 编排、Proxy Provider、LDAP/RADIUS/SCIM 支持。企业版额外提供 FIPS 合规、企业 SSO 源(与现有企业目录深度集成)、RAC 远程访问增强功能以及商业 SLA 支持。

项目由 Authentik Security Inc.(一家公共利益公司)维护,代码完全开源,社区贡献通过 GitHub 和 Discord 协调。这意味着即使不购买企业版,社区版的功能也足以覆盖绝大多数中小型组织的身份管理需求。