ADFS单点登录AWS控制台

架构图

jiagou

前期准备

  1. 服务器(两台):域控制器服务器,提升为域控AC;ADFS服务器
  2. ssl证书(如果没有可以通过ADCS创建自签)
  3. AWS账号

步骤

一、服务器1安装AD域控制器

具体安装步骤这里不体现了,此处只列举需要注意的项目:

  1. 配置静态IP地址
  2. 域名配置(行创建新林:域名与SSl证书符合)

二、服务器2加域

​ 步骤就不详细赘述了,需要注意的是服务器2配置静态IP,DNS选择AD域控制

三、创建自签ssl证书

  1. 安装ADCS

    服务器2中部署ADCS证书服务

    (1) 打开服务器管理器,打开添加角色和功能向导

    img

    (2) 下一步

    (2) 基于角色或功能安装,下一步

    (3) 服务器选择,下一步

    (4) 勾选AD证书服务,下一步

    https://res.cloudinary.com/heitaoq/image/upload/v1622000285/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/5_p4gzrf.png

    https://res.cloudinary.com/heitaoq/image/upload/v1622000286/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/7_svvzno.png

    https://res.cloudinary.com/heitaoq/image/upload/v1622000286/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/9_bkhdlg.png

    (5) 确认后点击安装,安装完成后,执行部署后配置程序,执行即可

    (6) 打开浏览器输入http(s)://adcsIP/certsrv 验证安装如下图

    https://res.cloudinary.com/heitaoq/image/upload/v1622010936/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/WeChat70067f41c8563c98274a31649f0bfd18_i8p1ri.png

    (7) 在ADFS服务器打开mmc,并添加证书模块

    (8) 个人-证书-所有任务-高级操作-创建自定义请求

    https://res.cloudinary.com/heitaoq/image/upload/v1622011689/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/10_xol6hb.png

    (9)选择不使用注册策略

    https://res.cloudinary.com/heitaoq/image/upload/v1622012375/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/11_ialin6.png

    (9) 选择(无模板)旧密码

    https://res.cloudinary.com/heitaoq/image/upload/v1622012524/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/12_zbm9hk.png

    (10)点开详细信息-属性

    https://res.cloudinary.com/heitaoq/image/upload/v1622012764/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/13_ypikrz.png

    (11) 填写证书属性

    ​ 常规tab页:填写好友名称.

    ​ 使用者tab:公用名(CN)需要填写成*.domain.com的形式.

    ​ 私钥tab页:加密提供程序选择“Microsoft RSA SChannel Cryptographic Provider(加密)” .

    ​ 秘钥 :秘钥大小2048

    ​ 勾选是秘钥可导出

    https://res.cloudinary.com/heitaoq/image/upload/v1622012998/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/14_mdvcdz.png

    https://res.cloudinary.com/heitaoq/image/upload/v1622013331/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/15_qomvvy.png

    (12) 选择保存位置,完成申请,注意此文件下边有用

    (13) 打开证书服务,地址一般为http(s)://adcsIP/certsrv.点击申请证书

    https://res.cloudinary.com/heitaoq/image/upload/v1622010936/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/WeChat70067f41c8563c98274a31649f0bfd18_i8p1ri.png

    (14)点击提交一个高级证书申请

    https://res.cloudinary.com/heitaoq/image/upload/v1622013576/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/16_ce02ae.png

    (15)将步骤12保存的证书内容粘贴到Base-64申请框中提交

    https://res.cloudinary.com/heitaoq/image/upload/v1622013875/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/17_qs3njb.png

    (16) 回到服务器2 工具>查找证书颁发机构>挂起的申请,通过即可

    https://res.cloudinary.com/heitaoq/image/upload/v1622014245/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/18_xtcvly.png

    (17)回到web页面下载证书,并安装到“个人”,这样就完成了一个由ADCS颁发的通配符域证书。该证书会在后续ADFS配置过程中使用到。

    https://res.cloudinary.com/heitaoq/image/upload/v1622014424/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adcs/19_c60wi5.png

四、服务器2部署ADFS

​ (1) 部署过程就不在此赘述了,此处说明下注意事项

- 需要提前创建服务账户;
- ssl证书选择我们创建的证书 ,联合身份验证服务名称:即为域名,我设置的是sts.domain.com;
- 数据库使用内置创建;

​ (2) 验证:有两种方法可以验证

  • 打开浏览器窗口,在地址栏中键入联合身份验证服务名称,然后,在该名称的后面附加 federationmetadata/2007-06/federationmetadata.xml,以下载到、联合身份验证服务元数据终结点。例如(此元数据文件需保存,后面AWS配置需要):
