亚马逊AWS官方博客

使用 SAML 和 Keycloak 建立 AWS SSO 登录 Console

使用SAML和Keycloak建立AWS SSO登录Console

Keycloak是RedHat开源的广泛使用的用户身份管理与授权解决方案,支持多种 SSO协议,包括:SAML,OpenID和OAuth2等。在大型组织中,为众多用户提供单点登录SSO机制,将会大大简化用户的身份与授权管理和应用登录过程,实施对组织用户的安全有效管理。
本文使用搭建的Keycloak服务器,演示如何与中国区域AWS集成以实现Keycloak 用户可以登录AWS Console管理控制台。

1. 启动一台EC2服务,需要打开和设置安全组:TCP:8443,SSH:22

2.  在 EC2上下载并安装Keycloak

a.  安装 JDK v1.8

 

 

b. 下载Keycloak,解压

unzip keycloak-11.0.2.zip

c. 启动Keycloak,并建立Admin用户keyadmin。

cd keycloak-11.0.2
sudo bin/standalone.sh -b 0.0.0.0 &
./add-user-keycloak.sh -r master -u keyadmin -p <yourpassword> 

d. 重启 Keycloak,以便新建立的管理用户生效
3. 从 AWS 下载saml-mate.xml,https://signin.amazonaws.cn/static/saml-metadata.xml
4. 登录Keycloak admin console,建立一个新的realm

5. 在新的realm下, 通过上面从AWS下载的saml-meta.xml,导入建立新的 client



6. 在client建立最后一步,点击Save后,将跳转到Client设置页面,只需填入两个参数:
a. IDP initiated SSO URL Name : amazon-aws-cn
b. Base URL : 当填写完上一个IDP 参数后,下面会出现SSO URL 地址,只需要拷贝这个URL的 path 部分到这个Base URL即可
c. 点击 Save

7. 继续在Client设置页面,进入到Roles Tab,建立AWS相关角色
a. 角色名称为:arn:aws-cn:iam::01234567890:role/xxin-admin,arn:aws-cn:iam::01234567890:saml-provider/keycloak
b. 角色名称以逗号分割为两部分,第一部分为AWS Role的Arn,这个 Role 将在后面步骤中建立;第二部分为IAM IDP的 Arn,keycloak 是名字,将在后面步骤中建立。


8. 继续在Client设置页面,进入到Scope Tab, 将Full Scope Allowed设置成OFF

9. 从Keycloak导出IDP Provider文件,以便在AWS IAM中建立IDP。由于高版本的Keycloak不支持在GUI管理界面中直接导出AWS IAM所要求的文件格式,可以用URL方式导出。替换下面<>中的值为实际值。

wget https://<keycloak-hostname>:8443/auth/realms/<realms-name>/protocol/saml/descriptor --no-check-certificate -O keycloak-idp.xml

10. 登录AWS IAM,用上一步导出的keycloak-idp.xml建立 IDP。

11. 在AWS,建立用户登录的角色Role,名字要跟步骤7中,在keycloak 的 client配置时指定的相同,如:xxin-admin,并赋予相应的去policy,如 admin权限。步骤如下:
a. 在 IAM 中,建立Role,信任实体选择SAML 2.0 Federation,SAML Provider选择上一步建立的keycloak,选择可以登录management console

b. 下一步:赋予AdministroatorAccess Polocy。

c. 在步骤Review:Role 名字确保与之前在keycloak的client设置中填写的role名字相同。最终如下:

12. 登录keycloak,建立用户和用户组。
a. 建立用户 xinxin

b. 在用户的Credentials Tab,修改用户密码,点击Set Password

c. 从左边面板,点击 Groups,User Groups -》 New,建立用户组 aws-admins

d. 修改 Group:aws-admins 的 client Roles,在Group中,编辑 aws-admins,在Role Mappings Tab,Client Roles 下拉列表中,选择:urn:amazon:webservices:cn-north-1后,在下面 Available Roles 中选择步骤7中建立的角色,点击:Add selected,使之生效,如下:

e. 将用户加入组:aws-admins,从左侧面板进入Users页面,在 Group Tab,将用户加入aws-admins组。

13. 编辑Clients,增加Mappers,因为 AWS 要求 keycloak 发出的 xml 断言,必须要包含如下两个属性。(注意:中国区 docs.amazonaws.cn 中描述的两个 XML 属性 Name 错误,应该使用的与国际 Region 的相同,这个也可以查看从中国区域AWS 下载(步骤3)https://signin.amazonaws.cn/static/saml-metadata.xml 文件中的必须属性描述部分。

 <AttributeConsumingService index="1">
      <ServiceName xml:lang="en">AWS Management Console Single Sign-On</ServiceName>
      <RequestedAttribute isRequired="true" Name="https://aws.amazon.com/SAML/Attributes/Role" FriendlyName="RoleEntitlement"/>
      <RequestedAttribute isRequired="true" Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName" FriendlyName="RoleSessionName"/>
...
      <RequestedAttribute isRequired="false" Name="urn:oid:2.5.4.3" FriendlyName="cn"/>
    </AttributeConsumingService>

 

a) 添加 Role 属性:
Name: Role
M    apper Type: Role list
Role attribute name: https://aws.amazon.com/SAML/Attributes/Role

b) 添加 Role Session属性:
Name: Role Session
Mapper Type: User Property
Property: username
Role attribute name: https://aws.amazon.com/SAML/Attributes/RoleSessionName

14. 登录测试。从左边面板进入Clients,点击client ID:urn:amazon:webservices:cn-north-1的Base URL,浏览器将打开一个新的登录窗口,输入用户名(如:xinxin)和密码,登录后,将重定向到 AWS Console 页面,可以在页面上面用户下拉菜单看到联合登录的信息和角色。


本篇作者

信欣

AWS解决方案架构师,目前负责基于AWS云计算方案架构的咨询和设计。在加入AWS之前曾就职于IBM,有超过十年的 HPC 产品研发和架构设计经验。