IAM&RBAC & OpenID Connect&OAuth 2.0&LDAP一篇文章讲透原理与集成和场景

基本概念

IAM

IAM(Identity and Access Management,身份和访问管理)是一个广泛的术语,包括用于确保正确身份的人员获得对资源的适当访问权限的工具和流程。它通常涵盖面广,包括身份验证、授权、角色权限的管理、策略的执行以及相关的监控和审计功能。

IAM & OAuth 2.0关系

OAuth 2.0是IAM的一个组成部分,聚焦于授权;它定义了一种流程,让用户能授予第三方应用程序访问特定资源(例如,在线服务、APIs或资源)的权限,而无需提供他们的登录凭证

OAuth 2.0提供几种"授权流程"(即授权类型),适用于不同的场景和应用类型,如服务器端、客户端、移动和桌面应用。

IAM和OAuth 2.0的关系如下:

  1. 组成部分:

OAuth 2.0是IAM的组成部分之一,专注于安全地提供代表用户对资源的授权。

  1. 处理不同关注点:

IAM除了涵盖OAuth 2.0所管辖的授权过程,还负责身份验证(确定用户是谁)以及管理授权之后用户或系统能做什么,例如,通过RBAC来控制对系统内部资源的访问。

  1. 基础设施的一部分:

在现代IT基础设施中,IAM作为整体解决方案或产品存在,而OAuth 2.0作为IAM策略实施的手段之一。IAM解决方案可能会集成OAuth 2.0作为建立API访问控制和第三方服务集成的一种方法。

  1. 用于身份联合:

IAM支持身份联合,让用户通过单一信任源的认证来获得对多个域的访问权限。OAuth 2.0(和OpenID Connect)可以用于实现联合身份验证场景中的授权。

  1. 策略和合规性:

IAM涉及将策略和合规性规定融入到身份和访问控制流程中,而OAuth 2.0则提供了授权的技术标准,通过发放令牌来实现这些流程。

  1. 综合解决方案:

IAM提供了比OAuth 2.0更综合的解决方案,通常包含用户生命周期管理(创建、更新、删除用户)、组管理、访问审计和报告等。

总结起来,OAuth 2.0是IAM的一个工具,IAM系统可能会使用OAuth 2.0来处理授权,但IAM本身的范畴更广,还涵盖了身份验证、访问管理以及策略的制定和执行。IAM确保了适当的人员以适当的方式,在适当的时间访问适当的资源,而OAuth 2.0则是这个目标达成过程中用到的具体协议之一。

RBAC&OpenID Connect&OAuth 2.0&SSO

RBAC & OpenID Connect 关系

RBAC(Role-Based Access Control,基于角色的访问控制)和OpenID(一种身份认证协议或框架)是两种不同领域能力的技术和概念。它们都与安全性有关,但它们的关注点和功能是不同的。下面分别说明每个概念,并讨论它们之间的关系。

RBAC:

RBAC是一种广泛使用的访问控制机制,它通过分配用户角色来控制对系统资源的访问权限。在RBAC中,访问权限不直接分配给用户,而是分配给角色,然后用户被分配了一个或多个角色。这意味着用户通过其角色继承访问权限。这种模型使得权限管理更加集中和简化,尤其是在有大量用户和权限时。

OpenID:

OpenID是一种身份验证协议,允许用户使用一个单一的身份在支持OpenID的不同站点登录。用户登录一次(通常是在一个叫做"身份提供者"的服务),然后可以访问其他兼容OpenID的服务而无需再次登录。这种方式被称为单点登录(SSO)。OpenID Connect是建立在OAuth 2.0协议之上的一层身份层,提供了一种简单的身份认证功能以及标准化方式返回关于认证的用户信息

二者的关系:

RBAC和OpenID关注的是两个不同的安全领域。OpenID用于身份验证过程,确定一个人是谁;而RBAC用于授权过程,确定一个身份可以做什么

  • 在很多情况下,RBAC会在一个用户通过OpenID(身份验证)成功登录系统后启动。一旦用户的身份得到验证,系统将依据用户的角色来决定他们可以访问哪些资源或执行哪些操作。

  • OpenID Connect提供的用户信息可能会被用于RBAC系统来动态分配角色或调整访问权限。

简要来说,OpenID用来验证用户身份,而RBAC用来管理用户的访问权限。在实际应用中,它们通常会一起使用,以提供一个全面的安全性解决方案。OpenID Connect支持OAuth 2.0认证流程,而OAuth 2.0通常和RBAC施加的权限策略相结合,以确定一个身份验证通过的用户可以对应用程式中的哪些资源进行哪些操作。
  OpenID Connect 和 OAuth 2.0 处理不同的问题,而且 OpenID Connect 实际上是构建在 OAuth 2.0 之上的。

