前言

好久没写一篇正经的教程文章了,今天来写如何让authentik对接阿里云的角色SSO,实现单点登录指定角色

本质上任何支持SAML的第三方IAM都能完成,只不过大同小异,本教程采用authentik进行示例。

本教程结合Gemini 2.5 Pro+Deep Research完成,截稿时间:2025-07-11

正文

战略价值

下面为Gemini套话,可以跳过不看

将 Authentik 作为身份提供商(IdP)与阿里云进行集成,不仅仅是技术上的对接,更是一项具有深远战略意义的举措,旨在构建一个现代化、安全且高效的身份管理体系。其核心价值主要体现在以下几个方面:

  • 集中式身份管理:将 Authentik 作为唯一的身份“真理之源”(Single Source of Truth),企业可以在一个统一的平台上管理所有用户的身份、凭证及其生命周期 。这意味着无需在阿里云 RAM 中创建和维护大量的独立 IAM 用户及其静态密码或访问密钥,极大地简化了管理复杂性。

  • 增强的安全态势:通过联合登录,用户不再需要长期有效的阿里云访问凭证。取而代之的是基于会话的、有时效性的临时安全令牌(STS Token)。这种模式消除了静态凭证泄露的风险,显著减少了攻击面,是云安全最佳实践的核心要求 。

  • 简化的用户访问流程:用户只需登录一次 Authentik 门户,即可通过单击应用图标无缝跳转至阿里云管理控制台,无需再次输入密码 。这不仅提升了用户体验,也提高了开发和运维人员的工作效率。

  • 统一的审计与合规:所有认证请求都将集中在 Authentik 进行记录和处理。这为安全审计提供了单一、全面的日志来源,有助于企业满足各类严格的合规性要求,如 SOX、PCI-DSS 等 。

登录流程

虽然也是套话,但是建议了解一下

完整的 IdP 发起流程如下:

  1. 用户发起登录(IdP-Initiated):用户首先登录到其个人 Authentik 应用仪表板,然后点击代表阿里云控制台的应用程序图标 。

  2. 生成 SAML 断言:Authentik 接收到点击事件后,会生成一个经过数字签名的 SAML 断言(SAML Assertion)。这是一个 XML 格式的文档,其中包含了用户的身份信息(如用户名或邮箱)以及一系列特殊的属性,这些属性是阿里云用来确定用户应扮演何种角色的关键 。

  3. 浏览器重定向与 POST 请求:Authentik 将包含 SAML 断言的表单返回给用户的浏览器,并通过 JavaScript 自动提交此表单。浏览器向阿里云的断言消费服务(Assertion Consumer Service, ACS)端点发送一个 HTTP POST 请求,请求体中即为 SAML 断言 。

  4. 验证断言:阿里云的 SSO 服务接收到该 POST 请求后,首先会验证 SAML 断言的数字签名。它会使用预先配置好的、来自 Authentik 的 IdP 元数据中的公钥进行验签,以确保断言的完整性和来源可信性 。

  5. 解析属性:验签成功后,SSO 服务会解析 SAML 断言的内容,重点提取两个自定义的关键属性:Role 和 RoleSessionName 。

  6. 交换 STS 令牌:SSO 服务根据 Role 属性中指定的 RAM 角色 ARN 和 IdP ARN,调用阿里云的安全令牌服务(Security Token Service, STS),代表该用户请求扮演指定的 RAM 角色 。

  7. 创建控制台会话:STS 验证请求合法性后,会颁发一个包含临时访问凭证(AccessKey ID, SecretAccessKey, 和 SecurityToken)的 STS 令牌。阿里云 SSO 服务利用这个 STS 令牌生成一个预签名的、具有时效性的控制台登录 URL 。

  8. 重定向至控制台:最后,SSO 服务将此预签名 URL 返回给浏览器,浏览器自动跳转。用户最终无缝登录到阿里云管理控制台,并拥有了所扮演角色定义的全部权限。

创建签名证书

首先创建一个证书用于给SAML断言签名(当然你也可以用Authentik默认的证书,如果打算使用默认证书就可以跳过这节)

在侧边栏找到System->Certificates,点击生成按钮

常用名自己填就行,关键是私钥算法一定要选择RSA,千万不能选择ECDSA(大坑),因为阿里云不支持ECDSA签名验证,选择ECDSA会造成NoPermission.NotTrusted

创建完成进入下一节

创建Provider

这里我们先创建Provider

在侧边栏找到Application->Providers

点击创建按钮,选择SAML Provider类型

名称:自填
授权流程:默认的两个哪个都行,explicit的需要手动确认授权,implicit为静默授权
ACS URL:为阿里云固定链接 https://signin.aliyun.com/saml-role/sso(国际站可能不同)来源:进行角色SSO时企业IdP的SAML配置_访问控制(RAM)-阿里云帮助中心
颁发者( EntityID):为阿里云固定内容:urn:alibaba:cloudcomputing,来源:进行角色SSO时企业IdP的SAML配置_访问控制(RAM)-阿里云帮助中心
服务提供程序绑定:为固定选项POST
Audience:为阿里云固定内容:urn:alibaba:cloudcomputing,来源:角色SSO的SAML响应_访问控制(RAM)-阿里云帮助中心

