使用开源 Authentik 实现 AWS 单点登录

前言

懒得自己编了, Gemini 这样介绍 Authentik:

简单来说,Authentik 是一款功能极其强大的开源身份验证与访问管理 (IAM) 解决方案。

如果你觉得像 Okta 或 Auth0 这种商业服务太贵,或者觉得像 Keycloak 这种传统方案配置起来太头疼,那么 Authentik 就是一个非常现代且灵活的替代品。它主要用于为你的应用、服务器和网络服务提供统一的登录入口。

官网: https://goauthentik.io/

本文将基于开源版的 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 监听端口为 90009443, 启动后访问 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_provider

    python 复制代码
    return "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 就中

    python 复制代码
    return 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 🎉🎉🎉

全文完.

相关推荐
zhojiew8 小时前
关于AWS Direct Connect with Transit Gateway和Direct Connect Gateway
云计算·gateway·aws
观测云8 小时前
AWS DevOps Agent 接入观测云最佳实践
aws·devops·可观测性·观测云
亚马逊云开发者3 天前
试了 8 种方式全失败后,我用双通道架构把 Kiro CLI 变成了 REST API
aws
亚马逊云开发者3 天前
两个 AI Agent 互相调用是什么体验?Kiro + OpenClaw 双协议实战,架构评审从 2 天干到 15 分钟
aws
亚马逊云开发者4 天前
更新个监控 Agent 要协调 200 个团队?Amazon ECS 托管守护进程终于把平台工程师从苦海里捞出来了
aws
亚马逊云开发者4 天前
5 个 Agent 协同处理金融业务,我用 Kiro + AgentCore 半天就部署上线了
aws
亚马逊云开发者4 天前
我把 Claude Code 的 Token 费砍了 70%,只用了 SageMaker + 一个路由 Hook
aws
阿杜杜不是阿木木4 天前
authentik开源身份认证与管理平台-与 Grafana 集成(12)
grafana·authentik
圣殿骑士-Khtangc4 天前
Amazon CodeWhisperer 超详细使用教程:AWS 云原生 AI 编程助手上手指南
人工智能·ai编程·aws·编程助手·codewhisperer
翼龙云_cloud5 天前
亚马逊云代理商:如何在 AWS Lightsail 上一键部署 OpenClaw 私有化 AI 助手?
人工智能·云计算·aws·openclaw