OAuth 2.0 & OpenID Connect 关系

OAuth 2.0:

OAuth 2.0 是一个授权框架,它允许第三方应用程序在用户的授权下访问用户在另一服务上的资源。它主要用于管理授权,而不是身份验证。OAuth 2.0 本身不提供用户的登录状态或身份信息;它只提供一个令牌,这个令牌代表了特定用户授予给第三方应用的权限。

OpenID Connect:

OpenID Connect (OIDC) 是一个在 OAuth 2.0 授权框架基础上的身份层。它用于身份验证,即确定用户是谁。OpenID Connect 允许客户端应用依据用户的身份信息来执行身份验证,并与用户信息的提供者(如 Google 或 Facebook)进行安全的交互。它为用户提供了单点登录功能,并可以获取用户的基本资料信息。

说 OpenID Connect 比 OAuth 2.0 更高级并不完全准确。实际上,OpenID Connect 是事实上的另一个标准,它扩展了 OAuth 2.0 的功能,专门用于身份认证场景。OpenID Connect 解决了 OAuth 2.0 在身份验证中的不足,增加了一些额外的规格和机制以便于应用程序能够利用它进行安全的身份验证。

简而言之,OpenID Connect 和 OAuth 2.0 旨在解决不同的问题:

  • OAuth 2.0 用于授权,即允许应用访问用户数据的权限。

  • OpenID Connect 在 OAuth 2.0 的基础上增加了身份验证,提供了关于已认证用户的信息。

因此,可以认为 OpenID Connect 是在 OAuth 2.0 的授权机制之上,为特定的身份验证场景提供了一个标准化的身份层。

既然RBAC和OAuth2.0都是身份验证,那两者有何区别?

OAuth 2.0 & RBAC 关系

OAuth 2.0 和 RBAC 都涉及权限管理,但是它们在设计目的、应用场景和实现方式上存在重要差异。

OAuth 2.0:

OAuth 2.0 是一个授权框架,它允许第三方应用程序在用户同意的情况下访问他们在其他服务上的数据。例如,第三方应用程序可能需要访问用户的Google日历。在这种情况下,该用户可以通过OAuth 2.0授权该应用访问他的Google日历,而无需向应用程序提供他的Google账户密码。   OAuth 2.0 的主要目的是授予访问令牌(access tokens),这些令牌定义了第三方应用的权限,指定了它们可以访问的资源种类以及操作的范围。

RBAC (Role-Based Access Control):

RBAC 是根据用户的角色来分配系统资源的访问权限的一种方法。这些角色通常对应于组织中的工作职位和责任。在这种模式下,角色定义了一组权限;然后用户被赋予特定的角色,进而继承了这些权限。   RBAC 重点关注的是用户在单个系统或组织内所能执行的操作。权限不是由外部应用赋予,而是由组织内部决定,并且通常是静态分配的。RBAC 可以用来强制执行最小权限原则,确保用户只有执行其职责所必需的权限。

两者的区别主要有以下几点:

  1. 目的差异:

OAuth 2.0 关注于跨应用或跨组织的授权,目的是让用户能够安全地分享他们在一个服务上的数据,而不必分享他们的登录凭证。与此相反,RBAC 是一种内部授权机制,它确保用户访问他们所工作的组织系统中的资源和操作受到适当的限制。

  1. 权限维度:

OAuth 2.0 的权限通常在用户、第三方应用(客户端)、资源服务器和资源四个维度上定义。而 RBAC 的权限通常依赖于用户的角色和组织内部的权限策略。

  1. 动态性 vs. 静态性:

OAuth 2.0 的授权是在需要时动态创建的,典型的场景是用户需要临时共享一个具有特定权限的访问令牌。而 RBAC 的角色和权限通常事先定义好,并分配给用户,通常更静态且受组织控制。

  1. 控制粒度:

OAuth 2.0 允许微调精细化的权限控制,比如应用只能读取用户的邮箱地址而不能读取其他信息。RBAC 通常在更高的层次上控制权限,比如用户被授予角色,而不是直接授予具体的权限。
   综上所述,OAuth 2.0和RBAC分别应对不同的授权需求。OAuth 2.0 更适合管理不同服务间的资源访问,而 RBAC 更适合管理组织内部权限的分配和控制在许多情况下,组织会在内部使用 RBAC 来控制谁可以做什么,同时使用 OAuth 2.0 来与外部服务集成并允许外部应用访问内部资源

SSO & OAuth 2.0 关系

单点登录(SSO)和OAuth 2.0是两种不同但相关的技术,它们在现代身份验证和授权中起着至关重要的作用。

单点登录(SSO):

