資安

企业身份管理实战—RAM角色单点登录(SSO)

默认标题_公众号封面首图_2019-11-27-0.png

作者 | 李智源 阿里云开放平台高级技术专家,主要负责阿里云企业级身份管理,致力于提供云上集中式、易集成、安全、合规的企业级身份认证和管理服务。

引言

在上篇文章《企业身份管理--RAM用户SSO(单点登录)实战》中,我们介绍了企业账号到阿里云RAM账号SSO的原理和实战:企业员工在自己的员工系统认证完成后,可以通过SAML协议,按照自定的映射规则,通过浏览器免登到云端控制台。本文将介绍另外一种SSO方式:基于RAM角色的SSO。通过角色扮演的方式,访问云端控制台。

背景

使用基于RAM用户的SSO到云端的控制台,企业管理员可以方便的实现本地员工身份认证到云端账号认证的打通。企业的身份管理员需要:

  • 在云端创建、管理用户;
  • 配置好员工和云端用户的映射关系或映射规则。

开启基于RAM用户的SSO后,企业员工不能再使用云端用户名和密码登录。可以将认证收口在企业本地IDP,认证收口后,可以通过本地IDP和云端的登录页面两个入口发起到本地IDP的认证请求。

在实际的企业员工身份管理过程中,企业的身份管理员可能还会遇到额外的场景:

  • 出于管理成本的考虑,不想再云端在额外的创建和管理用户,从而避免同步用户带来的工作量;
  • 期望根据用户在本地IDP中加入的组或者用户的某个特殊属性,来区分云上拥有的权限,当进行权限调整时,只需要在本地IDP进行分组或属性的更改;
  • 出于测试或容灾的需要,期望可以既能通过SSO的方式访问云端控制台,也能通过用户名和密码访问云端控制台;
  • 企业在云上有多个云账号,企业的员工使用企业的统一IDP。期望在企业IDP配置一次,就可以方便的实现到多个云账号的SSO;
  • 企业存在多个IDP,都需要访问同一个阿里云账号。期望在一个阿里云账号内配置,允许多个IDP进行SSO。

choice.jpg

图1 RAM用户SSO和RAM角色SSO

企业的身份管理员可以通过选用基于RAM角色的SSO来解决以上的问题。

原理

在上篇文章中,我们简单的介绍了SAML协议中涉及到的IDP(ID Provider)SP(Service Provider)和Trust的概念。RAM角色SSO同样基于SAML协议,但是不再通过NameID进行账号的映射登录控制台,而是通过选取的RAM角色身份提供商**,使用角色扮演的方式登录到控制台。

概念和实体

身份提供商实体

前文我们介绍了IDP的概念。那么为了建立云账号到IDP的信任关系,需要将IDP的描述文件(Metadata.xml)配置到云账号,代表了一个IDP的虚拟身份。同一个云账号可以创建多个身份提供商。

RAM角色的可信实体

RAM角色介绍可以参考阿里云的官方文档 [1]。其中,原本的RAM角色的可信实体仅有云账号和阿里云服务。新增了身份提供商作为新的可信实体,允许受信的身份提供商下的用户所扮演的角色。

流程

在基于SAML 2.0的RAM角色SSO流程中,企业员工在IDP登录后,IDP将根据SAML 2.0 HTTP-POST绑定的要求生成包含SAML Assertion的认证响应,并由浏览器(或程序)自动转发给阿里云。阿里云侧解析SAML Assertion,并验证及抽取Attribute中的元素。

SAML_ROLE_SSO.jpg

图2 通过控制台和程序,使用SAML Assertion访问阿里云

SAML Attribute元素

对于RAM角色SSO,阿里云侧对于SAML Assertion中的Attribute元素有以下的要求:

Role

字段Name为https://www.aliyun.com/SAML-Role/Attributes/Role 的元素。必须存在,可以有多个。

字段的值代表了可供扮演的角色和身份提供商。格式为扮演的RAM角色的ARN和阿里云侧身份提供商的ARN组合,使用英文逗号(,)分隔。

Role Attribute的样例如下:

  <Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/Role">      
    <AttributeValue>acs:ram::$account_id:role/roleName1,acs:ram::$account_id:saml-provider/providerName1</AttributeValue>
    <AttributeValue>acs:ram::$account_id:role/roleName2,acs:ram::$account_id:saml-provider/providerName2</AttributeValue>
  </Attribute>

RoleSessionName

字段Name为https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName的元素。必须存在且只能有一个。

字段的值将被用来作为登录用户信息的一部分显示在控制台上和操作审计日志中。如果您有多个用户使用同一个角色,请确保使用可以唯一标识用户的RoleSessionName值,以区分不同的用户,如员工ID、email地址等。长度2个字符到32个字符,只能是英文字母、数字和特殊字符:-_.@=

RoleSessionName Attribute的样例如下:

   <Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName">
     <AttributeValue>$user_id</AttributeValue>
   </Attribute>

SessionDuration

字段Name为https://www.aliyun.com/SAML-Role/Attributes/SessionDuration的元素。可以不传,最多有1个。

字段的值在控制台登录的情况下代表了Session时长,在程序调用情况下无效。格式为数字,取值范围为900秒(15分钟)到3600秒(1个小时)。默认值为3600秒。