1
    https://sts.domain.com/federationmetadata/2007-06/federationmetadata.xml
  • 也可以浏览到 AD FS 登录页(联合身份验证服务名称后接 adfs/ls/idpinitiatedsignon.htm)。例如:
1
    https://sts.domain.com/adfs/ls/idpinitiatedsignon.htm

https://res.cloudinary.com/heitaoq/image/upload/v1622015704/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/20_ia1fs3.png

五、AWS配置

(1) 登录AWS控制台,进入IAM点击身份提供商,并创建,这里选择SAML协议,提供商名称ADFS(请保持一致),后面需要校验,文件上传ADFS下载的元数据文件federationmetadata.xml

https://res.cloudinary.com/heitaoq/image/upload/v1622016264/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/21_clbwrt.png

(2) 创建完成后记录ARN

https://res.cloudinary.com/heitaoq/image/upload/v1622016881/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/22_flwdhu.png

(3) 点击分配角色,创建角色名为ADFS-dev (请保持一致,后面讲解原因),权限自己选择,我这里直接给的admin权限,同样创建完成后记录ARN,信任关系显示刚刚创建的身份提供商

https://res.cloudinary.com/heitaoq/image/upload/v1622017918/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/23_unf005.png

(4)至此AWS侧配置完毕。下面我们配置 ADFS侧建立信任关系

六、ADFS配置

(1) 登录AD域控服务器创建AD group

  1. 创建一个名为 AWS-dev 的AD group(此处与上面AWS角色ADFS-dev相映射)

  2. 创建一个名为Bob的用户

  3. 给Bob一个电子邮件地址(例如,bob@example.com

  4. 将用户 Bob 添加到AWS-dev 的AD group

(2) 登录ADFS服务器,工具>打开ADFS管理,右键单击添加信任方信任,打开添加向导

https://res.cloudinary.com/heitaoq/image/upload/v1622018907/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/24_mq9ac8.png

(3) 检查有关依赖方的导入数据,键入“https://signin.aws.amazon.com/static/saml-metadata.xml“,然后单击**"下一步**"。元数据 XML 文件是一个标准的 SAML 元数据文档,将 AWS 描述为依赖方。

https://res.cloudinary.com/heitaoq/image/upload/v1622019289/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/25_hty7rh.png

(4) 信任方名字可以随便修改,我这里直接默认,点击下一步,默认直至完成。

https://res.cloudinary.com/heitaoq/image/upload/v1622019415/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/26_jg14fe.png

(5) 创建完成后信任方已经有了AWS,别急,右键点击编辑声明规则,并添加规则

https://res.cloudinary.com/heitaoq/image/upload/v1622019664/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/27_byfb06.png

(6) 添加四个规则 NameID、RoleSessionName、Get AD Groups、Roles

  • NameID (模版选择转换传入声明)

    https://res.cloudinary.com/heitaoq/image/upload/v1622022529/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/28_rea88l.png

  • RoleSessionName (模版选择添加转换声明规则)

    声明类型值:https://aws.amazon.com/SAML/Attributes/RoleSessionName

    https://res.cloudinary.com/heitaoq/image/upload/v1622023140/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/29_xevrxz.png

  • Get AD Groups(模版选择使用自定义规则发送声明)

    1
    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);

    说明 这个规则获取用户在AD中所属组的信息,保存在中间变量http://temp/variable中。

    https://res.cloudinary.com/heitaoq/image/upload/v1622023449/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/30_ag4na8.png

  • Roles(模版选择使用自定义规则发送声明)

    1
    c:[Type == "http://temp/variable", Value =~ "(?i)^AWS-"] => issue(Type = "https://aws.amazon.com/SAML/Attributes/Role", Value = RegExReplace(c.Value, "AWS-", "arn:aws:iam::123456789012:saml-provider/ADFS,arn:aws:iam::123456789012:role/ADFS-"));

    说明 根据这个规则,如果用户所属的AD组中包含AWS-,则将生成一个SAML属性,映射到AWS上的角色ADFS-。“arn:aws:iam::* *”需要替换成自己的 SAML提供商的 ARN,承担角色的 ARN。

    https://res.cloudinary.com/heitaoq/image/upload/v1622080678/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/31_iovmpk.png

七、完成

​ 登录https://<your.domain>/adfs/ls/idpinitiatedsignon.htm

​ 登录bob@example.com

https://res.cloudinary.com/heitaoq/image/upload/v1622015704/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/20_ia1fs3.png

https://res.cloudinary.com/heitaoq/image/upload/v1622081222/aws/%E8%81%94%E5%90%88%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/adfs/32_lrig4s.png

八、故障排除

​ 我们登陆时可能会出现错误代码 400、500等,可查看AWS文档排查

SAML 2.0 与 AWS 联合的问题排查 - AWS Identity and Access Management (amazon.com)