SSO是用户身份验证的方法,允许用户使用一组凭据(如用户名和密码)登录多个相关的,但技术上独立的软件系统。一次成功的登录将创建一个会话,有效地将用户的认证状态传播到其他所有系统中,从而避免用户在不同的服务或应用之间重复登录。

SSO对于改善用户体验和简化凭证管理至关重要。

OAuth 2.0:

OAuth 2.0是一个授权框架,使第三方应用程序在获得资源所有者(用户)同意的情况下访问服务器上的受保护资源,而无需获取用户的凭证。OAuth 2.0为不同类型的应用程序定义了几种授权流程(grant types),允许应用代表用户安全地进行API请求。

SSO和OAuth 2.0的关系:

虽然SSO和OAuth 2.0都牵涉到用户身份,但它们服务于不同的目标。SSO侧重于身份验证(认证用户身份),而OAuth 2.0侧重于授权(授权第三方访问)。SSO的一个实现可能是通过使用开放标准如OpenID Connect,这基于OAuth 2.0框架扩展而来。

集成场景:

  • 一个常见的场景是使用OpenID Connect来执行SSO。用户首先通过SSO使用单个凭据登录一次,然后使用OpenID Connect协议(基于OAuth 2.0)来认证和创建一个跨多个应用程序的会话。

  • 在这种情况下,OAuth 2.0扮演了将用户身份和会话状态建立在应用之间的技术基础。使用OpenID Connect的优点是,它不仅提供了OAuth 2.0中的授权能力,还增加了身份验证流程来实现SSO。

因此,SSO通常可以看做是在用户端实现的一种体验,而OAuth 2.0提供了在后端实现SSO的一种机制。在实际部署时,这两种技术通常被用来构建一个安全、无缝的用户认证和授权系统。

OpenID Connect

OpenID Connect如何实现认证

  1. 用户尝试登录应用:

用户点击登录按钮时,客户端应用(也称作 relying party,依赖方)将通过重定向用户到OpenID提供者(OP)的授权服务器来启动登录过程。

  1. 授权请求:

应用向授权服务器发送授权请求。这个请求通常包含一些参数,如客户端ID、回调URL、响应类型、所请求的范围(包括openid,可能还包括profile,email等),以及一个用于防范跨站请求伪造攻击的状态值。

  1. 用户身份验证:

OpenID提供者要求用户进行身份验证,这可能涉及到输入用户名和密码,或者使用多因素认证等。这个步骤由OpenID提供者管理,并且是独立于客户端应用的。

  1. 授权码:

一旦用户完成身份验证并同意任何必要的授权,OpenID提供者会发出授权码,并通过回调URL重定向回到客户端应用。

  1. 令牌请求与ID令牌:

客户端应用使用这个授权码,连同应用的客户端密钥发送POST请求到OpenID提供者的令牌端点,来交换一个ID令牌和访问令牌。ID令牌是一个JWT(JSON Web Token),它包含了关于用户身份的断言,如用户的唯一标识符(sub)。

  1. 验证ID令牌:

客户端应用需要验证ID令牌的签名以确保其真实性,检查ID令牌的发行人、受众和过期时间等是否正确,并进行必要的安全性检查。

  1. 获取用户信息 (可选):

如果需要,客户端应用可以使用获取到的访问令牌请求OpenID提供者的用户信息端点,来获得用户的详细资料。

  1. 用户登录成功:

一旦完成这些步骤并验证了用户身份和令牌的有效性,用户则被认为已经成功登录到客户端应用。

使用OpenID Connect可以使用户不需要在多个应用之间重用密码,而是使得身份验证在用户与OpenID提供者之间私下进行,为用户提供了一个更安全和便捷的登录体验,并允许客户端应用请求和接收关于用户身份的标准化声明(claims)。

用户身份验证的提供者,验证登录后如何和OpenID交互

在OpenID Connect中,用户身份验证提供者(IDP)通常也是OpenID提供者(OP)。以下是身份验证成功后,OpenID Connect流程中的交互步骤:

  1. 用户认证:
  • 用户通过登录界面输入凭据(比如用户名和密码)或使用其他认证机制(如多因素认证)来完成身份验证流程。
  • 身份验证提供者(即OpenID提供者)负责这个步骤,并确保用户凭据的正确性。
  1. 许可授权:
  • 在用户成功登录后,如果应用请求的范围超出了OpenID的默认范围,并需要访问用户的其他个人信息,身份验证提供者可能会向用户显示一个授权页面,要求用户批准这些额外的访问请求。
  1. 授权码发放:
  • 一旦用户身份得到验证,且用户授予了请求的权限,身份验证提供者会向客户端应用发放授权码。
  • 授权码通过在浏览器中重定向到客户端应用的预先确定的回调URL来传递。这个URL中包含授权码以及之前发送的state参数。
  1. 获取令牌:
  • 客户端应用通过后端服务使用这个授权码,与身份验证提供者的令牌端点进行交互。
  • 客户端应用将提供它的客户端凭据(如客户端ID和密钥)以及授权码来验证自身的身份,并请求换取ID令牌和访问令牌。
  1. ID令牌和访问令牌的发放:
  • 在验证了授权码和客户端凭据之后,身份验证提供者向客户端应用颁发ID令牌和访问令牌。
  • ID令牌是一个JWT,包含了关于用户的断言,访问令牌则可以用于访问用户的资源或个人信息。
  1. 用户信息的获取 (可选):
  • 客户端应用可以使用访问令牌对OpenID提供者的用户信息端点发起请求,以获取有关用户的详细信息。
  • 用户信息端点将对访问令牌进行验证,并在成功后返回请求的用户信息。