SessionDuration Attribute的样例如下:

   <Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/SessionDuration">
     <AttributeValue>1800</AttributeValue>
   </Attribute>

实战

假设一家企业CompanyA在GCP上管理了企业员工的账号和身份。同时在阿里云上拥有2个账号Account1和Account2。企业的身份管理期望配置一次,可以让员工通过基于RAM角色的SSO免登到阿里云的Account1和Account2上。

STEP 1准备IDP和SP侧需要配置数据。

SP侧提供的数据

登录阿里云RAM控制台,在左侧导航栏选取SSO管理,在右侧角色SSO标签下可以看到企业IDP侧SAMP SP配置需要使用的阿里云服务提供商元数据URL:

   https://signin.aliyun.com/saml-role/sp-metadata.xml

如果使用的IDP不支持上传或填写服务提供商元数据URL,需要手动配置。

  • EntityID:urn:alibaba:cloudcomputing,表示阿里云服务提供商的EntityID
  • ACS URL:https://signin.aliyun.com/saml-role/sso,表示阿里云侧消费SAML Assertion的地址
  • RelayState: 可选,表示成功登录后跳转的阿里云侧的页面地址,默认为控制台首页。

IDP侧提供的数据

阿里云侧在创建服务提供商的时候,需要上传身份提供商的元数据。

访问Google的管理控制台,选取应用SAML应用**,点击右下角的“+”号,点击设置自己的自定义应用,下载对应的IDP元数据文件。

STEP 2阿里云侧的配置

新建身份提供商

访问阿里云RAM控制台,在左侧导航栏选取SSO管理,在右侧角色SSO标签,选择新建身份提供商按钮,在右侧窗口中填入供应商名称,备注,并上传IDP的元数据文件。例如这里的身份提供商的名称叫GCP-CompanyA。点击新创建好的身份提供商,记录下ARN:

   acs:ram::YOUR_ACCOUNT_ID:saml-provider/GCP-CompanyA

createIDP.jpg

图3 新建身份提供商

新建RAM角色并授信

选择阿里云RAM控制台左侧导航栏的RAM角色管理,在右侧点击新建RAM角色。选择身份提供商作为可信实体。

gcp_role_trusted_entity.jpg

图4 选择角色信任的可信实体类型

点击下一步,在页面中,输入角色名,例如GCP-CompanyA-Role,选择刚刚创建好的身份提供商GCP-CompanyA。点击完成并为其授权。创建完成后,点击新创建的角色名,记录角色ARN:

   acs:ram::YOUR_ACCOUNT_ID:role/gcp-companya-role

gcp_role_idp_provider.jpg

图5 选择角色的可信实体为身份提供商

同样的操作可以在多个账号内一并进行配置。

STEP 3IDP侧的配置

为用户创建自定义属性

访问GCP的管理控制台,选择用户,在上方更多下拉框中,选择管理自定义属性,添加自定义属性。自定义属性允许多个值。这里我们创建类别为SSO,名称为Role的字段。

为用户配置自定义属性

在用户列表中选择需要配置的员工账号,在用户信息中找到SSO字段,将刚刚创建好的角色及收费提供商的ARN使用英文逗号分隔填入。例如:

   acs:ram::YOUR_ACCOUNT_ID:role/gcp-companya-role,acs:ram::YOUR_ACCOUNT_ID:saml-provider/GCP-CompanyA

这里如果有多个云端的身份提供商,多个角色,可以新增添入多个值。配置完成后点击保存

STEP 4配置SAML SSO应用

访问Google的管理控制台,选取应用,SAML应用,点击右下角的“+”号,点击设置自己的自定义应用。配置SP侧的信息:

gcp_config.jpg

图6 配置SAML 应用中的SP 元数据

配置好字段的映射,其中RoleSessionName字段选择GCP用户的电子邮件,Role选择自定义的SSO的role的字段。配置完成后保存应用。并对用户开启应用。

gcp_role_field.jpg

图7 配置Attribute中的Role和RoleSessionName

STEP 5在IDP侧发起SSO

使用需要SSO的企业员工账号登录GCP,访问配置好的SAML应用,启用应用。开始基于RAM角色的SAML SSO流程。如果配置了多个角色字段,可以在页面中选择需要的角色,完成SSO到控制台的流程。

gcp-role-select.jpg

图8 选择对应的角色完成SSO

结束语

本文介绍了基于SAML 2.0的RAM角色SSO,将企业IDP认证和阿里云SP控制台认证打通。和RAM用户的SSO相比,两种基于SAML 2.0的SSO的方式有以下不同:

RAM用户SSO RAM角色SSO
SP侧发起SSO Yes No
IDP侧发起SSO Yes Yes
使用RAM用户名密码登录 No Yes
多IDP SSO到一个云账号 No Yes
单个IDP SSO到多个云账号 No Yes
需要用户同步 Yes No
支持的云服务 支持RAM的服务列表[2] 支持STS的服务列表[3]

企业的身份管理员,可以根据企业的实际应用的场景,选择合适的SSO方式,将企业IDP的用户认证和云端的身份认证打通,从而实现到云端控制台的SSO。

Leave a Reply

Your email address will not be published. Required fields are marked *