一、背景
1、什么是SAML
SAML是用于单点登录认证的通用协议,以XML格式为基础进行配置交换。负责用户认证的系统可被称为SSO平台,可以是基于Active Directory Federation Service构建,也可以是用户自行开发的统一认证平台。应用系统指的是与SSO平台对接的业务软件,例如OA、ERP、代码管理系统等软件。当使用SSO方式登录时候,应用系统本身不需要额外管理用户分组、密码、校验等,也就避免了在多个应用软件之间同步用户清单、同步用户密码的麻烦。
使用SSO是安全领域的最佳实践之一。
2、云账号管理和SSO的必要性
云的使用者在日常登录AWS控制台时候,一般是通过IAM用户名和密码登录,并通过MFA多因素认证等手段保障安全。当组织机构较大、用户较多时候,全过程需要手工管理用户添加/删除等操作、用户初始化密码、重设密码、分配MFA、锁定用户等日常管理任务相对繁重,操作不便且存在安全隐患。另外,拥有IAM用户登录权限、密码、MFA的用户也可能存在非正常授权的操作,例如违规将自己的账号交给他人代为操作等,或者密码过于简单或密码被盗造成重大安全事件。
在这种场景下,如果能使用SSO统一认证平台与AWS控制台进行对接,那么SSO平台的员工账户就可以无缝、免密钥登录到AWS控制台,并且自动获取对应权限。此时的AWS控制台,在用户内部就像一个普通OA应用一样,可以从用户内部IT系统中自动跳转过来,实现平滑的用户体验。由于大量用户管理工作都在SSO平台统一完成,由此大大改善了安全性和便利性,避免了AWS控制台的IAM用户名、密码被盗的隐患。
AWS的管理控制台(也就是通称的Console)在IAM服务的Identity Provider功能中,支持使用SAML协议与外部单点登录系统进行连接。这一功能在AWS中国区和AWS全球区域都可用。
3、SSO在多账号管理场景
除了提升安全之外,还有一种管理场景是多AWS账号管理。例如某企业有多个AWS账户,多个系统部署在不同账户,来回切换登录身份很麻烦。企业内部的用户希望能通过企业自己目录系统上唯一的用户名,以免密钥的方式随时登录到多个AWS账户。
这种时候也可以使用SSO平台,将被管理的多个AWS账号配置添加到企业自己的SSO平台,即可实现无缝登录体验和多账号管理。
4、SSO和目录服务搭配与AWS控制台做对接的几种常见方式
根据企业规模和IT系统建设水平,常见的实现AWS账号管理的方案可能有如下几种:
- (1) Active Directory(AD)作为目录服务,企业自建Single Sign On平台(SSO)作为认证个平台(一般是WEB界面)。此时如果希望单点登录到AWS控制台,参与直接对接的其实不是Active Directory,而是企业自建的SSO平台。此时配置主要方式需要参考企业自建SSO的开发文档。
- (2) Active Directory(AD)作为目录服务,微软Active Directory Federation Service(ADFS)作为认证平台。此时如果希望单点登录到AWS控制台,参与对接时候需要同时配置AD和ADFS两个组件。这种需要熟悉微软产品的专家,按照文档Step-by-step配置,技术复杂度较高。
以上(1)和(2)两种是较为常见的对接方式,核心都是依赖微软活动目录。如果企业尚未建设自己的SSO平台,或者是在学习、测试AWS的过程中,经常遇到不方便搭建SSO平台、没有可以测试用的SSO平台,造成无法模拟测试SSO单点登录的全过程。这个时候,可以使用Amazon IAM Identity Center服务(原Single Sign-On服务)作为SSO平台,来进行统一用户身份认证。IAM Identity Center服务拥有内置的用户目录,可以无需搭建额外的目录服务,就能实现用户创建、管理、映射等。由此可以扩展出如下(3)和(4)两个场景:
- (3) 使用Amazon IAM Identity Center服务内置的目录服务作为身份认证,使用IAM Identity Center内置的Access Portal作为认证平台(提供WEB界面)
- (4) 使用Amazon IAM Identity Center服务的Identity source功能借助AD Connector连接到Active Directory(AD)作为目录服务,使用IAM Identity Center内置的Access Portal作为认证平台(提供WEB界面)
以上两种场景下,承担WEB界面认证核心功能的都是Amazon IAM Identity Center服务。这一功能在AWS中国区和AWS全球区域都可用。不过(3)和(4)之间的区别是在目录服务的选择上,可通过AD Connector对接到现有Active Directory,最终实现了Active Directory中的用户可单点登录到AWS控制台。
以上四种方式的架构如下图所示。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-00.png)
本文介绍的是简单易用的场景(3)的配置过程,可在数分钟内完成配置开始使用。
二、使用IAM Identity Center作为SSO平台进行用户验证
1、借助IAM Identity Center配置和验证SSO单点登录
在整个对接过程中,两个平台分别要配置的项目如下:
平台 | 企业SSO平台 | AWS控制台 |
---|---|---|
服务 | IAM Identity Center服务 | 被管理的AWS账号(可以是同一个AWS账号也可以是其他账号) |
配置 | 添加应用Application | 配置Identity Provider |
提供 | SSO平台的SAML metadata file(本例中是IAM Identity Center SAML metadata file) | AWS Console对应的metadata file(本例中是 https://signin.aws.amazon.com/static/saml-metadata.xml),或者手工填写参数亦可 |
身份映射 | 指定映射的Role名称 | 配置IAM Role及Role的信任关系 |
本文因为是用IAM Identity Center服务作为SSO平台,因此后续第二章节将仅描述IAM Identity Center服务如何配置。
2、关闭在别的区域启用的IAM Identity Center(可选)
如果您之前没有使用过IAM Identity Center服务(原Single Sign-On服务),那么第一次使用还需要激活这个服务。这个服务是全球级别的,也就是只能在海外的某一个Region开启,开启后将全球有效(不含AWS中国区域)。
如果您之前在某个Region开启了IAM Identity Center服务,那么因为他是全球唯一的服务,您必须回到当时开启IAM Identity Center服务的Region来操作。您可以为现在已经正在使用中的IAM Identity Center服务新增对接到AWS控制台,对接不影响现有用户使用。
如果您之前开启的IAM Identity Center服务已经不再使用,上边也没有用户,那么您可以切换到这个Region,把之前配置过的IAM Identity Center服务删除(所有现有SSO用户将会丢失)。删除之后,重新来到新的Region,开启IAM Identity Center服务。删除现有的IAM Identity Center服务的方法如下。
从AWS控制台上的服务搜索框内,输入IAM
并点击IAM Identity Center
服务。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-01.png)
如果您当前Region是在另外的Region,这里会提示已经有一个Region开启了IAM Identity Center服务,可以点击链接跳转过去。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-02.png)
进入之前开启过IAM Identity Center服务的Region,从左侧菜单找到Settings
,在右侧点击Management
的标签页,从右下角可以看到Delete
删除按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-03.png)
点击删除按钮,即可完成现有IAM Identity Center服务的删除。
3、启用IAM Identity Center服务
切换到希望使用IAM Identity Center服务的Region,进入IAM Identity Center服务的控制台,在右边可以看到Enable
的启用按钮。点击启用。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-04.png)
服务启用成功。
4、添加SSO用户
进入IAM Identity Center服务的控制台,在左边找到Users
按钮,点击右侧的Add user
添加用户按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-05.png)
输入用户名,选择生成一次性密码。输入电子邮件地址。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-06.png)
下边所有选项都可以跳过。点击下一步继续。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-07.png)
分组界面可以跳过。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-08.png)
在配置向导位置,不需要修改,点击创建用户如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-09.png)
创建完毕。提示的登录网址、用户名、密码请保存好。密码仅显示一次,后续忘记需要重置。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-10.png)
至此创建用户完成。
5、测试用户登录
使用刚才创建用户的信息,来测试SSO登录。这里要打开一个新的浏览器匿名浏览窗口,否则后续配置好单点登录后,新的AWS控制台登录的Session会影响当前操作AWS Console的信息。
打开一个新的浏览器匿名浏览窗口,访问上一步的域名入口。输入用户名。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-11.png)
输入创建用户时候生成的密码。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-12.png)
界面提示是否要使用MFA。这里选择使用第一种,基于手机的软件MFA。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-13.png)
推荐的MFA包括微软的Authenticator,Google的Authenticator等,二者都可以用苹果官方AppStore下载,安卓系统也可以下载到官方版本。
点击中间的Show QR code
即可显示二维码。用MFA的App扫描这个二维码,即可注册成功。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-14.png)
注册MFA成功,继续设置。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-15.png)
首次登录成功后,要求设置新密码。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-16.png)
设置新密码完毕,界面来到用户登录成功后的首页。这里下方应用系统清单的是全空白的,等稍后配置好单点登录后,AWS控制台的链接将会显示在下边的区域。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-17.png)
至此在IAM Identity Center上创建一个新用户完成。
6、将AWS控制台作为应用添加到IAM Identity Center
进入IAM Identity Center的控制台,在左侧菜单下找到Application assignments
,点击右侧的AWS managed
的标签页,点击右上角的Add application
的按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-18.png)
在选择应用类型位置,点击I want to select an application from the catalog
即我想从应用列表中选择。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-19.png)
在页面下方可看到许多支持单点登录的应用系统。在搜索框位置,输入关键字aws
,即可筛选获得AWS控制台,名为External AWS Account
。选中后点击下一步继续。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-20.png)
在向导第二步的页面上,在Getting started
文档部分可以跳过,在应用程序名称位置,使用默认的External AWS Account
名称即可。描述位置的文字也不需要修改。向下滚动屏幕。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-21.png)
在下方IAM Identity Center metadata
的位置,有个下载按钮,点击下载获得《IAM Identity Center SAML metadata file》这个文件。这里要保存好这个文件,下一步配置将会使用。页面再往下一点还有一个下载按钮是下载证书,这里不需要下载证书可忽略。然后继续向下滚动屏幕。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-22-2.png)
在Application properties
的位置,是可选填写的,留空。在Session duration
位置,从默认的1小时修改为12小时。然后继续向下滚动屏幕。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-23.png)
在Application metadata
位置,选择左侧的手工设置Manually type your metadata values
。在Application ACS URL
位置,输入https://signin.aws.amazon.com/saml
。在Application SAML audience
位置,输入urn:amazon:webservices
。最后点击Submit按钮提交。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-24.png)
至此Application配置完成。页面提示绿色的成功信息。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-25.png)
7、将AWS控制台作为应用分配到SSO用户
这里要将SSO用户和Application绑定。进入上一步创建好的应用,点击分配用户和组的按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-26.png)
在用户界面,将上一步创建的用户demo01
关联上。这里为了简单起见,不使用组,而是只绑定到单一用户。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-27.png)
将应用和用户关联完成。
此时如果切换到刚才用匿名模式登录用户的浏览器窗口,按下刷新按钮,就可以看到这个用户名下已经出现了一个名为External AWS Account
的应用了。当然,此时点击链接是不会生效的,后续还需要配置Identity Provider。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-28.png)
8、添加配置身份映射
在IAM Identity Center上的配置还有最后一步,就是设置用户会被映射为何种身份。通过SSO登录AWS控制台时候,传递过去的不是IAM User的用户名密码,也不是传递AKSK,而是传递的IAM Role。因此这里事先配置好要将当前用户映射到AWS控制台上的哪一种Role,配置时候记录下他的完整名字,后续在IAM控制台里边还要配置。
进入上一步配置的应用界面,点击右侧的Actions
下拉框,从中选择Edit attribute mappings
菜单。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-29.png)
在Attribute mappings
位置,点击Add
按钮,添加新的一行。然后在User attribute in the application
位置输入参数https://aws.amazon.com/SAML/Attributes/Role
,在Maps to this string value or user attribute in IAM Identity Center
值的位置输入如下信息arn:aws:iam::[AccountID]:saml-provider/[IdentityProviderName],arn:aws:iam::[AccountID]:role/[RoleName]
。
在这一长串中,需要替换[AccountID]为要实现单点登录的AWS账号ID。注意如果有多个AWS账号,不是输入本AWS账号,是要对接单点登录的那个账号)。替换[IdentityProviderName]为稍后下一步要创建的SSO名称,例如取名sso
。替换[RoleName]为要分配的IAM Role的名称,例如取名admin-sso
。如下截图。记住这两个名字,一会要使用。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-30.png)
在以上配置中,我们最后使用了名为sso
的Identity Provider的名字,以及名为admin-sso
的IAM Role名字。这两个名字请完整记录下来,下个步骤将会使用。
配置完毕后点击保存按钮。至此在IAM Identity Center上的配置完成。
三、在AWS控制台上配置单点登录
1、配置Identity Provider
现在进入要实现被管理的、也就是要单点登录的AWS,进入IAM服务控制台,点击左侧Access management
菜单,点击Identity Provider。在右侧点击Add provider
按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-31.png)
在Provider type
类型位置,选择SAML
。在Provider name
名称位置,输入sso
。这里输入的名称需要与上一步在IAM Identity Center的Mapping参数的那个名称完全对应。然后在Metadata document
位置,点击Upload上传按钮,将上一步配置IAM Identity Center的Application时候,下载下来的《IAM Identity Center SAML metadata file》这个XML文件上传。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-32.png)
上传成功后,点击Add provider
按钮完成添加。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-33.png)
上传成功。
2、创建用于Identity Provider的IAM Role
上传成功后的页面,跳转回到Identity Provider的界面,页面右上角提示是否要创建IAM role。这里点击Assign role
。然后选择Create a new role
。注意这里必须选择新建,因为第一次配置Identity Provider,在现有的所有IAM Role中,都缺少信任关系,因此任何现有的Role都不能正常用于Identity Provider的SSO登录。这就是为什么这里要新创建一个Role的原因。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-34.png)
在跳转到新创建Role向导时候,Trust entity type
位置上已经自动选择了SAML 2.0 fedaration
的配置。在SAML 2.0 federation
的下拉框中,上一步创建的名为sso
的Identity Provider也被正常的加载出来。继续向下滚动页面。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-35.png)
在Access to be allowed
的位置,选择允许的授权类型是Allow programmatic and AWS Management Console access
程序方式和AWS控制台。然后点击下一步继续。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-36.png)
在给IAM Role选择权限位置,本文档为方便测试,选择AdministratorAccess
。如果是在生产账号下配置,那么这里应选择最小权限的策略,才是符合安全最佳实践。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-37.png)
在最后一个阶段,设置IAM Role的名字位置,输入上一步配置IAM Identity Center时候预先填写的映射的角色名字admin-sso
。这个名字必须与在SSO平台那边映射参数一致,否则不能正常登录。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-38.png)
至此配置Identity Provider完成。
四、登录测试
现在以单点登录用户的身份,登录到SSO平台。如果之前已经登录上,则点击浏览器刷新按钮,刷新整个界面。然后点击应用清单中的External AWS Account
。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-39.png)
可看到SSO方式登录到AWS控制台成功。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-40.png)
五、指定登录成功后的跳转页
在SAML的定义中,Relay state URL就是登录成功后的跳转页面。在前文配置IAM Identity Center的时候,添加应用向导中,有一个步骤是配置Relay state但是是可选,因此跳过没有配置。现在可以修改这个设置,加入跳转URL。
进入IAM Identity Center控制台,点击左下角的Application按钮,点击Customer managed
标签页,点击之前添加的External AWS Account
按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-41.png)
点击右上角Actions
下拉框,点击Edit configuration
修改配置。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-42.png)
在配置清单中,找到Relay state
参数,填写上要跳转的页面,例如https://ap-southeast-1.console.aws.amazon.com/ec2/
代表新加坡区域的EC2控制台。点击保存按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/IAM-SSO/sso-43.png)
再触发SSO的用户登录,即可看到登录成功后的跳专业就是新加坡区域的EC2控制台了。
六、参考文档
使用亚马逊云科技 Single Sign-On 服务对亚马逊云科技中国区域账户实现单点登录
SAML 2.0 联合身份验证
Set relay state 设置登录成功后的跳转地址
https://docs.aws.amazon.com/singlesignon/latest/userguide/howtopermrelaystate.html