这整个流程中,身份验证提供者即OpenID提供者,负责执行身份验证、获取用户授权、发放令牌以及提供用户信息服务。这些功能通常都封装在单一的服务中,如Keycloak、Okta、Auth0或其他自建的OIDC兼容服务。在此基础上,客户端应用(服务)实现相应的客户端逻辑以与提供者交互,完成用户的身份验证和授权过程。

小结

RBAC 内部系统权限管理,通常授权的对象是组织内部人员

SSO 统称单点登录

OAuth 2.0 权限验证,确定你能有什么权限

通常对三方站点授权,选择访问那些用户信息用以访问三方公网站点

也可以结合SSO登录后,管理用户是否可以访问接入SSO的多个站点

OpenID Connect 身份认证,确定你是谁

确定后,通常结合SSO实现单点登录或RBAC/OAuth 2.0进行权限管理

Q&A

有了JWT还需要OpenID Connect(OIDC)?

JWT(JSON Web Token)和OpenID Connect(OIDC)分别解决了不同的问题,因此它们在身份验证和授权领域被用于不同的目的。

JWT的用途:

JWT是一种紧凑、独立的代表自包含声明的方式。这些声明通常被用来在两个方之间传递关于实体(如用户)的信息,可以用于身份验证和信息交换。JWT可以加密以确保其传输安全,也可以仅签名以保证声明不被篡改。

OpenID Connect的用途:

OpenID Connect建立在OAuth 2.0协议之上,是一种基于标准的跨域身份验证协议。它允许使用OAuth 2.0流程进行认证,并在认证过程中产生JWT格式的ID令牌。这个ID令牌由授权服务器签发,包含了用户身份的声明,它使得客户端能够验证用户身份,并获取有关用户的基本信息。

为什么需要OpenID Connect,尽管有了JWT

  1. 标准身份验证流程:

OIDC不仅仅定义了令牌的格式(JWT),而且还定义了一整套身份验证流程,包括发现、认证、令牌交换等步骤。而JWT只是一个令牌格式,没有定义这些流程。

  1. 单点登录(SSO)的实现:

OIDC使得实现跨多个应用和服务的单点登录(SSO)成为可能。用户可以登录一次,然后在多个服务间无缝切换,而不需要重复认证。

  1. 互操作性和兼容性:

由于OIDC是基于OAuth 2.0构建的开放标准,不同的服务可以建立在这个标准之上,保证了他们之间可以互相兼容和交互。

  1. 有关用户身份的附加信息:

OIDC的ID令牌是特定格式的JWT,它包含了标准化的、关于用户身份的声明。这意味着使用OIDC的客户端都可以理解和处理这些令牌来识别用户。

  1. 提供方便的用户信息端点:

OIDC还定义了用户信息端点,客户端应用可以使用访问令牌来获取关于用户的更详细的信息。

总的来说,JWT是用于编码和传输声明的一种方式,而OpenID Connect是一个更全面的身份验证协议,它使用JWT作为令牌的形式,并提供了一个全面的认证和用户身份信息的获取框架。即使在拥有JWT的情况下,还是需要OIDC来提供一致、标准化的身份验证过程,特别是在需要单点登录和易于互操作性的场景中。

实现了OpenID Connect(OIDC)就不太需要OAuth 2.0了?

这个说法不完全准确。实际上,OpenID Connect(OIDC)是建立在OAuth 2.0协议之上的身份认证标准。也就是说,在实现了OpenID Connect的身份验证基础上,仍然需要OAuth 2.0来处理授权。
  OpenID Connect 增加了一些特性和一个新的令牌(即ID令牌),用于验证用户的身份。而OAuth 2.0则关注于授权,即允许应用代表用户执行操作或访问其信息。OIDC 的目的是解答"你是谁"(认证用户身份),OAuth 2.0 的目的是解答"你能做什么"(授权第三方应用访问资源)。

