微服务架构上的SSO。我们使用Keycloak。零件编号1

在任何大型公司中,X5零售集团也不例外,因为需要用户身份验证的项目数量随着项目数量的增长而增加。随着时间的流逝,需要用户从一个应用程序无缝过渡到另一个应用程序,然后需要使用单个服务器Single-Sing-On(SSO)。但是,当各种项目中已经使用了诸如AD或其他没有附加属性的身份提供者时,该怎么办呢?一类称为“身份经纪人”的系统将应运而生。功能最强大的是其代表,例如Keycloak,Gravitee访问管理等。大多数情况下,使用方案可能会有所不同:机器交互,用户参与等。解决方案必须支持灵活且可扩展的功能,能够将所有要求合二为一,而我们公司中的此类解决方案现在是指标经纪人-Keycloak。



Keycloak是RedHat支持的用于身份验证和访问控制的开源产品。这是使用SSO的公司产品的基础-RH-SSO。

基本概念


在开始处理决策和方法之前,您应该确定过程的术语和顺序:



识别是通过其标识符识别主题的过程(换句话说,它是在确定名称,登录名或编号)。

身份验证是一种身份验证过程(使用密码检查用户,通过电子签名验证电子邮件等)。

授权是对某些资源(例如电子邮件)的访问权。

Keycloak身份经纪人


Keycloak是一种开放源代码身份和访问管理解决方案,设计用于可使用微服务架构模式的IC。

Keycloak提供的功能包括单点登录(SSO),经纪人识别和社交登录,用户联盟,客户端适配器,管理控制台和帐户管理控制台。

Keycloak支持的基本功能:

  • 基于浏览器的应用程序的单点登录和单点退出。
  • 支持OpenID / OAuth 2.0 / SAML。
  • 身份代理-使用外部OpenID Connect或SAML身份提供程序进行身份验证。
  • 社交登录-支持Google,GitHub,Facebook,Twitter,以进行用户识别。
  • User Federation – LDAP Active Directory .
  • Kerberos bridge – Kerberos .
  • Admin Console — Web.
  • Account Management Console – .
  • .
  • 2FA Authentication – TOTP/HOTP Google Authenticator FreeOTP.
  • Login Flows – , .
  • Session Management – .
  • Token Mappers – , .
  • realm, application .
  • CORS Support – CORS.
  • Service Provider Interfaces (SPI) – SPI, : , , .
  • JavaScript applications, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • , OpenID Connect Relying Party library SAML 2.0 Service Provider Library.
  • plugins.

对于CI / CD流程以及Keycloak中的管理流程自动化,可以使用REST API / JAVA API。该文档以电子形式提供:

REST API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
JAVA API https://www.keycloak.org/docs-api/8.0/javadocs /index.html

企业身份提供者(本地)


通过用户联合身份验证服务对用户进行身份验证的能力。



也可以使用传递身份验证-如果用户使用Kerberos(LDAP或AD)在工作站上进行身份验证,则可以使用Keycloak自动对他们进行身份验证,而无需重新输入用户名和密码。

对于用户的身份验证和进一步授权,可以使用关系型DBMS,该关系型DBMS最适用于开发环境,因为它不需要在项目的早期阶段进行长期设置和集成。默认情况下,Keycloak使用内置的DBMS来存储设置和用户数据。

支持的DBMS列表很广泛,包括:MS SQL,Oracle,PostgreSQL,MariaDB,Oracle等。目前测试最多的是适用于MariaDB 10.1.19的Oracle 12C Release1 RAC和Galera 3.12集群。

身份提供商-社交登录


可以使用来自社交网络的登录名。要激活对用户进行身份验证的功能,请使用Keycloack管理控制台。不需要更改应用程序代码,并且此功能“开箱即用”,可以在项目的任何阶段激活。



要验证用户身份,可以使用OpenID / SAML身份提供程序。

在Keycloak中使用OAuth2的典型授权方案


