架构图
前期准备
- 服务器(两台):域控制器服务器,提升为域控AC;ADFS服务器
- ssl证书(如果没有可以通过ADCS创建自签)
- AWS账号
步骤
一、服务器1安装AD域控制器
具体安装步骤这里不体现了,此处只列举需要注意的项目:
- 配置静态IP地址
- 域名配置(行创建新林:域名与SSl证书符合)
二、服务器2加域
步骤就不详细赘述了,需要注意的是服务器2配置静态IP,DNS选择AD域控制
三、创建自签ssl证书
安装ADCS
服务器2中部署ADCS证书服务
(1) 打开服务器管理器,打开添加角色和功能向导
(2) 下一步
(2) 基于角色或功能安装,下一步
(3) 服务器选择,下一步
(4) 勾选AD证书服务,下一步
(5) 确认后点击安装,安装完成后,执行部署后配置程序,执行即可
(6) 打开浏览器输入http(s)://adcsIP/certsrv 验证安装如下图
(7) 在ADFS服务器打开mmc,并添加证书模块
(8) 个人-证书-所有任务-高级操作-创建自定义请求
(9)选择不使用注册策略
(9) 选择(无模板)旧密码
(10)点开详细信息-属性
(11) 填写证书属性
常规tab页:填写好友名称.
使用者tab:公用名(CN)需要填写成*.domain.com的形式.
私钥tab页:加密提供程序选择“Microsoft RSA SChannel Cryptographic Provider(加密)” .
秘钥 :秘钥大小2048
勾选是秘钥可导出
(12) 选择保存位置,完成申请,注意此文件下边有用
(13) 打开证书服务,地址一般为http(s)://adcsIP/certsrv.点击申请证书
(14)点击提交一个高级证书申请
(15)将步骤12保存的证书内容粘贴到Base-64申请框中提交
(16) 回到服务器2 工具>查找证书颁发机构>挂起的申请,通过即可
(17)回到web页面下载证书,并安装到“个人”,这样就完成了一个由ADCS颁发的通配符域证书。该证书会在后续ADFS配置过程中使用到。
四、服务器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 |
五、AWS配置
(1) 登录AWS控制台,进入IAM点击身份提供商,并创建,这里选择SAML协议,提供商名称ADFS(请保持一致),后面需要校验,文件上传ADFS下载的元数据文件federationmetadata.xml
(2) 创建完成后记录ARN
(3) 点击分配角色,创建角色名为ADFS-dev (请保持一致,后面讲解原因),权限自己选择,我这里直接给的admin权限,同样创建完成后记录ARN,信任关系显示刚刚创建的身份提供商
(4)至此AWS侧配置完毕。下面我们配置 ADFS侧建立信任关系
六、ADFS配置
(1) 登录AD域控服务器创建AD group
创建一个名为 AWS-dev 的AD group(此处与上面AWS角色ADFS-dev相映射)
创建一个名为Bob的用户
给Bob一个电子邮件地址(例如,bob@example.com)
将用户 Bob 添加到AWS-dev 的AD group
(2) 登录ADFS服务器,工具>打开ADFS管理,右键单击添加信任方信任,打开添加向导
(3) 检查有关依赖方的导入数据,键入“https://signin.aws.amazon.com/static/saml-metadata.xml“,然后单击**"下一步**"。元数据 XML 文件是一个标准的 SAML 元数据文档,将 AWS 描述为依赖方。
(4) 信任方名字可以随便修改,我这里直接默认,点击下一步,默认直至完成。
(5) 创建完成后信任方已经有了AWS,别急,右键点击编辑声明规则,并添加规则
(6) 添加四个规则 NameID、RoleSessionName、Get AD Groups、Roles
NameID (模版选择转换传入声明)
RoleSessionName (模版选择添加转换声明规则)
声明类型值:https://aws.amazon.com/SAML/Attributes/RoleSessionName
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中。
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://<your.domain>/adfs/ls/idpinitiatedsignon.htm
登录bob@example.com
八、故障排除
我们登陆时可能会出现错误代码 400、500等,可查看AWS文档排查
SAML 2.0 与 AWS 联合的问题排查 - AWS Identity and Access Management (amazon.com)