这里有个类比:

  • OIDC 就像护照,可以证明你的身份。

  • OAuth 2.0 就像签证,授权你进入某个国家并在那里进行一定的活动。

总结来说:

  • 如果你只需要认证用户(例如,允许用户登录应用),OpenID Connect 提供了一个完善的解决方案。

  • 如果你需要让用户给第三方应用授权访问其在你应用上的数据,你就需要实现 OAuth 2.0。

  • 在很多情况下,实现了 OpenID Connect 通常意味着你已经涵盖了 OAuth 2.0 的授权部分。

因此,实现 OpenID Connect 的同时仍然需要 OAuth 2.0 的机制,OpenID Connect 仅仅是在 OAuth 2.0 的基础上增加了一层身份验证。

集成

OpenID和OAuth 2.0以及RBAC集成场景

OpenID Connect、OAuth 2.0 和 RBAC(基于角色的访问控制)通常在现代应用生态系统中一起使用,以提供安全的身份验证和授权。下面是它们通常集成的几种场景:

单点登录(SSO)和服务访问控制:

  • 企业需要为员工提供单点登录(SSO)到多种内部和外部服务。
  • 使用OpenID Connect来验证用户身份,并且建立一个会话,用户可以无缝访问其他服务。
  • 一旦用户通过OpenID Connect登录,系统可以使用OAuth 2.0让其他服务代表该用户取得访问资源的权限。
  • RBAC用来控制一旦用户访问一个服务之后,他们拥有哪些权限,确定他们能在服务中完成什么操作。

第三方应用访问:

  • 一个服务想要让用户能安全地将它们的数据分享给第三方应用(如社交应用、数据分析工具等)。
  • OAuth 2.0提供了用户可以授权第三方应用访问其在一个服务中的数据的机制,而用户不必分享他们的登录凭证。
  • OpenID Connect可以用来为这些第三方应用提供身份验证服务。
  • 使用RBAC来限制第三方应用可以访问的数据和可以进行的操作的范围。

微服务架构和API保护:

  • 在微服务架构中,服务间需要相互认证并授权请求。
  • OpenID Connect可以为服务提供统一的身份认证机制。
  • OAuth 2.0用于在不同服务之间安全地传递访问令牌,允许服务代表用户执行操作。
  • RBAC确保即使有了访问令牌,每个服务也只能根据角色执行允许的操作。

云基础设施访问管理:

  • 在云计算环境中,员工需要访问云服务和资源进行日常操作。
  • OpenID Connect用于验证员工的身份,提供云管理控制面板的访问。
  • OAuth 2.0可以用来为自动化工具和CI/CD流水线提供访问云API的令牌。
  • RBAC用于控制员工对云资源的访问权限,确保遵循最小权限原则,只给予必要的访问权限。

企业客户面板和资源管理:

  • 企业可能为客户提供在线平台来管理帐户、服务或资源。
  • 通过OpenID Connect实现客户的身份验证,并为客户提供通过其他服务的透明访问。
  • 使用OAuth 2.0让客户能够安全地把他们在一个服务中的数据分享给企业所提供的其他服务。
  • 运用RBAC来细粒度控制客户对不同模块和功能的访问权限。

综上所述,这三种技术完美地相互补充,共同构建了现代互联网服务中的认证和授权体系。

LDAP & OAuth 2.0 & RBAC

想集成LDAP (轻量级目录访问协议) 以进行身份验证,实际上是在解决身份验证的问题,而非授权问题。

LDAP常被用作身份验证服务,它允许用户使用单一的凭据(如用户名和密码)来访问多个系统。

身份验证(Authentication) 是指确认用户的身份,即用户是谁,而授权(Authorization) 是指给已经认证的用户分配权限,即用户可以做什么。

  • RBAC(基于角色的访问控制) 是一种授权管理方法。在用户被成功认证之后,系统会根据预先定义好的角色和策略决定用户可以访问哪些资源。也就是说,RBAC更关注于将权限分配给已经认证的用户。

  • OAuth 2.0 是一种授权框架,它允许第三方应用在用户授权后访问其在另一个服务上的账户信息。OAuth 2.0 很适合跨应用和服务间的场景,特别是涉及到API访问时。

  • LDAP 是目录服务协议,它可以在身份验证环节用于验证用户的身份。在Kubernetes环境中,LDAP可以作为一个集中的用户信息存储库,提供凭据验证服务。

当目的是要验证用户的身份并且组织中已经使用LDAP作为身份信息的源时,应该集成LDAP以实现身份验证。

一旦用户通过LDAP验证,可以使用RBAC来为这些已认证的用户分配和管理权限,以确定他们可以在系统中执行哪些操作。