授权代码流 -与服务器端应用程序一起使用。授权许可的最常见类型之一,因为它非常适合服务器应用程序,其中外部人无法访问应用程序源代码和客户端数据。在这种情况下,该过程基于重定向。该应用程序应该能够与用户代理(用户代理)(例如Web浏览器)进行交互,以接收通过用户代理重定向的API授权代码。

隐式流 -由移动或Web应用程序(在用户设备上运行的应用程序)使用。

不能保证客户端隐私的移动和Web应用程序使用隐式类型的授权权限。隐式权限类型还使用用户代理重定向,并且访问令牌被传递给用户代理以在应用程序中进一步使用。这使令牌可用于用户和用户设备上的其他应用程序。使用这种类型的授权许可,不对应用程序进行身份验证,并且流程本身依赖于重定向URL(先前已在服务中注册)。

隐式流不支持刷新令牌。
客户端凭据授予流 -在应用程序访问API时使用。这种类型的授权权限通常用于服务器到服务器的交互,这些交互必须在后台运行,而无需立即的用户交互。客户端凭据流允许Web服务(机密客户端)使用自己的凭据,而不是在调用另一个Web服务时模拟用户进行身份验证。为了获得更高的安全性,呼叫服务可以使用证书(而不是共享机密)作为凭据。

OAuth2规范在
RFC-6749
RFC-8252
RFC-6819中进行了描述

JWT令牌及其优势


