【更新:随着RAM 2.0的上线,阿里云官网提供了对SAML Federation的官方技术文档,读者可以参考:https://help.aliyun.com/document_detail/96239.html ,同时推荐用户使用RAM控制台进行配置,原企业控制台(公测)将逐步下线】
在文章合规与安全:阿里云与企业身份系统的集成中,我们介绍了阿里云与企业身份系统的集成,可以配置云账号下的子账号通过企业身份系统登陆。配置要点是
- 在阿里云目录中配置可信企业SAML IdP
- 在企业IdP中配置阿里云为可信SAML SP
其中第二点在不同的身份系统中有不同的配置方法。本文以Windows Server 2012 R2为例,介绍如何配置Microsoft AD作为阿里云的单点登录IdP。
前置条件
本文假定用户对Microsoft AD做了合理正确的配置,在Windows Server 2012 R2上配置了以下Server Role
- DNS服务器:DNS服务器用来将身份认证请求解析到正确的Federation Service上
- Active Directory域服务 (AD DS):域服务提供对域用户和域设备等对象的创建,查询和修改等功能
- Active Directory Federation Service (AD FS):Federation Service提供配置联合身份认证依赖方的功能,并对配置好的依赖方提供单点登录认证。
针对配置Active Directory的疑问,用户可以参考微软官方文档或者搜索相关的第三方博客。
示例配置
示例中用到相关配置如下
- 云账号的目录默认域名为
junpu.onaliyun.com
- 云账号下包含子用户junpu.chen,其完整的User Principal Name(UPN)为junpu.chen@junpu.onaliyun.com
- 自建Microsoft AD中的AD FS服务名称是
adserver.testdomain.com
。 - 自建Microsoft AD的域名为
testdomain.com
,NETBIOS名为testdomain
。 - 用户junpu.chen在AD中的UPN为
junpu.chen@testdomain.com
,域内登陆也可以使用testdomain\junpu.chen
在阿里云目录中配置可信外部SAML IdP
在浏览器中输入如下地址
https://adserver.testdomain.com/FederationMetadata/2007-06/FederationMetadata.xml
将元数据XML文件下载存储到本地,并按照合规与安全:阿里云与企业身份系统的集成中介绍的流程,将下载好的IdP元数据文档配置到阿里云目录中。
完成这一步之后,阿里云目录则对示例中的AD FS产生了单向信任。如果用户在阿里云子用户登陆页面输入junpu.chen@junpu.onaliyun.com,阿里云则会向AD FS发出SAML认证请求,但是AD FS此时并不信任阿里云,因此AD FS会报出如下错误
在AD FS中配置阿里云为可信SP
在Microsoft的AD FS语境中,SAML SP被称作Relying Party(依赖方,信赖方),这是因为AD FS支持OAuth/OIDC/WS-Federation,而这三个协议中的单点登录消费方都被称作Relying Party,因此AD FS在对SAML协议支持中并没有采用SAML特有的术语Service Provider,而是统一采用Relying Party来指定不同协议中的单点登录消费方。
创建阿里云作为AD FS的可信SP步骤如下
第一步:在服务器管理器中的工具
菜单中打开AD FS管理
第二步:在AD FS管理工具中添加信赖方信任
(Relying Party Trust)
第三步:为新创建的信赖方设置阿里云的SAML元数据
信赖方可以直接配置元数据的URL,或者将阿里云SAML元数据下载之后,为信赖方配置下载好的XML文件。阿里云SAML元数据的URL可以通过以下方式获取:
- 登录 RAM 控制台。
- 单击人员管理 > 设置 > 高级设置,在SSO 登录设置下可以查看当前云账号的SAML 服务提供方元数据 URL。
完成配置信赖方之后,阿里云和AD FS就产生了互信,阿里云会将junpu.onaliyun.com
目录内的用户认证请求转发到AD FS adserver.testdomain.com
上,AD FS也会接受来自于阿里云的认证请求并向阿里云转发认证响应。
接下来需要对信赖方配置SAML断言中需要颁发的属性。
为阿里云SP配置SAML断言属性
为了让阿里云能使用SAML响应定位到云目录中的子用户,我们需要SAML断言中的NameID字段取值为云目录中子用户的UPN。
配置Active Directory中的UPN为SAML断言中的NameID
在这里,微软用了Claim
(声明)这一术语来指代SAML断言中的属性。这是因为AD FS支持的其他协议(OAuth,WS-Fed等)也都使用Claim来表达Token中的字段。
第一步:为信赖方编辑声明规则
所谓声明规则
,指的是Claims Rule
,也就是SAML断言中的声明(属性)是怎样从Active Directory的用户属性中生成的。
第二步:添加颁发转换规则
所谓颁发转换规则
,指的是Issuance Transformation Rule
,指的是如何将一个已知的用户属性,经过转换之后,颁发为SAML断言中的属性。由于我们要将用户在AD中的UPN颁发为NameID,因此需要添加一个新的规则
规则的模版为转换传入声明
到这里,由于我们示例中的云账号里的UPN域名为junpu.onaliyun.com
,而AD中的UPN域名为testdomain.com
,显然如果直接将AD中的User Principal Name映射为NameID会让阿里云无法匹配到正确的子账号用户。
我们提供两个路径来填补这一空白。
路径一:在阿里云目录中验证AD域名
如果域名testdomain.com
是一个在公网DNS中注册的域名,那么用户可以在阿里云目录中验证自己对域名的所有权。进入企业控制台的人员目录
>域名设置
>创建域别名
。
验证通过之后,阿里云目录的默认域junpu.onaliyun.com
则有了一个域别名testdomain.com
。子用户junpu.chen的UPN为junpu.chen@testdomain.com。
验证域名之后的云目录则可以在域名上与自建AD DS保持一致:云目录子用户的UPN与AD中用户的UPN都使用testdomain.com
这个域名。
完成这个设置后,我们回到上面的声明转换规则编辑中,将UPN映射为NameID(名称ID)。
路径二:将AD中的User Principal Name的域名转换后颁发为NameID
如果域名testdomain.com
是企业的内网域名,那么阿里云将无法验证企业对域名的所有权。云目录就只能采用onaliyun.com
下的子域名。在这种情况下,在AD FS给阿里云颁发的SAML断言中就必须将UPN的域名后缀从testdomain.com
替换为junpu.onaliyun.com
(假定用户名一一对应)
最后
在笔者的示例中,自建ADtestdomain.com
这一域名是内网域名,通过上述路径二对断言属性进行映射之后,从自建AD的内网访问阿里云,在子账号登陆中输入junpu.chen@junpu.onaliyun.com
阿里云将认证请求转发给adserver.testdomain.com
输入AD内的用户名junpu.chen@testdomain.com
和密码之后,就完成了登陆回到阿里云控制台
常见问题
由于企业自建AD配置上可能有所不同,因此可能需要编辑略有不同的声明规则。但是最终的目标都是让SAML响应中能够返回阿里云目录可以识别的子账号UPN。
这里列出一些常见的问题
- 如果没有配置声明规则,导致SAML断言中缺失NameID字段
无法解析外部身份提供商签发的认证信息。: Unable to understand SAML response
- 如果SAML断言中的NameID域名与云目录并不一致
您的阿里云目录的外部单点登录配置无效,请联系管理员。: {"domainName":"testdomain.com"}