阿里云集成Keycloak实现SSO单点登录

5,809 阅读5分钟

前面的文章讲述了如何将自己开发的应用集成Keycloak的示例,那对于现有的一些三方的系统和服务,是否也能够接入Keycloak实现统一的身份认证管理呢?答案是肯定的,当然前提是三方的系统和服务本身支持OpenID ConnectOAuth 2.0SAML 2.0这样的协议。那么阿里云需要怎么才能接入到Keycloak中呢?本文便讲述具体的集成配置方法。

阿里云SSO功能说明

阿里云官方文档有如下描述:

阿里云支持基于SAML 2.0的SSO(Single Sign On,单点登录),也称为身份联合登录。

所以我们要想阿里云接入Keycloak,那就只需要在Keycloak进行相应的SAML 2.0的配置。首先我们先来了解下SAML相关的概念。

SAML基本概念

  • 身份提供商(IdP):一个包含有关外部身份提供商元数据的RAM实体,身份提供商可以提供身份管理服务。本例中指Keycloak。
  • 服务提供商(SP):利用IdP的身份管理功能,为用户提供具体服务的应用,SP会使用IdP提供的用户信息。本例中指阿里云。
  • 安全断言标记语言(SAML 2.0):实现企业级用户身份认证的标准协议,它是SP和IdP之间实现沟通的技术实现方式之一。SAML 2.0已经是目前实现企业级SSO的一种事实标准。
  • SAML断言(SAML assertion):SAML协议中用来描述认证请求和认证响应的核心元素。例如:用户的具体属性就包含在认证响应的断言里。
  • 信赖(Trust):建立在SP和IdP之间的互信机制,通常由公钥和私钥来实现。SP通过可信的方式获取IdP的SAML元数据,元数据中包含IdP签发SAML断言的签名验证公钥,SP则使用公钥来验证断言的完整性。

阿里云SSO的方式

阿里云提供以下两种基于SAML 2.0协议的SSO方式:

  • 用户SSO:阿里云通过IdP颁发的SAML断言确定企业用户与阿里云RAM用户的对应关系 。企业用户登录后,使用该RAM用户访问阿里云。
  • 角色SSO:阿里云通过IdP颁发的SAML断言确定企业用户在阿里云上可以使用的RAM角色。企业用户登录后,使用SAML断言中指定的RAM角色访问阿里云。

这2种SSO的方式的区别及使用场景可参考官方文档,这里简单总结下最根本的区别:

  • 用户SSO:需要在阿里云及Keycloak同时创建用户才可实现SSO登录功能,SAML配置相对较简单
  • 角色SSO:只需在Keycloak中创建用户便可直接登录阿里云,阿里云中不需要创建用户,SAML配置相对复杂一些

阿里云用户SSO集成Keycloak配置方式

配置步骤

用户SSO的方式需要在阿里云及Keycloak同时创建用户,配置上相对较为简单,具体步骤如下:

  1. 登录阿里云RAM访问控制台,下载保存用户SSOSAML服务提供商元数据到本地

    如下图中https://signin.aliyun.com/saml/SpMetadata.xml?tenantID=XXX这个地址浏览器打开后内容保存到本地SpMetadata.xml文件中

    keycloak-aliyun-user-sso-1

  2. 使用步骤1中保存的SpMetadata.xml在Keycloak管理后台添加SAML客户端

    keycloak-aliyun-user-sso-2

    keycloak-aliyun-user-sso-3

    keycloak-aliyun-user-sso-4

  3. 将Keycloak当前Realm的SAML IDP Metadata保存至本地

    示例Reaml名为Saml,点击Realm Settings菜单中Endpoints中的SAML 2.0 Identity Provider Metadata链接,可查看具体的IDP Metadata内容,将内容保存至本地IdpMetadata.xml文件中

    keycloak-aliyun-user-sso-5

  4. 阿里云RAM访问控制后台编辑用户SSO登录设置

    keycloak-aliyun-user-sso-6

  5. 阿里云RAM访问控制后台创建相应的用户

    keycloak-aliyun-user-sso-7

  6. Keycloak管理后台创建相应的用户

    注意:用户的邮箱必须与步骤5中的完整登录名称完全一致

    keycloak-aliyun-user-sso-8

效果演示

  1. 访问阿里云SSO登录地址,点击使用企业账号登录

    keycloak-aliyun-user-sso-9

  2. 跳转Keycloak登录页进行登录

    keycloak-aliyun-user-sso-10

  3. Keycloak登录成功后跳转至阿里云控制台

    keycloak-aliyun-user-sso-11

阿里云角色SSO集成Keycloak配置方式

角色SSO的方式不需要在阿里云创建用户,不过SAML配置上会相对复杂一些

配置步骤

  1. 登录阿里云RAM访问控制台,下载保存角色SSOSAML服务提供商元数据到本地

    keycloak-aliyun-role-sso-1

  2. 角色SSO中新建身份提供商

    元数据文档的获取与用户SSO步骤3的方式相同

    keycloak-aliyun-role-sso-2

  3. 创建RAM角色

    身份提供商选择上一步新建的身份提供商

    keycloak-aliyun-role-sso-3

    keycloak-aliyun-role-sso-4

  4. 使用步骤1中保存的SpMetadata.xml在Keycloak管理后台添加SAML客户端

    keycloak-aliyun-role-sso-5

    keycloak-aliyun-role-sso-6

  5. 设置IDP Initiated SSO URL Name,这个就是从Keycloak登录阿里云的地址

    本示例使用本地环境的Keycloak演示,实际请使用生产环境的Keycloak进行配置,生产环境Keycloak部署可参考:使用Docker在生产环境快速部署Keycloak高可用集群

    keycloak-aliyun-role-sso-7

  6. Keycloak后台创建相应的用户

    keycloak-aliyun-role-sso-8

  7. 为创建的用户添加自定义用户属性SamlRole

    配置此用户属性的目的是为了添加SAML断言,SamlRole名字自定,值必须按照特定格式,参照阿里云文档说明:支持角色SSO的SAML断言

    keycloak-aliyun-role-sso-9

  8. Keycloak中为创建的客户端配置Mappers以添加SAML断言

    参照阿里云文档说明:支持角色SSO的SAML断言,必须添加https://www.aliyun.com/SAML-Role/Attributes/Role以及https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName这2个SAML断言

    keycloak-aliyun-role-sso-10

    keycloak-aliyun-role-sso-11

    keycloak-aliyun-role-sso-12

效果演示

  1. 访问SSO登录地址并进行登录,即步骤5中配置的IDP Initiated SSO URL

    keycloak-aliyun-role-sso-13

  2. 登录成功后跳转至阿里云控制台

    keycloak-aliyun-role-sso-14

总结

本文对阿里云支持的2种SSO方式进行了配置的示例,而现有不少的三方系统提供的SSO都为SAML 2.0协议,实现上比较类似,可参考本文的方法进行相关的配置。Keycloak不仅可以很方便的对内部开发的应用进行集成,同时凭借本身对SAML 2.0协议良好的支持,只需进行少量SAML相关的配置便可以接入三方系统,从而实现内部系统及外部服务统一的用户认证管理功能。