JWT(JSON Web令牌)是一个开放标准(https://tools.ietf.org/html/rfc7519),它定义了一种紧凑而独立的方法,用于在各方之间安全地将信息作为JSON对象传输。

根据标准,令牌由base-64格式的三部分组成,由点分隔。第一部分称为标头,其中包含令牌的类型和用于获取数字签名的哈希算法的名称。第二部分存储基本信息(用户,属性等)。第三部分是数字签名。

<已编码标头>。<已编码有效载荷>。<签名>
切勿将令牌保存在数据库中。因为有效令牌等同于密码,所以存储令牌就像以明文形式存储密码。
访问令牌是授予其所有者访问服务器受保护资源的令牌。通常,它的寿命很短,并且可以携带其他信息,例如请求此令牌的一方的IP地址。

刷新令牌是一种令牌,它允许客户端在生存期到期后请求新的访问令牌。这些令牌通常会长期发行。

微服务架构中应用程序的主要优势:

  • 通过一次性身份验证访问各种应用程序和服务的能力。
  • 在用户配置文件中缺少许多必需属性的情况下,可以充实可以添加到有效负载中的数据,包括自动数据和动态数据。
  • 无需存储有关活动会话的信息,服务器应用程序应仅验证签名。
  • 有效负载中具有其他属性的更灵活的访问控制。
  • 对标头和有效负载使用令牌签名可提高解决方案的整体安全性。

JWT令牌-组成


标头 -默认情况下,标头仅包含令牌的类型和用于加密的算法。

令牌的类型存储在“ typ”键中。JWT中将忽略“ typ”键。如果存在typ密钥,则其值必须为JWT,以指示该对象是JSON Web令牌。

第二个alg密钥定义用于加密令牌的算法。默认情况下,应将其设置为HS256。标头以base64编码。

{“ alg”:“ HS256”,“ typ”:“ JWT”}
有效负载(内容) -有效负载存储需要验证的所有信息。有效负载中的每个密钥称为“声明”。例如,只能通过邀请输入申请(关闭促销)。当我们想邀请某人参加时,我们向他发送邀请函。确认电子邮件地址属于接受邀请的人很重要,因此我们将在有效负载中包含此地址,为此,我们会将其保存在“电子邮件”密钥中

{“电子邮件”:“ example@x5.ru”}
有效负载中的密钥可以是任意的。但是,有一些保留的:

  • iss(Issuer)-定义从其发送令牌的应用程序。
  • sub(主题)-定义令牌的主题。
  • aud (Audience) – URI, . JWT , — .
  • exp (Expiration Time) — , . JWT , . Exp unix .
  • nbf (Not Before) — unix , , .
  • iat (Issued At) — , JWT. iat unix .
  • Jti (JWT ID) — , c .

重要的是要理解有效载荷不是以加密形式传输的(尽管可以嵌入令牌,然后才可以传输加密数据)。因此,不可能在其中存储任何秘密信息。像标题一样,有效负载也以base64编码。
签名 -当我们有标头和有效负载时,我们可以计算签名。

Base64编码:采用标头和有效负载,它们通过点组合成一行。然后,此行和秘密密钥将发送到标头中指定的加密算法的输入(密钥“ alg”)。键可以是任何字符串。较长的字符串将是可取的,因为它将花费更多的时间进行匹配。

{“ alg”:“ RSA1_5”,“有效负载”:“ A128CBC-HS256”}

Keycloak故障转移群集体系结构


当对所有项目使用单个群集时,对SSO解决方案的需求就增加了。当项目数量很少时,这些要求并不是对所有项目都那么明显,但是随着用户和集成数量的增加,对可访问性和生产率的要求也随之提高。

增加单个SSO失败的风险增加了对解决方案体系结构和用于组件冗余的方法的要求,并导致了非常严格的SLA。因此,在开发解决方案时或在实施解决方案的早期阶段,项目通常具有自己的非容错基础架构。在开发过程中,需要奠定开发和扩展的可能性。最灵活的方法是使用容器虚拟化或混合方法构建故障转移群集。

要在主动/主动和主动/被动群集中工作,需要确保关系数据库中数据的一致性-必须在不同的地理分布数据中心之间同步复制两个数据库节点。

故障安全安装的最简单示例。



使用单个群集的好处是什么:

  • 高可用性和高性能。
  • 支持操作模式:主动/主动,主动/被动。
  • 动态扩展能力-使用容器虚拟化时。
  • 集中管理和监控的可能性。
  • 用于项目中用户的标识/认证/授权的统一方法。
  • 无需用户参与,各个项目之间的交互更加透明。
  • 能够在各种项目中重用JWT令牌。
  • 单点信任。
  • 使用微服务/容器虚拟化更快地启动项目(无需增加和配置其他组件)。
  • 也许从供应商那里获得商业支持。

规划集群时要考虑的事项


数据库管理系统


Keycloak使用DBMS管理系统来保存:领域,客户端,用户等。
支持多种DBMS:MS SQL,Oracle,MySQL,PostgreSQL。Keycloak带有自己的内置关系数据库。建议在未加载的环境(例如开发环境)中使用。

要在主动/主动和主动/被动群集中运行,需要确保关系数据库中数据的一致性,并且数据库群集的两个节点都在数据中心之间同步复制。

分布式缓存(Infinspan)


为了使群集正常工作,需要使用JBoss数据网格对以下缓存类型进行额外的同步:

身份验证会话-用于在特定用户的身份验证期间保存数据。来自此缓存的请求通常仅包括浏览器和Keycloak服务器,而不包括应用程序。

操作令牌-用于用户需要异步(通过电子邮件)确认操作的情况。例如,在忘记密码流期间,actionTokens Infinispan缓存用于跟踪有关已使用的相关动作标记的元数据,因此无法重复使用。

持久数据的缓存和无效化-用于缓存持久数据以避免不必要的数据库查询。当Keycloak服务器更新数据时,所有数据中心中的所有其他Keycloak服务器都应注意这一点。

工作-仅用于在群集节点和数据中心之间发送无效消息。

用户会话-用于保存有关用户会话的数据,这些数据对于用户的浏览器会话有效。缓存必须处理来自最终用户和应用程序的HTTP请求。

蛮力保护-用于跟踪失败的登录数据。

负载均衡


负载平衡器是keycloak中的单个入口点,应支持粘性会话。

应用服务器


它们用于控制组件之间的交互,并且可以使用现有的自动化工具和动态扩展的基础架构自动化工具进行虚拟化或容器化。OpenShift,Kubernetes和Rancher中最常见的部署方案。

至此,第一部分-理论-结束了。在以下系列文章中,将讨论与各种标识提供程序的集成示例和配置示例。

Source: https://habr.com/ru/post/undefined/


All Articles