如果服务涉及第三方应用授权访问应用中用户的私有数据时,可能需要集成OAuth 2.0。在此情况下,用户首先通过LDAP进行身份验证,然后通过OAuth 2.0协议给在系统中注册的第三方应用授权。

在Kubernetes环境中,这通常意味着:

  1. 对于身份验证 ,可以使用LDAP,通过集成LDAP身份验证策略,通常是通过 Webhook Token 认证 或自定义的身份验证代理。

  2. 对于授权,可以继续使用Kubernetes内置的RBAC机制。一旦用户通过LDAP成功认证,Kubernetes API Server 将参照 RBAC 策略来决定用户可以执行哪些操作。

要集成LDAP认证到Kubernetes中,您可能需要使用第三方身份验证代理如 Dex,它作为身份验证中间件支持多种插件(包括LDAP),并与Kubernetes原生的RBAC规则插入结合起来。

LDAP & OpenID Connect 集成

LDAP认证基础上与OpenID Connect集成,可以采取以下步骤:

  1. 选择身份和访问管理解决方案:

选择支持LDAP和OpenID Connect的身份和访问管理解决方案。这些解决方案可以作为认证服务器,管理身份验证流程,提供OpenID Connect令牌,并能连接到LDAP服务器进行用户验证。

  1. 配置连接LDAP服务器:

在所选的解决方案中配置LDAP连接器,连接到现有LDAP服务器。这通常涉及设置LDAP服务器的地址、绑定账户、搜索用户的基础DN(Distinguished Name),以及其他LDAP特有的配置。

  1. 设置OpenID Connect提供者:

将身份和访问管理解决方案配置为OpenID Connect提供者。这通常包括创建OpenID Connect客户端,设置回调URL,以及配置其他OpenID Connect标准所需的元数据。

  1. 创建客户端应用:

对于要接入LDAP认证服务的每个客户端应用,创建相应的OpenID Connect客户端配置。这包括指定客户端ID、秘钥和已授权的重定向URI。

  1. 函数和客户端集成:

修改或更新客户端应用的认证函数,使之使用OpenID Connect。这涉及到重定向到OpenID Connect提供者的认证端点,处理认证后的回调,以及可能的token验证和用户信息请求。

  1. 涉及用户和组映射:

如果必要,设立系统内用户和LDAP用户的映射规则,确保正确的权限分配。这是在身份和访问管理解决方案中完成的,例如,需要确保OAuth令牌包含正确的LDAP属性,这些属性将用来在客户端应用中映射到相应的用户角色。

  1. 测试和验证:

在将整个系统部署到生产环境之前,进行细致的测试,确保LDAP认证、OpenID Connect流程以及权限映射无误。
   一个常见的身份和访问管理解决方案是Dex。Dex是一个能够与多种身份验证提供者和协议集成的认证服务,包括OpenID Connect和LDAP。Dex作为一个立足于您的身份验证架构中间的代理,允许您的用户使用LDAP凭证通过OpenID Connect身份验证到各种应用程序。
   Keycloak也是另一个流行的开源身份和访问管理解决方案,它同时支持LDAP和OpenID Connect,并可以与现有的LDAP基础设施集成。
   确保了解所选择的身份和访问管理解决方案的安全实践和配置细节,适当时咨询相关文档或专业人士,以确保正确、安全地集成LDAP和OpenID Connect。
   Dex 和 Keycloak 都不是 Go 语言的类库,而是独立的身份管理服务,它们可以在基础设施中作为单独的组件运行。它们都提供与 OpenID Connect (OIDC) 兼容的身份验证功能,并且可以与其他系统如 Kubernetes 或任何支持 OIDC 的应用进行集成。

Dex & Keycloak

Dex:

Dex 是使用 Go 语言编写的用于身份验证的代理,为各种客户端提供 OpenID Connect (OIDC) 和 OAuth 2.0 协议的支持。它通常被作为在 Kubernetes 集群内部或企业内部的身份验证提供者,可与 LDAP、SAML、GitHub、Google 等第三方身份提供者进行集成。虽然它是用 Go 语言编写的,但它主要以独立服务的形式提供,而不是作为库来集成到 Go 应用程序中。

Keycloak:

Keycloak 是一个开源的身份和访问管理服务,提供了身份验证和授权的解决方案,并支持多种登录协议,包括 OpenID Connect、OAuth 2.0 和 SAML 2.0。Keycloak 是用 Java 语言编写的,可以集成各种用户存储,比如 LDAP 和 Active Directory。它可以作为独立的服务运行,并且具有一个丰富的管理界面和强大的功能,如用户管理、分组、角色、客户端管理等。