然后展开下面的高级协议设置,签名证书选择上一节创建的RSA证书,勾选签名断言

属性映射待会再设置

创建阿里云身份提供商

来到阿里云的访问控制RAM控制台https://ram.console.aliyun.com/

在侧边栏找到集成管理->SSO管理

选择角色SSO->SAML,选择创建身份提供商

身份提供商名称:自填,但是后面有参数会用到
元数据文档:在authentik中刚刚创建的Provider的总览里,有个元数据下载按钮,下载该xml文档然后上传即可

创建完成后点击刚刚创建的身份提供商,找到ARN信息,复制备用,下文用Idp ARN代替该值

创建阿里云角色

既然要扮演角色肯定要先创建角色

在侧边栏找到身份管理->角色

点击创建角色信任主体类型选择身份提供商

提示如果需要信任身份提供商,切换编辑器到自定义模式后配置。,点击旁边的切换编辑器

这里我们采用可视化编辑即可

效果:选择允许
主体:选择身份提供商
操作:勾选sts:AssumeRole(旁边的SetSourceIdentity不知道有什么用)
条件:用于实现更复杂的限制策略,可以自己设置(我没设置)

点击确定添加即可

然后赋予角色权限

点击刚刚添加的角色,在权限管理内新增授权,具体要什么权限自己定,然后记录ARN,后面备用,下文用角色 ARN代替

Tips:这里信任策略阿里云已经正常生成好了,不用自己填写或者修改了

创建Authentik的属性映射

这里我们需要映射RoleRoleSessionName两个属性到SAML断言中

Role:让阿里云知道是扮演哪个角色以及来自哪个身份提供商
RoleSessionName:让阿里云知道是哪个用户(IAM的用户)进行了本次扮演(登录),用来作为登录用户信息的一部分显示在控制台上和操作审计日志

在Authentik侧边栏中找到Customization->Property Mappings

选择创建,两个都是SAML Provider Property Mapping类型的

先创建Role

名称:自填
SAML 属性名称:为阿里云固定内容:https://www.aliyun.com/SAML-Role/Attributes/Role
表达式:python写

表达式这里返回的内容会出现在断言中,而该部分内容组如下:

1
角色ARN,IdpARN

简单的表达式直接返回这个内容即可,当然你可以写更复杂的表达式,具体请参考Authentik官方文档中表达式一节

1
return "角色 ARN,Idp ARN"

然后创建RoleSessionName

名称:自填
SAML 属性名称:为阿里云固定内容:https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName
表达式:python写

这里需要返回一个唯一标识用户的值,如员工ID、Email地址等,取值要求为:长度不少于2个字符且不超过64个字符,只能是英文字母、数字和特殊字符-_.@=

我采用的是用户的Email

1
return request.user.email

这里变量由Authentik提供,其他变量请看Authentik官方文档

还有个可选的SessionDuration,表示会话有效期(我懒得弄没弄)

名称:自填
SAML 属性名称:为阿里云固定内容:https://www.aliyun.com/SAML-Role/Attributes/SessionDuration
表达式:python写,同理直接return或者自己写复杂的表达式

取值要求为整数,单位为秒,最小值为900,最大值不能超过Role元素所代表的角色的最大会话时间。

有兴趣可以看看角色SSO的SAML响应_访问控制(RAM)-阿里云帮助中心

进行属性映射

回到Authentik中,找到我们之前创建的Provider,点一下进入总览,编辑一下

高级协议设置中,找到属性映射,把预置的没用属性全部移除,把刚刚创建的两个属性移到右边,保存

然后重新下载元数据,在阿里云SSO管理里更新一下元数据文档(存疑,建议还是更新一下)

创建Application(应用)

在Authentik创建一个应用

名称:自填
Slug:自填
提供程序:选择我们之前创建的Provider
剩下的看自己喜好

权限设置

默认创建的应用是所有用户都能访问的,如果不做权限控制,那么所有用户都能进你的阿里云😂

这里我们点击创建的应用,选择策略/组/用户绑定

然后点击绑定已存在的 策略/组/用户(这里推荐先创建一个组,然后把能够使用该应用的用户拉到这个组里,然后赋予这个组使用这个应用的权限,方便管理)

看自己选择是策略,组还是用户

策略的话要自己写策略,灵活性更高

Tips:默认注册流程中注册的用户是外部用户,无法进入Authentik仪表盘,可以去改一下注册流程

测试

进入Authentik主界面,点击应用,跳转到阿里云,右上角看到角色登录,即成功登录。

后记

折腾死我了,不过,Gemini 2.5Pro+Deep Research是真的好用😋