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增强的安全配置】选项,避免有些打开浏览器的操作需要频繁弹窗,操作步骤可以参考下面图片:

image

image

image

  • 做好上面的准备工作,下面就可以搭建域控了。

image

image

image

image

image

image

image

image

点击完【安装】之后一直等着就行了。

image

功能安装完成之后点击关闭。

image

然后接着运行【部署向导】

image

因为我们创建的是一个新的域环境,所以此处选择【添加新林】

image

此处设置DSRM密码,然后点击下一步

image

image

image

image

image

接下来,点击【安装】

image

这个时候稍等一会服务器就会自动重启了。待会重新登陆的时候也会比较慢,因为涉及到派发组策略什么的,需要一定的时间。(这个时候域控就建好好了),至于域账号以及分组什么的之后搭ADFS的时候再创建。

算了还是先建个域管账号吧。打开【服务器管理器】,点击【工具】,点击【Active Directory 用户和计算机】,可以看到如下页面:

image

右键选择【新建】,选择【用户】:

image

配置账号密码等相关信息,点击下一步:

image

image

右键选择用户,选择【添加到组】,组名选择【Domain Admins】

image

可以看到使用新创建的域管已经可以登录到域控了。

image

至此,域控制器搭建完成。

0x04 如何安装ADFS服务

跟搭建域控的时候差不多,选择【添加角色或功能】,选择【下一步】

image

image

image

选择【Active Directory 联合身份验证服务】,选择【下一步】

image

image

image

image

安装成功后,点击【关闭】即可。

ADFS服务安装完成之后,还要顺便安装IIS自签名证书。

搭建IIS服务器(持续下一步,然后点击安装即可):

image

安装完成后大概长这样:

image

然后开始创建自签名证书:

image

image

image

部署ADFS服务:

image

image

这个步骤中,证书用的是之前导出来的自签名证书

image

设置一个服务账户

image

image

image

image

选择关闭,再重启下服务器。

image

0x05 如何配置ADFS服务使其支持多AWS账号登陆

  • 先下个firefox浏览器,IE太难用了。

访问这个链接:https://localhost/adfs/ls/IdpInitiatedSignOn.aspx
就可以看到ADFS的登陆页面了,报错的原因是因为我们还没有做相关配置。

image

接下来先把ADFS的metadata下载下来,一会要用到:https://localhost/FederationMetadata/2007-06/FederationMetadata.xml

在AWS IAM控制台(https://console.amazonaws.cn/iam/home?region=cn-north-1#/providers)中创建【身份提供商】,metadata就是刚刚下载到的。

image

image

接下来创建对应的role,role名称为:ADFS-Admin-Tonghua

然后回到ADFS,配置ADFS。

右键选择【ADFS】,选择【添加信赖方信任】
image

选择【启动】,然后添加AWS metadata

image

选择【下一步】

image

image

image

配置完成后,剩下的就是配置各种声明颁发策略了:

image

image

注意各种声明的格式要一一对上。

第一条规则配置完成后再继续配置第二条规则:

image

传入声明类型设置为:https://aws.amazon.com/SAML/Attributes/RoleSessionName

image

接下来配置第三条规则:

image

自定义规则的内容为:

1
2
c:[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);

image

第四条规则:

1
2
c:[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/"));

image

注意替换里头的ARN,组名前缀一类的。

保存应用即可。

然后在powershell里执行如下命令(开启ADFS的登陆页,不然会报个错误):

1
set-AdfsProperties -EnableIdPInitiatedSignonPage $true

image

再去AD中创建个组,把用户添加到组中。

image

这个的组名和AWS的role名要对应上。把用户添加到这个组里头。用户也要配置一个电子邮件,用于生产rolesessionname用,否则会报错。

image

可以看到,已经登陆成功了。

image

至于配置其他账号的,只要在对应的域下创建相应的分组、AWS账号下创建相应的身份提供商,role即可。

大概长这样:

image

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 参考链接

0x08 Timeline

  • 2019.10.08 初步完成该文章,并公开发布。