前言
懒得自己编了, Gemini 这样介绍 Authentik:
简单来说,Authentik 是一款功能极其强大的开源身份验证与访问管理 (IAM) 解决方案。
如果你觉得像 Okta 或 Auth0 这种商业服务太贵,或者觉得像 Keycloak 这种传统方案配置起来太头疼,那么 Authentik 就是一个非常现代且灵活的替代品。它主要用于为你的应用、服务器和网络服务提供统一的登录入口。
本文将基于开源版的 Authentik 使用 Docker 部署, 并完成和 AWS 控制台单点登录的配置. 下面正文开始.
部署 Authentik
参考官方 Docker Compose 部署文档 在安装好 Docker 和 Docker-Compose 环境的 Ubuntu 系统中实现:
bash
# 创建存储 Authentik 数据的文件夹
mkdir authentik
cd authentik
# 下载官方的 docker-compose 配置模板
wget https://docs.goauthentik.io/compose.yml
# 生成 PostgreSQL 数据库随机密码 (保存在 .evn 环境变量配置文件中)
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
注: 国内需要给 Docker 附魔才能正常拉镜像, 参考 配置 Docker 使用代理
默认配置下, Authentik 监听端口为 9000 和 9443, 启动后访问 http://server_ip:9000 等待系统加载完成:

刷出来登陆界面就表明系统准备就绪了:

初始化 Authentik
系统就绪后, 首先访问地址 http://server_ip:9000/if/flow/initial-setup/ 进入初始化配置界面:

输入邮箱, 密码, 继续后来到用户视角的首页. 注意这里输入的邮箱和密码就是管理员账号.

点击右上角的 Admin interface 进入后台管理界面:


至此, Authentik 就准备就绪了, 下面开始配置 AWS 控制台单点登录的流程.
AWS 信任关系配置
这里使用 IAM SAML 方式进行配置, 参考文档 Integrate with Amazon Web Services (Classic IAM)
Authentik 配置
Property Mappings 配置
解释一下为啥需要做这一步, 这是因为在传递身份信息时的 SAML 断言文档里面会有大量的属性, 我们需要通过这种方式明确让 Authentik 给 AWS 传递信息的时候将符合 AWS 格式要求的 SAML 属性给带进去.
打开 Authentik 管理员界面, Customization > Property Mappings > Create

选择 SAML Provider Property Mapping

填入以下信息:
-
Name:
AWS Role Mapping(这个不要求, 也可以自己命名) -
SAML Attribute Name:
https://aws.amazon.com/SAML/Attributes/Role(注意这个属性名称在中国区 AWS 也是这样写) -
Friendly Name: 留空
-
Expression: 这个是 Python 代码, 对于固定的单个目标 AWS Role, 直接
return符合要求格式的 ARN 就行. 由于目前还没有在 AWS IAM 中创建对应的 Role 和 SAML Provider, 所以这里就直接先按格式写好名字, 后面再创建. 下面例子中我规划的 Role 名称Authentik_Role, SAML Provider 名称Authentik_providerpythonreturn "arn:aws-cn:iam::123456789012:role/Authentik_Role,arn:aws-cn:iam::123456789012:saml-provider/Authentik_provider"

重复上面相同的操作, 再创建一个新的 Property mapping:
-
Name:
AWS Role Session Name(这个不要求, 也可以自己命名) -
SAML Attribute Name:
https://aws.amazon.com/SAML/Attributes/RoleSessionName(注意这个属性名称在中国区 AWS 也是这样写) -
Friendly Name: 留空
-
Expression: 这个很简单, 直接返回
user.username就中pythonreturn user.username
至此, 我们就完成了两个 Property Mapping 的准备工作

创建 Application & Provider
继续在 Authentik 管理界面打开 Applications > Create with Provider

Application Name 填入 AWS, 下方会自动生成 Slug, 继续

Provider 选择 SAML Provider 继续

注意下面配置 Provider 时, 中国区 AWS 用特定内容:
- Name: 用自动生成的就好
- Authorization flow:
default-provider-authorization-implicit-consent (Authorize Application)
Protocol settings:
- ACS URL:
https://signin.amazonaws.cn/saml(注意中国区是 .cn) - Issuer:
authentik

Advanced protocol settings:
-
Property mappings: 把上面创建好的两个映射都选中移到 Selected User Property Mappings

-
Service Provider Binding:
Post(默认就是这个, 确认一下)

下一步 Configure Policy/User/Group Bindings 不做设置, 继续下一步完成配置.
下载 Metadata
打开 Applications > Providers > AWS, 在 Related objects 下方下载 Metadata

得到 XML 文件 Provider for AWS_authentik_meta.xml 后我们接下来就要到 AWS 控制台进行配置.
AWS IAM 配置
创建 Identity provider

类型选择 SAML, 注意 Provider name 需要和前面我们准备 Property mapping 时在 Python 代码中返回的 ARN 中名称一致, 得叫 Authentik_provider, 选择上一步下载的 Provider for AWS_authentik_meta.xml 作为 Metadata 文档上传.

创建完成后打开详情, 确认 ARN 和前面 Python 代码中写的一致:

创建 Role
Trusted entity type 选择 SAML 2.0 federation, 并选择上面创建好的 Authentik_provider, 允许的操作选择 Allow programmatic and Amazon Web Services Management Console access

勾选要赋予的权限策略下一步, 需要注意这里 Role 的名称也需要和前面我们准备 Property mapping 时在 Python 代码中返回的 ARN 中名称一致, 得叫 Authentik_Role, 完成创建.

测试
为了避免浏览器缓存影响测试, 新开一个浏览器隐私窗口, 访问 Authentik 首页, 可以看到 My applications 中出现了前面准备好的 AWS 应用:

点击图标即可跳转至 AWS 控制台, 右上角确认当前使用的联合身份为 IAM Role Authentik_Role 🎉🎉🎉

全文完.
