使用开源 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 🎉🎉🎉

全文完.

相关推荐
不老刘13 小时前
一次一密临时票据:医疗跨系统SSO的安全设计方案
安全·sso
yyuuuzz2 天前
谷歌云使用的几个常见注意事项
运维·服务器·网络·安全·web安全·云计算·aws
zhojiew2 天前
在AWS中国区的EMR集群中实现基于向量语义搜索的HBase运维诊断系统
运维·hbase·aws
yyuuuzz2 天前
独立开发者线上服务运维的几点实践经验
运维·服务器·网络·云计算·aws
zhojiew3 天前
使用DBT(data build tool)集成AWS Athena完成数据处理的实践
云计算·aws
yyuuuzz4 天前
aws的核心概念与常见使用场景
运维·服务器·网络·云计算·aws
zhojiew4 天前
在AWS云上使用EC2 嵌套虚拟化实例部署Cube Sandbox的实践和问题
云计算·aws
yyuuuzz6 天前
国际云服务器的技术特点与使用经验
运维·服务器·网络·数据库·云计算·aws
我是小邵6 天前
从 Supabase 迁移到 AWS 的云架构演进实践
架构·云计算·aws
炸裂狸花猫7 天前
开源身份认证与访问管理平台 - Keycloak(三)公有云Console集成实践(AWS / 阿里云 / OCI)
阿里云·云原生·keycloak·aws·oci·sso