使用场景:

  • 如果正在开发 Go 应用并希望与 OpenID Connect 或 OAuth 2.0 服务进行集成,可能会使用到像 golang.org/x/oauth2github.com/coreos/go-oidc 这样的 Go 类库。

  • 如果需要一个包括用户管理、身份验证和授权的完整解决方案,Dex 和 Keycloak 支持跨多个平台和应用程序,并可集成存储,如 LDAP 等。

尽管 Dex 和 Keycloak 都不是 Go 类库,但 Go 应用程序可以作为 OIDC 的客户端,使用这些服务进行用户身份验证和授权管理。在 Kubernetes 环境中,例如,在使用 RBAC 时,Dex 或 Keycloak 可以对用户进行身份验证,然后 Kubernetes 可以判断用户是否有权执行某项操作。

OpenID Connect & LDAP认证 集成

OpenID Connect 是一种身份验证层,它构建在 OAuth 2.0 协议之上,而 LDAP (轻量级目录访问协议) 是一个广泛使用的协议,用于访问和维护分布式目录信息服务。当希望使用 OpenID Connect 进行身份验证,同时依赖 LDAP 作为用户身份的来源时,将需要一个中间的服务或代理来桥接二者。这个服务需要支持 OpenID Connect (作为身份提供者) 并能够使用 LDAP 协议与用户目录进行通信

要实现 OpenID Connect 到 LDAP 的集成,可以按照以下步骤操作:

  1. 选择合适的代理或身份与访问管理 (IAM) 解决方案:

需要找到支持 OpenID Connect 的代理或身份与访问管理系统,例如 Keycloak、Dex、Gluu Server、FreeIPA 等。这些都是流行的解决方案,可以作为 OpenID Connect 提供者,并可以配置为使用 LDAP 作为用户信息的后端。

  1. 配置 LDAP 连接器:

在选择的 IAM 解决方案中,配置 LDAP 连接器以连接到您的现有 LDAP 服务器。这通常包括指定 LDAP 服务器的 URL、绑定用户 DN(Distinguished Name)、用户搜索基准、组搜索基准、用户属性映射等。

  1. 设置 OpenID Connect 提供者:

在 IAM 解决方案中启用并配置 OpenID Connect 提供者功能。这涉及到定义客户端、设置客户端 ID 和秘钥、以及定义客户端支持的回调 URL。

  1. 安全和协议符合性:

确保 IAM 解决方案遵守 OpenID Connect 规范,特别是关于加密和令牌的安全规范。

  1. 客户端集成:

更新客户端应用程序以使用 OpenID Connect 进行身份验证。这包括将客户端应用程序重定向到 IAM 解决方案的 OpenID Connect 登录页面,处理认证响应,以及验证 ID 令牌。

  1. 测试和验证:

完成配置后,需要仔细测试整个流程,以确保用户可以通过 LDAP 凭证成功地通过 OpenID Connect 登录,并且客户端应用程序可以正确处理身份验证流程。
   使用如 Keycloak 这样的 IAM 解决方案,可以轻松地将 OpenID Connect 协议和 LDAP 身份验证相结合。Keycloak 作为中间身份提供者,处理 OpenID Connect 的互动流程,并在内部通过 LDAP 验证用户的凭证。这样,用户就可以使用他们在 LDAP 中的同一套凭证在支持 OpenID Connect 的客户端应用程序中进行身份验证。

OpenID Connect的代理或者访问管理系统

OpenID Connect(OIDC)代理和访问管理系统通常由专业的安全和身份管理公司或社区开发。这些系统通常作为开源项目或商业产品提供,开发它们需要专业的知识,包括安全协议、加密、网络身份验证和授权等方面。

以下是一些开发并提供OpenID Connect身份认证和访问管理解决方案的示例:

  1. Keycloak:

Keycloak由Red Hat开发,它是一个开源的身份和访问管理解决方案,提供了身份验证和授权的功能,并支持多种登录协议,包括OIDC、OAuth 2.0和SAML。

  1. Dex:

Dex最初由CoreOS团队开发,后来成为一个社区项目。它是一个使用Go语言编写的身份服务,提供OpenID Connect支持,并可以通过插件集成多种登录系统,包括LDAP、SAML以及社交网络等。

  1. Auth0:

Auth0是一个商业化的身份认证平台,为开发人员提供OIDC和OAuth 2.0的服务,它支持企业级身份提供者,如Active Directory、LDAP以及社交登录等。

  1. Gluu Server:

Gluu是一个开源的身份和访问管理平台,支持OIDC、OAuth 2.0、UMA(User Managed Access)和SAML等协议。

  1. Okta:

Okta是以服务形式提供的商业化身份管理解决方案,提供强大的OIDC和OAuth 2.0支持,并整合了大量的企业和社交身份。

  1. Ping Identity:

