一、背景
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控制台。
以上四种方式的架构如下图所示。
本文介绍的是简单易用的场景(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
服务。如下截图。
如果您当前Region是在另外的Region,这里会提示已经有一个Region开启了IAM Identity Center服务,可以点击链接跳转过去。如下截图。
进入之前开启过IAM Identity Center服务的Region,从左侧菜单找到Settings
,在右侧点击Management
的标签页,从右下角可以看到Delete
删除按钮。如下截图。
点击删除按钮,即可完成现有IAM Identity Center服务的删除。
3、启用IAM Identity Center服务
切换到希望使用IAM Identity Center服务的Region,进入IAM Identity Center服务的控制台,在右边可以看到Enable
的启用按钮。点击启用。如下截图。
服务启用成功。
4、添加SSO用户
进入IAM Identity Center服务的控制台,在左边找到Users
按钮,点击右侧的Add user
添加用户按钮。如下截图。
输入用户名,选择生成一次性密码。输入电子邮件地址。如下截图。
下边所有选项都可以跳过。点击下一步继续。如下截图。
分组界面可以跳过。如下截图。
在配置向导位置,不需要修改,点击创建用户如下截图。
创建完毕。提示的登录网址、用户名、密码请保存好。密码仅显示一次,后续忘记需要重置。如下截图。
至此创建用户完成。
5、测试用户登录
使用刚才创建用户的信息,来测试SSO登录。这里要打开一个新的浏览器匿名浏览窗口,否则后续配置好单点登录后,新的AWS控制台登录的Session会影响当前操作AWS Console的信息。
打开一个新的浏览器匿名浏览窗口,访问上一步的域名入口。输入用户名。如下截图。
输入创建用户时候生成的密码。如下截图。
界面提示是否要使用MFA。这里选择使用第一种,基于手机的软件MFA。如下截图。
推荐的MFA包括微软的Authenticator,Google的Authenticator等,二者都可以用苹果官方AppStore下载,安卓系统也可以下载到官方版本。
点击中间的Show QR code
即可显示二维码。用MFA的App扫描这个二维码,即可注册成功。如下截图。
注册MFA成功,继续设置。如下截图。
首次登录成功后,要求设置新密码。如下截图。
设置新密码完毕,界面来到用户登录成功后的首页。这里下方应用系统清单的是全空白的,等稍后配置好单点登录后,AWS控制台的链接将会显示在下边的区域。如下截图。
至此在IAM Identity Center上创建一个新用户完成。
6、将AWS控制台作为应用添加到IAM Identity Center
进入IAM Identity Center的控制台,在左侧菜单下找到Application assignments
,点击右侧的AWS managed
的标签页,点击右上角的Add application
的按钮。如下截图。
在选择应用类型位置,点击I want to select an application from the catalog
即我想从应用列表中选择。如下截图。
在页面下方可看到许多支持单点登录的应用系统。在搜索框位置,输入关键字aws
,即可筛选获得AWS控制台,名为External AWS Account
。选中后点击下一步继续。如下截图。
在向导第二步的页面上,在Getting started
文档部分可以跳过,在应用程序名称位置,使用默认的External AWS Account
名称即可。描述位置的文字也不需要修改。向下滚动屏幕。如下截图。
在下方IAM Identity Center metadata
的位置,有个下载按钮,点击下载获得《IAM Identity Center SAML metadata file》这个文件。这里要保存好这个文件,下一步配置将会使用。页面再往下一点还有一个下载按钮是下载证书,这里不需要下载证书可忽略。然后继续向下滚动屏幕。如下截图。
在Application properties
的位置,是可选填写的,留空。在Session duration
位置,从默认的1小时修改为12小时。然后继续向下滚动屏幕。如下截图。
在Application metadata
位置,选择左侧的手工设置Manually type your metadata values
。在Application ACS URL
位置,输入https://signin.aws.amazon.com/saml
。在Application SAML audience
位置,输入urn:amazon:webservices
。最后点击Submit按钮提交。如下截图。
至此Application配置完成。页面提示绿色的成功信息。
7、将AWS控制台作为应用分配到SSO用户
这里要将SSO用户和Application绑定。进入上一步创建好的应用,点击分配用户和组的按钮。如下截图。
在用户界面,将上一步创建的用户demo01
关联上。这里为了简单起见,不使用组,而是只绑定到单一用户。如下截图。
将应用和用户关联完成。
此时如果切换到刚才用匿名模式登录用户的浏览器窗口,按下刷新按钮,就可以看到这个用户名下已经出现了一个名为External AWS Account
的应用了。当然,此时点击链接是不会生效的,后续还需要配置Identity Provider。如下截图。
8、添加配置身份映射
在IAM Identity Center上的配置还有最后一步,就是设置用户会被映射为何种身份。通过SSO登录AWS控制台时候,传递过去的不是IAM User的用户名密码,也不是传递AKSK,而是传递的IAM Role。因此这里事先配置好要将当前用户映射到AWS控制台上的哪一种Role,配置时候记录下他的完整名字,后续在IAM控制台里边还要配置。
进入上一步配置的应用界面,点击右侧的Actions
下拉框,从中选择Edit attribute mappings
菜单。如下截图。
在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
。如下截图。记住这两个名字,一会要使用。
在以上配置中,我们最后使用了名为sso
的Identity Provider的名字,以及名为admin-sso
的IAM Role名字。这两个名字请完整记录下来,下个步骤将会使用。
配置完毕后点击保存按钮。至此在IAM Identity Center上的配置完成。
三、在AWS控制台上配置单点登录
1、配置Identity Provider
现在进入要实现被管理的、也就是要单点登录的AWS,进入IAM服务控制台,点击左侧Access management
菜单,点击Identity Provider。在右侧点击Add provider
按钮。如下截图。
在Provider type
类型位置,选择SAML
。在Provider name
名称位置,输入sso
。这里输入的名称需要与上一步在IAM Identity Center的Mapping参数的那个名称完全对应。然后在Metadata document
位置,点击Upload上传按钮,将上一步配置IAM Identity Center的Application时候,下载下来的《IAM Identity Center SAML metadata file》这个XML文件上传。如下截图。
上传成功后,点击Add provider
按钮完成添加。如下截图。
上传成功。
2、创建用于Identity Provider的IAM Role
上传成功后的页面,跳转回到Identity Provider的界面,页面右上角提示是否要创建IAM role。这里点击Assign role
。然后选择Create a new role
。注意这里必须选择新建,因为第一次配置Identity Provider,在现有的所有IAM Role中,都缺少信任关系,因此任何现有的Role都不能正常用于Identity Provider的SSO登录。这就是为什么这里要新创建一个Role的原因。如下截图。
在跳转到新创建Role向导时候,Trust entity type
位置上已经自动选择了SAML 2.0 fedaration
的配置。在SAML 2.0 federation
的下拉框中,上一步创建的名为sso
的Identity Provider也被正常的加载出来。继续向下滚动页面。如下截图。
在Access to be allowed
的位置,选择允许的授权类型是Allow programmatic and AWS Management Console access
程序方式和AWS控制台。然后点击下一步继续。如下截图。
在给IAM Role选择权限位置,本文档为方便测试,选择AdministratorAccess
。如果是在生产账号下配置,那么这里应选择最小权限的策略,才是符合安全最佳实践。如下截图。
在最后一个阶段,设置IAM Role的名字位置,输入上一步配置IAM Identity Center时候预先填写的映射的角色名字admin-sso
。这个名字必须与在SSO平台那边映射参数一致,否则不能正常登录。如下截图。
至此配置Identity Provider完成。
四、登录测试
现在以单点登录用户的身份,登录到SSO平台。如果之前已经登录上,则点击浏览器刷新按钮,刷新整个界面。然后点击应用清单中的External AWS Account
。如下截图。
可看到SSO方式登录到AWS控制台成功。
五、指定登录成功后的跳转页
在SAML的定义中,Relay state URL就是登录成功后的跳转页面。在前文配置IAM Identity Center的时候,添加应用向导中,有一个步骤是配置Relay state但是是可选,因此跳过没有配置。现在可以修改这个设置,加入跳转URL。
进入IAM Identity Center控制台,点击左下角的Application按钮,点击Customer managed
标签页,点击之前添加的External AWS Account
按钮。如下截图。
点击右上角Actions
下拉框,点击Edit configuration
修改配置。如下截图。
在配置清单中,找到Relay state
参数,填写上要跳转的页面,例如https://ap-southeast-1.console.aws.amazon.com/ec2/
代表新加坡区域的EC2控制台。点击保存按钮。如下截图。
再触发SSO的用户登录,即可看到登录成功后的跳专业就是新加坡区域的EC2控制台了。
六、参考文档
使用亚马逊云科技 Single Sign-On 服务对亚马逊云科技中国区域账户实现单点登录
SAML 2.0 联合身份验证
Set relay state 设置登录成功后的跳转地址
https://docs.aws.amazon.com/singlesignon/latest/userguide/howtopermrelaystate.html