8.4. 使用基于 OAuth 2.0 令牌的身份验证
AMQ Streams 支持使用 OAUTHBEARER 和 PLAIN 机制使用 OAuth 2.0 身份验证。
OAuth 2.0 启用应用程序之间的基于令牌的标准化身份验证和授权,使用中央授权服务器签发对资源有限访问权限的令牌。
您可以配置 OAuth 2.0 身份验证,然后配置 OAuth 2.0 授权。
Kafka 代理和客户端都需要配置为使用 OAuth 2.0。OAuth 2.0 身份验证也可以与 简单
或基于 OPA 的 Kafka 授权 一起使用。
使用基于 OAuth 2.0 令牌的身份验证时,应用程序客户端可以访问应用服务器(称为 资源服务器)上的资源,而无需公开帐户凭证。
应用程序客户端通过访问令牌作为身份验证方法传递,应用服务器也可以用来决定要授予的访问权限级别。授权服务器处理访问权限的授予和关注访问权限的查询。
在 AMQ Streams 上下文中:
- Kafka 代理充当 OAuth 2.0 资源服务器
- Kafka 客户端充当 OAuth 2.0 应用程序客户端
Kafka 客户端在 Kafka 代理验证。代理和客户端根据需要与 OAuth 2.0 授权服务器通信,以获取或验证访问令牌。
对于 AMQ Streams 的部署,OAuth 2.0 集成提供:
- Kafka 代理的服务器端 OAuth 2.0 支持
- 对 Kafka MirrorMaker、Kafka Connect 和 Kafka Bridge 的客户端 OAuth 2.0 支持
8.4.1. OAuth 2.0 身份验证机制 复制链接链接已复制到粘贴板!
AMQ Streams 支持 OAUTHBEARER 和 PLAIN 机制进行 OAuth 2.0 身份验证。两个机制都允许 Kafka 客户端与 Kafka 代理建立经过身份验证的会话。客户端、授权服务器和 Kafka 代理之间的身份验证流因每种机制而异。
我们建议您将客户端配置为尽可能使用 OAUTHBEARER。OAUTHBEARER 提供比 PLAIN 更高的安全性,因为客户端凭证不会与 Kafka 代理共享。考虑仅在不支持 OAUTHBEARER 的 Kafka 客户端中使用 PLAIN。
您可以将 Kafka 代理监听程序配置为使用 OAuth 2.0 身份验证来连接客户端。如果需要,您可以在同一 oauth
侦听器上使用 OAUTHBEARER 和 PLAIN 机制。必须支持每个机制的属性必须在 oauth
侦听器配置中明确指定。
OAUTHBEARER 概述
OAUTHBEARER 在 oauth
侦听器配置中自动启用用于 Kafka 代理。您可以将 enableOauthBearer
属性设置为 true
,但这不是必需的。
# ... authentication: type: oauth # ... enableOauthBearer: true
# ...
authentication:
type: oauth
# ...
enableOauthBearer: true
许多 Kafka 客户端工具使用在协议级别为 OAUTHBEARER 提供基本支持的库。为了支持应用程序开发,AMQ Streams 为上游 Kafka Client Java 库(但不适用于其他库)提供了一个 OAuth 回调处理器。因此,您不需要编写自己的回调处理程序。应用程序客户端可以使用回调处理程序来提供访问令牌。使用 Go 等其他语言编写的客户端必须使用自定义代码连接到授权服务器并获取访问令牌。
使用 OAUTHBEARER 时,客户端使用 Kafka 代理启动会话,用于凭证交换,其中凭证采用回调处理器提供的 bearer 令牌形式。使用回调,您可以使用三种方式配置令牌置备:
- 客户端 ID 和 Secret (通过使用 OAuth 2.0 客户端凭证 机制)
- 长期访问令牌,在配置时手动获取
- 长期刷新令牌,在配置时手动获取
OAUTHBEARER 身份验证只能由支持协议级别的 OAUTHBEARER 机制的 Kafka 客户端使用。
PLAIN 概述
要使用 PLAIN,您必须在 Kafka 代理的 oauth
侦听器配置中启用它。
在以下示例中,除了 OAUTHBEARER 外,还启用了 PLAIN,这默认是启用的。如果只使用 PLAIN,可以通过将 enableOauthBearer
设置为 false
来禁用 OAUTHBEARER。
PLAIN 是所有 Kafka 客户端工具使用的简单身份验证机制。要启用 PLAIN 以用于 OAuth 2.0 身份验证,AMQ Streams 提供了 OAuth 2.0 over PLAIN 服务器端的回调。
对于 PLAIN 的 AMQ Streams 实现,客户端凭证不会存储在 ZooKeeper 中。相反,客户端凭证会在兼容授权服务器后进行集中处理,这与使用 OAUTHBEARER 身份验证类似。
当与 OAuth 2.0 over PLAIN 回调一起使用时,Kafka 客户端使用以下方法之一与 Kafka 代理进行身份验证:
- 客户端 ID 和 secret (通过使用 OAuth 2.0 客户端凭证机制)
- 长期访问令牌,在配置时手动获取
对于这两种方法,客户端必须提供 PLAIN username
和 password
属性,将凭证传递给 Kafka 代理。客户端使用这些属性传递客户端 ID 和机密或用户名和访问令牌。
客户端 ID 和 secret 用于获取访问令牌。
访问令牌作为 password
属性值传递。您可以使用或不使用 $accessToken:
前缀传递访问令牌。
-
如果您在监听器配置中配置了令牌端点(
tokenEndpointUri
),则需要前缀。 -
如果您没有在监听器配置中配置令牌端点(
tokenEndpointUri
),则不需要前缀。Kafka 代理将密码解释为原始访问令牌。
如果 密码设置为
访问令牌,则必须将 用户名
设置为 Kafka 代理从访问令牌获取的同一主体名称。您可以使用 userNameClaim
,fallbackUserNameClaim
,fallbackUsernamePrefix
, 和 userInfoEndpointUri
属性在监听器中指定用户名提取选项。用户名提取过程还取决于您的授权服务器;特别是,它将客户端 ID 映射到帐户名称。
使用 PLAIN 的 OAuth 不支持 密码
授权机制。您只能通过 SASL PLAIN 机制对 客户端凭证
(clientId + secret)或访问令牌进行"proxy"机制,如上所述。
8.4.2. OAuth 2.0 Kafka 代理配置 复制链接链接已复制到粘贴板!
OAuth 2.0 的 Kafka 代理配置涉及:
- 在授权服务器中创建 OAuth 2.0 客户端
- 在 Kafka 自定义资源中配置 OAuth 2.0 身份验证
与授权服务器相关,Kafka 代理和 Kafka 客户端都被视为 OAuth 2.0 客户端。
8.4.2.1. 授权服务器上的 OAuth 2.0 客户端配置 复制链接链接已复制到粘贴板!
要配置 Kafka 代理以验证会话启动期间收到的令牌,建议的做法是在授权服务器中创建一个 OAuth 2.0 client 定义(配置为 confidential),并启用了以下客户端凭证:
-
客户端 ID 为
kafka
(例如) - 客户端 ID 和 Secret 作为身份验证机制
在使用授权服务器的非公共内省端点时,您只需要使用客户端 ID 和 secret。使用公共授权服务器端点时通常不需要凭据,就像快速本地 JWT 令牌验证一样。
8.4.2.2. Kafka 集群中的 OAuth 2.0 身份验证配置 复制链接链接已复制到粘贴板!
要在 Kafka 集群中使用 OAuth 2.0 身份验证,您可以使用身份验证方法 oauth
指定 Kafka 集群自定义资源的 tls
侦听器配置:
评估 OAuth 2.0 的身份验证方法类型
您可以在监听程序中配置 OAuth 2.0 身份验证。我们建议将 OAuth 2.0 身份验证与 TLS 加密一起使用(tls: true
)。如果没有加密,连接容易通过令牌偏移而受到网络伪造和未授权访问的影响。
为安全传输层配置带有 type: oauth
的 外部监听程序
,以便与客户端通信。
使用带有外部监听程序的 OAuth 2.0
tls
属性默认为 false,因此必须启用它。
当您将验证类型定义为 OAuth 2.0 时,您可以根据验证类型添加配置,可以是 fast local JWT validation 或 token validation using an introspection endpoint。
为监听器配置 OAuth 2.0 的步骤,带有描述和示例,请参考 为 Kafka 代理配置 OAuth 2.0 支持。
8.4.2.3. 快速本地 JWT 令牌验证配置 复制链接链接已复制到粘贴板!
快速本地 JWT 令牌验证在本地检查 JWT 令牌签名。
本地检查可确保令牌:
-
通过包含访问令牌的
Bearer
的(typ)声明值来达到类型 - 有效(未过期)
-
具有与
validIssuerURI
匹配的签发者
在配置监听程序时,您可以指定 validIssuerURI
属性,以便授权服务器未签发的任何令牌都会被拒绝。
授权服务器不需要在快速本地 JWT 令牌验证期间联系。您可以通过指定 jwksEndpointUri
属性(OAuth 2.0 授权服务器公开的端点)来激活快速本地 JWT 令牌验证。端点包含验证已签名的 JWT 令牌的公钥,这些令牌由 Kafka 客户端作为凭证发送。
所有与授权服务器的通信都应该使用 TLS 加密来执行。
您可以在 AMQ Streams 项目命名空间中将证书信任存储配置为 OpenShift Secret,并使用 tlsTrustedCertificates
属性指向包含 truststore 文件的 OpenShift Secret。
您可能想要配置 userNameClaim
,以从 JWT 令牌正确提取用户名。如果要使用 Kafka ACL 授权,则需要在身份验证过程中通过用户名识别用户。(JWT 令牌中的 子
声明通常是唯一的 ID,而不是用户名。)
快速本地 JWT 令牌验证配置示例
8.4.2.4. OAuth 2.0 内省端点配置 复制链接链接已复制到粘贴板!
使用 OAuth 2.0 内省端点验证令牌会将收到的访问令牌视为不透明。Kafka 代理向内省端点发送访问令牌,该端点使用验证所需的令牌信息进行响应。最重要的是,如果特定的访问令牌有效,它会返回最新的信息,以及令牌何时到期的信息。
要配置基于 OAuth 2.0 内省的验证,您可以指定一个 introspectionEndpointUri
属性,而不是为快速本地 JWT 令牌验证指定的 jwksEndpointUri
属性。根据授权服务器,通常必须指定 clientId
和 clientSecret
,因为内省端点通常受到保护。
内省端点配置示例
8.4.3. Kafka 代理的会话重新身份验证 复制链接链接已复制到粘贴板!
您可以将 oauth
侦听器配置为使用 Kafka 会话重新身份验证 Kafka 客户端和 Kafka 代理之间的 OAuth 2.0 会话。这种机制在定义的时间段内强制实施客户端和代理之间经过身份验证的会话的到期。当会话过期时,客户端会立即使用现有连接而不是丢弃它来启动新的会话。
会话重新身份验证默认被禁用。要启用它,您可以在 oauth
侦听器配置中为 maxSecondsWithoutReauthentication
设置时间值。相同的属性用于为 OAUTHBEARER 和 PLAIN 身份验证配置会话重新身份验证。有关配置示例,请参阅 第 8.4.6.2 节 “为 Kafka 代理配置 OAuth 2.0 支持”。
会话重新身份验证必须由客户端使用的 Kafka 客户端库支持。
会话重新身份验证可用于快速 本地 JWT 或 内省端点 令牌验证。
客户端重新身份验证
当代理的经过身份验证的会话过期时,客户端必须通过向代理发送新的有效的访问令牌来重新验证现有的会话。
如果令牌验证成功,则使用现有连接启动新的客户端会话。如果客户端无法重新验证,代理会在进一步尝试发送或接收消息时关闭连接。如果在代理上启用了重新身份验证机制,使用 Kafka 客户端库 2.2 或更高版本的 Java 客户端会自动重新验证。
如果使用,会话重新身份验证也适用于刷新令牌。当会话过期时,客户端会使用其刷新令牌来刷新访问令牌。然后,客户端使用新的访问令牌重新验证现有会话。
OAUTHBEARER 和 PLAIN 的会话过期
配置会话重新身份验证后,对于 OAUTHBEARER 和 PLAIN 身份验证,会话到期会有所不同。
对于 OAUTHBEARER 和 PLAIN,使用客户端 ID 和 secret 方法:
-
代理的经过身份验证的用户会话将在配置的
maxSeconds withoutReauthentication
下过期。 - 如果访问令牌在配置时间之前过期,则会话将过期。
对于使用长期访问令牌方法的 PLAIN:
-
代理的经过身份验证的用户会话将在配置的
maxSeconds withoutReauthentication
下过期。 - 如果访问令牌在配置时间之前过期,则重新身份验证将失败。虽然尝试会话重新身份验证,但 PLAIN 没有刷新令牌的机制。
如果没有配置 maxSecondsWithoutReauthentication
,OAUTHBEARER 和 PLAIN 客户端可以无限期地连接到代理,而无需重新验证。经过身份验证的会话不会以访问令牌到期结尾。但是,这可以在配置授权时考虑,例如使用 keycloak
授权或安装自定义授权器。
8.4.4. OAuth 2.0 Kafka 客户端配置 复制链接链接已复制到粘贴板!
Kafka 客户端配置有:
- 从授权服务器获取有效访问令牌(客户端 ID 和 Secret)所需的凭证
- 使用授权服务器提供的工具获取有效的长期访问令牌或刷新令牌
发送到 Kafka 代理的唯一信息是一个访问令牌。用于与授权服务器进行身份验证的凭证从不会发送到代理。
当客户端获取访问令牌时,不需要进一步与授权服务器通信。
最简单的机制是使用客户端 ID 和 Secret 进行身份验证。使用长期的访问令牌或长期的刷新令牌会增加复杂性,因为对授权服务器工具还有额外的依赖。
如果您使用长期访问令牌,您可能需要在授权服务器中配置客户端,以增加令牌的最大生命周期。
如果 Kafka 客户端没有直接配置访问令牌,客户端会在 Kafka 会话发起授权服务器的过程中交换访问令牌的凭证。Kafka 客户端交换:
- 客户端 ID 和 Secret
- 客户端 ID、刷新令牌和(可选)secret
- 用户名和密码,带有客户端 ID 和(可选)secret
8.4.5. OAuth 2.0 客户端身份验证流程 复制链接链接已复制到粘贴板!
OAuth 2.0 身份验证流程取决于底层 Kafka 客户端和 Kafka 代理配置。该流还必须被使用的授权服务器支持。
Kafka 代理侦听器配置决定了客户端如何使用访问令牌进行身份验证。客户端可以传递客户端 ID 和机密来请求访问令牌。
如果侦听器配置为使用 PLAIN 身份验证,客户端可以通过客户端 ID 和 secret 或用户名和访问令牌进行身份验证。这些值作为 PLAIN 机制 username
和 password
属性传递。
侦听器配置支持以下令牌验证选项:
- 您可以使用基于 JWT 签名检查和本地令牌内省的快速本地令牌验证,而无需联系授权服务器。授权服务器提供带有公共证书的 JWKS 端点,用于验证令牌中的签名。
- 您可以使用对授权服务器提供的令牌内省端点的调用。每次建立新的 Kafka 代理连接时,代理都会将从客户端收到的访问令牌传递给授权服务器。Kafka 代理检查响应以确认令牌是否有效。
授权服务器可能只允许使用不透明访问令牌,这意味着无法进行本地令牌验证。
Kafka 客户端凭证也可以为以下类型的身份验证配置:
- 使用之前生成的长期访问令牌直接进行本地访问
- 与授权服务器联系以获取要发布的新访问令牌(使用客户端 ID 和 secret、刷新令牌或用户名和密码)
8.4.5.1. 使用 SASL OAUTHBEARER 机制的客户端身份验证流示例 复制链接链接已复制到粘贴板!
您可以使用 SASL OAUTHBEARER 机制将以下通信流用于 Kafka 身份验证。
使用客户端 ID 和 secret 的客户端,并将代理委派给授权服务器
- Kafka 客户端使用客户端 ID 和 secret 从授权服务器请求访问令牌,以及可选的刷新令牌。或者,客户端也可以使用用户名和密码进行身份验证。
- 授权服务器生成新的访问令牌。
- Kafka 客户端使用 SASL OAUTHBEARER 机制通过访问令牌通过 Kafka 代理进行身份验证。
- Kafka 代理通过使用自己的客户端 ID 和 secret,在授权服务器上调用令牌内省端点来验证访问令牌。
- 如果令牌有效,则会建立 Kafka 客户端会话。
使用客户端 ID 和 secret 的客户端以及执行快速本地令牌验证的代理
- Kafka 客户端使用令牌端点、使用客户端 ID 和 secret 以及刷新令牌(可选)从令牌端点验证。或者,客户端也可以使用用户名和密码进行身份验证。
- 授权服务器生成新的访问令牌。
- Kafka 客户端使用 SASL OAUTHBEARER 机制通过访问令牌通过 Kafka 代理进行身份验证。
- Kafka 代理使用 JWT 令牌签名检查和本地令牌内省在本地验证访问令牌。
使用长期访问令牌的客户端,并将代理委派给授权服务器
- Kafka 客户端使用 SASL OAUTHBEARER 机制通过 Kafka 代理进行身份验证,以传递长期访问令牌。
- Kafka 代理通过使用自己的客户端 ID 和 secret,在授权服务器上调用令牌内省端点来验证访问令牌。
- 如果令牌有效,则会建立 Kafka 客户端会话。
使用长期访问令牌的客户端,以及执行快速本地验证的代理
- Kafka 客户端使用 SASL OAUTHBEARER 机制通过 Kafka 代理进行身份验证,以传递长期访问令牌。
- Kafka 代理使用 JWT 令牌签名检查和本地令牌内省在本地验证访问令牌。
快速的本地 JWT 令牌签名验证仅适用于短期的令牌,因为如果已撤销令牌,就不会通过授权服务器检查该授权服务器。令牌到期时间写入到令牌,但可以随时进行撤销,因此不能在不联系授权服务器的情况下被考虑。任何发布的令牌都将被视为有效,直到其过期为止。
8.4.5.2. 使用 SASL PLAIN 机制的客户端身份验证流示例 复制链接链接已复制到粘贴板!
您可以使用 OAuth PLAIN 机制将以下通信流用于 Kafka 身份验证。
使用客户端 ID 和 secret 的客户端以及代理获取客户端的访问令牌
-
Kafka 客户端或传递一个
clientId
作为用户名,以及一个secret
作为密码。 -
Kafka 代理使用令牌端点将
clientId
和secret
传递给授权服务器。 - 如果客户端凭据无效,授权服务器会返回一个新的访问令牌或错误。
Kafka 代理使用以下方法之一验证令牌:
- 如果指定了令牌内省端点,Kafka 代理通过在授权服务器上调用端点来验证访问令牌。如果令牌验证成功,则会建立会话。
- 如果使用本地令牌内省,则不会向授权服务器发出请求。Kafka 代理使用 JWT 令牌签名检查在本地验证访问令牌。
使用长期访问令牌(无需客户端 ID 和 secret)的客户端
- Kafka 客户端会传递用户名和密码。密码提供在运行客户端前手动和配置的访问令牌的值。
密码通过或不使用
$accessToken:
字符串前缀来传递,具体取决于 Kafka 代理侦听程序是否配置了令牌端点来进行身份验证。-
如果配置了令牌端点,密码应该以
$accessToken:
前缀,以便代理知道 password 参数包含访问令牌,而不是客户端 secret。Kafka 代理将用户名解释为帐户用户名。 -
如果没有在 Kafka 代理监听器上配置令牌端点(强制使用
no-client-credentials 模式
),密码应提供没有前缀的访问令牌。Kafka 代理将用户名解释为帐户用户名。在此模式中,客户端不使用客户端 ID 和 secret,password
参数始终解释为原始访问令牌。
-
如果配置了令牌端点,密码应该以
Kafka 代理使用以下方法之一验证令牌:
- 如果指定了令牌内省端点,Kafka 代理通过在授权服务器上调用端点来验证访问令牌。如果令牌验证成功,则会建立会话。
- 如果使用本地令牌内省,则不会向授权服务器发出请求。Kafka 代理使用 JWT 令牌签名检查在本地验证访问令牌。
8.4.6. 配置 OAuth 2.0 身份验证 复制链接链接已复制到粘贴板!
OAuth 2.0 用于在 Kafka 客户端和 AMQ Streams 组件间交互。
要将 OAuth 2.0 用于 AMQ Streams,您必须:
8.4.6.1. 配置 OAuth 2.0 授权服务器 复制链接链接已复制到粘贴板!
此流程描述了配置授权服务器以便与 AMQ Streams 集成所需的一般操作。
这些说明不是特定于产品的。
这些步骤取决于所选的授权服务器。有关如何设置 OAuth 2.0 访问的详情,请参考授权服务器的产品文档。
如果您已经部署了授权服务器,您可以跳过部署步骤并使用您当前的部署。
流程
- 将授权服务器部署到集群中。
访问授权服务器的 CLI 或管理控制台,以便为 AMQ Streams 配置 OAuth 2.0。
现在,准备授权服务器以用于 AMQ Streams。
-
配置
kafka-broker
客户端。 - 为应用程序的每个 Kafka 客户端组件配置客户端。
接下来要做什么
部署和配置授权服务器后,将 Kafka 代理配置为使用 OAuth 2.0。
8.4.6.2. 为 Kafka 代理配置 OAuth 2.0 支持 复制链接链接已复制到粘贴板!
此流程描述了如何配置 Kafka 代理,以便代理监听程序可以使用授权服务器使用 OAuth 2.0 身份验证。
我们建议通过带有 tls: true
的监听程序通过加密接口使用 OAuth 2.0。不建议使用普通监听程序。
如果授权服务器使用可信 CA 签名的证书并与 OAuth 2.0 服务器主机名匹配,TLS 连接可使用默认设置。否则,您可能需要使用正确的证书配置信任存储,或者禁用证书主机名验证。
在配置 Kafka 代理时,您可以在新连接的 Kafka 客户端的 OAuth 2.0 身份验证过程中验证访问令牌的机制有两个选项:
开始前
有关为 Kafka 代理监听程序配置 OAuth 2.0 身份验证的更多信息,请参阅:
先决条件
- AMQ Streams 和 Kafka 正在运行
- 部署 OAuth 2.0 授权服务器
流程
在编辑器中更新
Kafka
资源的 Kafka 代理配置(Kafka.spec.kafka
)。oc edit kafka my-cluster
oc edit kafka my-cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置 Kafka 代理
监听程序
配置。每种类型的监听程序的配置不必相同,因为它们是独立的。
此处的示例显示了为外部监听器配置的配置选项。
示例 1:配置快速本地 JWT 令牌验证
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 侦听器类型设置为
oauth
。 - 2
- 用于身份验证的令牌签发者的 URI。
- 3
- 用于本地 JWT 验证的 JWKS 证书端点的 URI。
- 4
- 令牌声明(或密钥)包含令牌中实际用户名。用户名是用于识别用户的 主体。
userNameClaim
值将取决于身份验证流和使用的授权服务器。 - 5
- (可选)激活 Kafka 重新身份验证机制,该机制强制会话到期的时间与访问令牌相同。如果指定的值小于访问令牌过期的时间,那么客户端必须在实际令牌到期前重新验证。默认情况下,当访问令牌过期时,会话不会过期,客户端也不会尝试重新身份验证。
- 6
- (可选)与授权服务器的 TLS 连接的可信证书。
- 7
- (可选)禁用 TLS 主机名验证。默认为
false
。 - 8
- JWKS 证书在过期前被视为有效的持续时间。默认为
360
秒。如果您指定较长的时间,请考虑允许访问撤销的证书的风险。 - 9
- JWKS 证书刷新之间的周期。间隔必须至少为 60 秒,超过到期间隔。默认为
300
秒。 - 10
- 连续尝试刷新 JWKS 公钥之间的最小暂停(以秒为单位)。当遇到未知签名密钥时,JWKS 密钥刷新在常规定期调度后调度,且至少在最后一次刷新尝试后出现指定暂停。刷新密钥遵循 exponential backoff 规则,重试失败的刷新,并增加暂停,直到它到达
jwksRefreshSeconds
。默认值为 1。
示例 2:使用内省端点配置令牌验证
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您如何应用 OAuth 2.0 身份验证以及授权服务器的类型,您可以使用额外的(可选)配置设置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果您的授权服务器不提供
iss
声明,则无法执行签发者检查。在这种情况下,将checkIssuer
设置为false
,且不指定有效的IssuerUri
。默认为true
。 - 2
- 如果您的授权服务器提供
aud
(audience)声明,并且您想要强制进行使用者检查,请将checkAudience
设置为true
。Audience 检查标识令牌的预期接收者。因此,Kafka 代理将拒绝在其aud
声明中没有clientId
的令牌。默认为false
。 - 3
- 授权服务器可能不会提供单个属性来标识常规用户和客户端。当客户端在其自己的名称中进行身份验证时,服务器可能会提供 客户端 ID。当用户使用用户名和密码进行身份验证时,若要获取刷新令牌或访问令牌,除了客户端 ID 外,服务器还提供 username 属性。使用此回退选项指定在主用户 ID 属性不可用时要使用的用户名声明(attribute)。
- 4
- 当有
fallbackUserNameClaim
时,可能还需要防止用户名声明的值和回退用户名声明之间的名称冲突。考虑存在名为producer
的客户端,但也存在名为producer
的普通用户。为了区分两者,您可以使用此属性向客户端的用户 ID 添加前缀。 - 5
- (仅在使用
introspectionEndpointUri
)取决于您使用的授权服务器,内省端点也可能不会返回 令牌 type 属性,或者可能包含不同的值。您可以指定来自内省端点必须包含的有效令牌类型值。 - 6
- (仅在使用
introspectionEndpointUri
时)授权服务器可以配置或实施,从而无法在内省端点响应中提供任何可识别的信息。要获得用户 ID,您可以将userinfo
端点的 URI 配置为回退。userNameClaim
,fallbackUserNameClaim
, 和fallbackUserNamePrefix
设置应用到userinfo
端点的响应。 - 7
- 把它设置为
false
,以禁用监听器上的 OAUTHBEARER 机制。必须至少启用 PLAIN 或 OAUTHBEARER 之一。默认为true
。 - 8
- 设置为
true
以在监听器上启用 PLAIN 身份验证,在所有平台上的客户端都支持该身份验证。 - 9
- PLAIN 机制的额外配置。如果指定,客户端可以使用
$accessToken:
前缀将访问令牌作为密码
来通过 PLAIN 进行身份验证。对于生产环境,始终使用https://
urls。 - 10
- 通过将其设置为 JsonPath 过滤器查询,可以在验证过程中对 JWT 访问令牌实施额外的自定义规则。如果访问令牌不包含必要的数据,则会被拒绝。使用
introspectionEndpointUri
时,自定义检查将应用到内省端点响应 JSON。 - 11
- 一个
audience
参数传递给令牌端点。在获取用于代理身份验证的访问令牌时,需要使用 audience。它还在使用clientId
和secret
的 PLAIN 客户端验证中用于 OAuth 2.0 的客户端名称。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响监听程序的令牌验证规则。 - 12
- 传递给令牌端点的
scope
参数。获取访问令牌进行代理身份验证时使用的 scope。它还在使用clientId
和secret
的 PLAIN 客户端验证中用于 OAuth 2.0 的客户端名称。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响监听程序的令牌验证规则。 - 13
- 连接到授权服务器时的连接超时(以秒为单位)。默认值为 60。
- 14
- 连接到授权服务器时的读取超时(以秒为单位)。默认值为 60。
- 15
- 将失败的 HTTP 请求重试到授权服务器的次数上限。默认值为
0,
表示没有执行重试。要有效地使用这个选项,请考虑减少connectTimeoutSeconds
和readTimeoutSeconds
选项的超时时间。但请注意,重试可能会阻止当前 worker 线程对其他请求使用,如果太多请求停滞,可能会导致 Kafka 代理无响应。 - 16
- 在尝试另一个失败 HTTP 请求重试到授权服务器前等待的时间。默认情况下,这段时间设为零,这意味着不会应用暂停。这是因为,导致失败请求的很多问题都是可快速解决的网络 glitches 或代理问题。但是,如果您的授权服务器处于压力或遇到高流量,您可能希望将此选项设置为 100 ms 或更高值,以减少服务器上的负载并增加成功重试的可能性。
- 17
- JsonPath 查询,用于从 JWT 令牌或内省端点响应中提取组信息。默认情况下不设置这个选项。通过配置此选项,自定义授权程序可以根据用户组做出授权决策。
- 18
- 当以单一分隔字符串返回时,用于解析组的分隔符。默认值为 ','(comma)。
- 保存并退出编辑器,然后等待滚动更新完成。
检查日志中的更新,或者通过观察 pod 状态转换:
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 滚动更新将代理配置为使用 OAuth 2.0 身份验证。
接下来要做什么
8.4.6.3. 配置 Kafka Java 客户端以使用 OAuth 2.0 复制链接链接已复制到粘贴板!
配置 Kafka producer 和消费者 API,以使用 OAuth 2.0 与 Kafka 代理交互。在您的客户端 pom.xml
文件中添加回调插件,然后为 OAuth 2.0 配置客户端。
在客户端配置中指定以下内容:
SASL (简单身份验证和安全层)安全协议:
-
SASL_SSL
用于通过 TLS 加密连接进行身份验证 SASL_PLAINTEXT
用于通过未加密的连接进行身份验证将
SASL_SSL
用于生产环境,并且SASL_PLAINTEXT
仅用于本地开发。使用SASL_SSL
时,需要额外的ssl.truststore
配置。安全连接(https://
)与 OAuth 2.0 授权服务器需要 truststore 配置。要验证 OAuth 2.0 授权服务器,请将授权服务器的 CA 证书添加到客户端配置的信任存储中。您可以使用 PEM 或 PKCS #12 格式配置信任存储。
-
Kafka SASL 机制:
-
OAUTHBEARER
用于使用 bearer 令牌的凭证交换 -
PLAIN
传递客户端凭证(clientId + secret)或访问令牌
-
实现 SASL 机制的 JAAS (Java 身份验证和授权服务)模块:
-
org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule
实现 OAUTHBEARER 机制 -
org.apache.kafka.common.security.plain.PlainLoginModule
实现 PLAIN 机制
-
SASL 验证方法,它支持以下验证方法:
- OAuth 2.0 客户端凭证
- OAuth 2.0 密码授权(已弃用)
- 访问令牌
- 刷新令牌
添加 SASL 身份验证属性作为 JAAS 配置(sasl.jaas.config
)。如何配置身份验证属性取决于您用于访问 OAuth 2.0 授权服务器的身份验证方法。在此过程中,属性在属性文件中指定,然后加载到客户端配置中。
您还可以将身份验证属性指定为环境变量,或作为 Java 系统属性指定。对于 Java 系统属性,您可以使用 setProperty
设置它们,并使用 -D
选项在命令行中传递它们。
先决条件
- AMQ Streams 和 Kafka 正在运行
- 为 OAuth 访问 Kafka 代理部署并配置 OAuth 2.0 授权服务器
- 为 OAuth 2.0 配置 Kafka 代理
流程
将带有 OAuth 2.0 支持的客户端库添加到 Kafka 客户端的
pom.xml
文件中:<dependency> <groupId>io.strimzi</groupId> <artifactId>kafka-oauth-client</artifactId> <version>0.12.0.redhat-00006</version> </dependency>
<dependency> <groupId>io.strimzi</groupId> <artifactId>kafka-oauth-client</artifactId> <version>0.12.0.redhat-00006</version> </dependency>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在属性文件中指定以下配置来配置客户端属性:
- 安全协议
- SASL 机制
JAAS 模块和身份验证属性,具体取决于所使用的方法
例如,我们可以将以下内容添加到
client.properties
文件中:客户端凭证机制属性
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- TLS 加密连接的
SASL_SSL
安全协议。仅对本地开发使用SASL_PLAINTEXT
来进行本地开发。 - 2
- SASL 机制指定为
OAUTHBEARER
或PLAIN
。 - 3
- 用于安全访问 Kafka 集群的信任存储配置。
- 4
- 授权服务器令牌端点的 URI。
- 5
- 客户端 ID,这是在授权服务器中创建客户端时使用的名称。
- 6
- 在授权服务器中创建 客户端 时创建的客户端 secret。
- 7
- 位置包含授权服务器的公钥证书(
truststore.p12
)。 - 8
- 用于访问 truststore 的密码。
- 9
- truststore 类型。
- 10
- (可选)从令牌端点请求令牌的
范围
。授权服务器可能需要客户端指定范围。 - 11
- (可选)从令牌端点请求令牌的
听众
。授权服务器可能需要客户端指定使用者。
密码授予机制属性
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 访问令牌属性
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Kafka 客户端的长期访问令牌。
刷新令牌属性
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在 Java 客户端代码中输入 OAUTH 2.0 身份验证的客户端属性。
显示客户端属性输入示例
Properties props = new Properties(); try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) { props.load(reader); }
Properties props = new Properties(); try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) { props.load(reader); }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证 Kafka 客户端能否访问 Kafka 代理。
8.4.6.4. 为 Kafka 组件配置 OAuth 2.0 复制链接链接已复制到粘贴板!
这个步骤描述了如何使用授权服务器将 Kafka 组件配置为使用 OAuth 2.0 身份验证。
您可以为以下配置身份验证:
- Kafka Connect
- Kafka MirrorMaker
- Kafka Bridge
在这种情况下,Kafka 组件和授权服务器在同一集群中运行。
开始前
有关为 Kafka 组件配置 OAuth 2.0 身份验证的更多信息,请参阅 KafkaClientAuthenticationOAuth
模式参考。schema 引用包括配置选项示例。
先决条件
- AMQ Streams 和 Kafka 正在运行
- 为 OAuth 访问 Kafka 代理部署并配置 OAuth 2.0 授权服务器
- 为 OAuth 2.0 配置 Kafka 代理
流程
创建客户端 secret,并将它作为环境变量挂载到组件。
例如,这里为 Kafka Bridge 创建客户端
Secret
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
clientSecret
密钥必须采用 base64 格式。
创建或编辑 Kafka 组件的资源,以便为身份验证属性配置 OAuth 2.0 身份验证。
对于 OAuth 2.0 身份验证,您可以使用以下选项:
- 客户端 ID 和 secret
- 客户端 ID 和刷新令牌
- 访问令牌
- 用户名和密码
- TLS
例如,这里的 OAuth 2.0 使用客户端 ID 和 secret 和 TLS 分配给 Kafka Bridge 客户端:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您如何应用 OAuth 2.0 身份验证以及授权服务器的类型,您可以使用额外的配置选项:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- (可选)禁用 TLS 主机名验证。默认为
false
。 - 2
- 如果授权服务器没有返回 JWT 令牌中的
typ
(类型)声明,您可以应用checkAccessTokenType: false
来跳过令牌类型检查。默认为true
。 - 3
- 如果使用不透明令牌,您可以应用
accessTokenIsJwt: false
,以便访问令牌不会被视为 JWT 令牌。 - 4
- (可选)从令牌端点请求令牌的
范围
。授权服务器可能需要客户端指定范围。在这种情况下,它都是any
。 - 5
- (可选)从令牌端点请求令牌的
听众
。授权服务器可能需要客户端指定使用者。在本例中,是kafka
。 - 6
- (可选)连接到授权服务器时的连接超时(以秒为单位)。默认值为 60。
- 7
- (可选)连接到授权服务器时的读取超时(以秒为单位)。默认值为 60。
- 8
- (可选)将失败的 HTTP 请求重试到授权服务器的次数上限。默认值为
0,
表示没有执行重试。要有效地使用这个选项,请考虑减少connectTimeoutSeconds
和readTimeoutSeconds
选项的超时时间。但请注意,重试可能会阻止当前 worker 线程对其他请求使用,如果太多请求停滞,可能会导致 Kafka 代理无响应。 - 9
- (可选)尝试对授权服务器进行另一个失败的 HTTP 请求重试前等待的时间。默认情况下,这段时间设为零,这意味着不会应用暂停。这是因为,导致失败请求的很多问题都是可快速解决的网络 glitches 或代理问题。但是,如果您的授权服务器处于压力或遇到高流量,您可能希望将此选项设置为 100 ms 或更高值,以减少服务器上的负载并增加成功重试的可能性。
将更改应用到 Kafka 资源的部署。
oc apply -f your-file
oc apply -f your-file
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查日志中的更新,或者通过观察 pod 状态转换:
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 滚动更新配置组件以使用 OAuth 2.0 身份验证与 Kafka 代理交互。