Ping Identity提供了包括OIDC在内的商业化身份管理解决方案,帮助企业实现安全的客户端认证和单点登录。
   开发这样的OIDC解决方案通常需要专门的安全专家、网络工程师和软件开发人员的紧密合作。由于身份提供者对任何网络应用和服务的安全性至关重要,因此对这些系统的开发和维护都要求很高的专业水准。
   在选择适合自己组织的身份管理解决方案时,通常需要考虑该解决方案是否满足组织的安全、可用性和可扩展性需求。此外,还需要根据组织内部的技术栈和偏好选择支持适合的集成方式和协议。对大多数组织来说,采用成熟的现有解决方案通常是实现OIDC集成的最有效路径。

K8S 集成 RBAC

在Kubernetes(k8s)中集成现有的RBAC系统,可以通过多种认证和授权机制来实现。Kubernetes的认证和授权是两个独立的过程:

  1. 认证(Authentication) --- 确定用户是谁。

  2. 授权(Authorization) --- 确定用户可以做什么。

认证 (Authentication)

Kubernetes支持多种认证策略,包括:
  - 客户端证书认证

- 静态令牌文件

- 引导令牌(Bootstrap Tokens)

- 静态密码文件

- 服务帐户令牌

- OpenID Connect Tokens

- Webhook Token 认证

- 认证代理(Authenticating Proxy)

为了集成现有的RBAC系统,会考虑使用OpenID Connect Tokens, Webhook Token 认证, 或者认证代理。

  1. OpenID Connect Tokens 可以利用现有的身份提供者进行身份验证。

  2. Webhook Token 认证 允许制定自己的认证逻辑,并让Kubernetes API服务器在每次认证请求时调用你的服务。

  3. 认证代理 允许你使用一个代理服务来处理认证,代理决定是否允许请求并将结果通知到Kubernetes。

授权 (Authorization)

Kubernetes有几种授权模块:

- Node - 特殊用途的授权策略,由kubelet自动使用。

- ABAC(基于属性的访问控制)- 使用用户配置的策略。

- RBAC(基于角色的访问控制)- 使用Kubernetes的角色和角色绑定资源。

- Webhook - 使用远程服务进行授权决策。
  如果已经拥有一个现有的RBAC系统,如一个现有企业的访问控制系统,则通常会实现一个Webhook服务器,它将接收授权检查请求,并利用现有的RBAC机制来决定是否允许请求。

以下是在Kubernetes中使用Webhook模式集成现有RBAC的大致步骤:

  1. 部署Webhook服务器 - 你的Webhook服务器需要能访问现有的RBAC系统,并为Kubernetes API服务器提供授权决策。

  2. 配置Kubernetes - 在Kubernetes API服务器上,你需要配置授权模块为Webhook,并指明Webhook服务器的URL。

/etc/kubernetes/manifests/kube-apiserver.yaml中配置Webhook授权模式:

yaml 复制代码
apiVersion: v1

kind: Pod

metadata:

...

spec:

containers:

- name: kube-apiserver

...

command:

- kube-apiserver

...

- --authorization-mode=Webhook

- --authorization-webhook-config-file=/path/to/webhook/config/file

...
  1. 配置Webhook服务器 的文件通常包含了Webhook服务器的URL、客户端证书等信息,以便API服务器能够安全地与Webhook服务器通信。

例如,Webhook配置文件webhook-config.yaml可能看起来类似这样:

yaml 复制代码
# webhook-config.yaml

apiVersion: v1

kind: Config

clusters:

- name: webhook

cluster:

certificate-authority: /path/to/ca.pem

server: https://webhook-server.example.com/authorize

contexts:

- context:

cluster: webhook

user: apiserver

name: apiserver_to_webhook

current-context: apiserver_to_webhook

users:

- name: apiserver

user:

client-certificate: /path/to/cert.pem

client-key: /path/to/key.pem

在部署了Webhook服务器并正确配置了Kubernetes API服务器之后,Kubernetes会将请求发送到Webhook服务器进行授权决策,由Webhook服务器依据现有的RBAC系统来授予或拒绝权限。

相关推荐
也无晴也无风雨36 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
颜淡慕潇5 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
独泪了无痕6 小时前
WebStorm 如何调试 Vue 项目
后端·webstorm
mit6.8246 小时前
[Docker#4] 镜像仓库 | 部分常用命令
linux·运维·docker·容器·架构
怒放吧德德7 小时前
JUC从实战到源码:JMM总得认识一下吧
java·jvm·后端
代码小鑫7 小时前
A025-基于SpringBoot的售楼管理系统的设计与实现
java·开发语言·spring boot·后端·毕业设计
前端SkyRain7 小时前
后端SpringBoot学习项目-项目基础搭建
spring boot·后端·学习
梦想画家7 小时前
理解Rust 生命周期、所有权和借用机制
开发语言·后端·rust