如何配置ADFS使域账号可以登陆多个AWS账户
0x00 前言
在这篇文章中,我将以中国区AWS为例,向大家介绍如何配置ADFS,使其可以登陆多个AWS账号,以此来简化日常多账号的身份管理及访问控制。
这篇文章的定位为对活动目录有一个简单了解的同学,当然即使不了解也没有关系。我会一步步的从域控的搭建到ADFS搭建及配置为大家介绍。
0x01 准备材料
- ami:Microsoft Windows Server 2016 Base (Chinese Simplified) - ami-0f525133ce76914c1
0x02 教程大纲
- 如何搭建域控制器
- 如何安装ADFS服务
- 如何配置ADFS服务使其支持多AWS账号登陆
- 常见的故障排查方法
0x03 如何搭建域控制器
- 先起来了一台2016的实例,完事分配了一个EIP,因为搭建各种服务器的过程中可能会涉及到重启服务器的情况,如果不使用EIP的话,IP重启后会更换,一来避免每次都要查看,二来也是避免IP更换后导致的非预期报错。
- 然后关闭服务器的【IE增强的安全配置】选项,避免有些打开浏览器的操作需要频繁弹窗,操作步骤可以参考下面图片:
- 做好上面的准备工作,下面就可以搭建域控了。
点击完【安装】之后一直等着就行了。
功能安装完成之后点击关闭。
然后接着运行【部署向导】
因为我们创建的是一个新的域环境,所以此处选择【添加新林】
此处设置DSRM密码,然后点击下一步
接下来,点击【安装】
这个时候稍等一会服务器就会自动重启了。待会重新登陆的时候也会比较慢,因为涉及到派发组策略什么的,需要一定的时间。(这个时候域控就建好好了),至于域账号以及分组什么的之后搭ADFS的时候再创建。
算了还是先建个域管账号吧。打开【服务器管理器】,点击【工具】,点击【Active Directory 用户和计算机】,可以看到如下页面:
右键选择【新建】,选择【用户】:
配置账号密码等相关信息,点击下一步:
右键选择用户,选择【添加到组】,组名选择【Domain Admins】
可以看到使用新创建的域管已经可以登录到域控了。
至此,域控制器搭建完成。
0x04 如何安装ADFS服务
跟搭建域控的时候差不多,选择【添加角色或功能】,选择【下一步】
选择【Active Directory 联合身份验证服务】,选择【下一步】
安装成功后,点击【关闭】即可。
ADFS服务安装完成之后,还要顺便安装IIS自签名证书。
搭建IIS服务器(持续下一步,然后点击安装即可):
安装完成后大概长这样:
然后开始创建自签名证书:
部署ADFS服务:
这个步骤中,证书用的是之前导出来的自签名证书
设置一个服务账户
选择关闭,再重启下服务器。
0x05 如何配置ADFS服务使其支持多AWS账号登陆
- 先下个firefox浏览器,IE太难用了。
访问这个链接:https://localhost/adfs/ls/IdpInitiatedSignOn.aspx
就可以看到ADFS的登陆页面了,报错的原因是因为我们还没有做相关配置。
接下来先把ADFS的metadata下载下来,一会要用到:https://localhost/FederationMetadata/2007-06/FederationMetadata.xml
在AWS IAM控制台(https://console.amazonaws.cn/iam/home?region=cn-north-1#/providers)中创建【身份提供商】,metadata就是刚刚下载到的。
接下来创建对应的role,role名称为:ADFS-Admin-Tonghua
然后回到ADFS,配置ADFS。
右键选择【ADFS】,选择【添加信赖方信任】
选择【启动】,然后添加AWS metadata
选择【下一步】
配置完成后,剩下的就是配置各种声明颁发策略了:
注意各种声明的格式要一一对上。
第一条规则配置完成后再继续配置第二条规则:
传入声明类型设置为:https://aws.amazon.com/SAML/Attributes/RoleSessionName
接下来配置第三条规则:
自定义规则的内容为:1
2c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> add(store = "Active Directory", types = ("http://temp/variable"), query = ";tokenGroups;{0}", param = c.Value);
第四条规则:1
2c:[Type == "http://temp/variable", Value =~ "(?i)^AWS-([\d]{12})"]
=> issue(Type = "https://aws.amazon.com/SAML/Attributes/Role", Value = RegExReplace(c.Value, "AWS-([\d]{12})-", "arn:aws-cn:iam::$1:saml-provider/AWSADFS,arn:aws-cn:iam::$1:role/"));
注意替换里头的ARN,组名前缀一类的。
保存应用即可。
然后在powershell里执行如下命令(开启ADFS的登陆页,不然会报个错误):1
set-AdfsProperties -EnableIdPInitiatedSignonPage $true
再去AD中创建个组,把用户添加到组中。
这个的组名和AWS的role名要对应上。把用户添加到这个组里头。用户也要配置一个电子邮件,用于生产rolesessionname用,否则会报错。
可以看到,已经登陆成功了。
至于配置其他账号的,只要在对应的域下创建相应的分组、AWS账号下创建相应的身份提供商,role即可。
大概长这样:
0x06 常见的故障排查方法
- 报错一
1
RoleSessionName is required in AuthnResponse (Service: AWSSecurityTokenService; Status Code: 400; Error Code: InvalidIdentityToken; Request ID: e0aa4b8e-e990-11e9-8d71-e307abd5d2b3). Please try again.
报这条错误,一般就是roles这条规则配置的有问题(比如role的arn号等,global用的aws中国区是aws-cn),抓包,base64解码对下就能看到了,还有可能是rolesessionname没设置一类的,这个就要在域账号那一端补充邮件地址。
0x07 参考链接
- AWS Federated Authentication with Active Directory Federation Services (AD FS)
- Troubleshooting SAML 2.0 Federation with AWS
- 为AWS北京区管理控制台集成ADFS访问
- Install and Configure the Web Application Proxy Server)
0x08 Timeline
- 2019.10.08 初步完成该文章,并公开发布。