5.4. 使用基于 OAuth 2.0 令牌的身份验证


AMQ Streams 支持使用 OAUTHBEARERPLAIN 机制使用 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 集成提供:

  • 服务器端 OAuth 2.0 支持 Kafka 代理
  • 客户端 OAuth 2.0 支持 Kafka MirrorMaker、Kafka Connect 和 Kafka Bridge

5.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
Copy to Clipboard Toggle word wrap

许多 Kafka 客户端工具都使用在协议级别为 OAUTHBEARER 提供基本支持的库。为支持应用程序开发,AMQ Streams 为上游 Kafka 客户端 Java 库提供一个 OAuth 回调处理器 (但不适用于其他库)。因此,您不需要编写自己的回调处理程序。应用客户端可以使用回调处理程序来提供访问令牌。使用 Go 等其他语言编写的客户端必须使用自定义代码连接到授权服务器并获取访问令牌。

使用 OAUTHBEARER 时,客户端发起与 Kafka 代理用于凭证交换的会话,其中凭证采用由回调处理程序提供的 bearer 令牌的形式。使用回调时,您可以使用以下三种方法之一配置令牌置备:

  • 客户端 ID 和 Secret (通过使用 OAuth 2.0 客户端证书 机制)
  • 在配置时手动获取的长期访问令牌
  • 长期刷新令牌,在配置时手动获取
注意

OAUTHBEARER 身份验证只能由 Kafka 客户端用来支持协议级别的 OAUTHBEARER 机制。

PLAIN 概述

要使用 PLAIN,您必须在 Kafka 代理的 oauth 侦听器配置中启用它。

在以下示例中,除了 OAUTHBEARER 外,还启用了 PLAIN (默认启用)。如果您只想使用 PLAIN,您可以通过将 enableOauthBearer 设置为 false 来禁用 OAUTHBEARER。

  # ...
  authentication:
    type: oauth
    # ...
    enablePlain: true
    tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token
Copy to Clipboard Toggle word wrap

PLAIN 是所有 Kafka 客户端工具使用的简单身份验证机制。要启用 PLAIN 与 OAuth 2.0 身份验证一起使用,AMQ Streams 通过 PLAIN 服务器端回调提供 OAuth 2.0

通过 PLAIN 的 AMQ Streams 实现,客户端凭证不会存储在 ZooKeeper 中。相反,客户端凭证会在兼容的授权服务器集中处理,与使用 OAUTHBEARER 身份验证时类似。

当通过 PLAIN 回调与 OAuth 2.0 一起使用时,Kafka 客户端使用以下任一方法与 Kafka 代理进行身份验证:

  • 客户端 ID 和 secret (使用 OAuth 2.0 客户端证书机制)
  • 在配置时手动获取的长期访问令牌

对于这两种方法,客户端必须提供 PLAIN usernamepassword 属性,以便将凭证传递给 Kafka 代理。客户端使用这些属性来传递客户端 ID 和 secret 或用户名和访问令牌。

客户端 ID 和 secret 用于获取访问令牌。

访问令牌作为 密码 属性值传递。您可以使用 或不使用 $accessToken: 前缀传递访问令牌。

  • 如果您在监听程序配置中配置令牌端点(tokenEndpointUri),则需要使用前缀。
  • 如果您没有在监听器配置中配置令牌端点(tokenEndpointUri),则不需要这个前缀。Kafka 代理将密码解析为原始访问令牌。

如果 密码 被设置为访问令牌,则 用户名 必须设置为 Kafka 代理从访问令牌获取的相同主体名称。您可以使用 userNameClaimfallbackUserNameClaim、fallUsernamePrefixuserInfoEndpointUri 属性在监听程序中指定用户名提取选项。用户名提取过程也取决于您的授权服务器,特别是它如何将客户端 ID 映射到帐户名称。

5.4.2. OAuth 2.0 Kafka 代理配置

OAuth 2.0 的 Kafka 代理配置涉及:

  • 在授权服务器中创建 OAuth 2.0 客户端
  • 在 Kafka 自定义资源中配置 OAuth 2.0 身份验证
注意

与授权服务器的关系,Kafka 代理和 Kafka 客户端都被视为 OAuth 2.0 客户端。

5.4.2.1. 授权服务器上的 OAuth 2.0 客户端配置

要配置 Kafka 代理以验证会话启动期间收到的令牌,建议的做法是在授权服务器中创建一个 OAuth 2.0 client 定义(配置为 confidential),并启用了以下客户端凭证:

  • kafka 的客户端 ID (例如)
  • 客户端 ID 和 Secret 作为身份验证机制
注意

只有在使用授权服务器的非公共内省端点时,才需要使用客户端 ID 和 secret。当使用公共授权服务器端点时,通常会要求凭据,因为快速本地 JWT 令牌验证一样。

5.4.2.2. Kafka 集群中的 OAuth 2.0 身份验证配置

要在 Kafka 集群中使用 OAuth 2.0 身份验证,例如,使用验证方法 oauth 的 Kafka 集群自定义资源的 TLS 侦听器配置:

评估 OAuth 2.0 的身份验证方法类型

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    # ...
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
      #...
Copy to Clipboard Toggle word wrap

您可以配置 plain, tlsexternal 监听程序,但不建议使用带有 OAuth 2.0 禁用了 TLS 加密的 plainexternal 监听程序,因为这会产生一个漏洞,通过令牌对网络造成破坏和未经授权的访问。

您可以使用 type: oauth 为安全传输层配置 外部 监听程序,以便与客户端通信。

将 OAuth 2.0 与外部监听程序搭配使用

# ...
listeners:
  - name: external
    port: 9094
    type: loadbalancer
    tls: true
    authentication:
      type: oauth
    #...
Copy to Clipboard Toggle word wrap

tls 属性默认为 false,因此必须启用它。

当您将身份验证类型定义为 OAuth 2.0 时,您可以根据验证类型添加配置,可以是 快速本地 JWT 验证或利用 内省端点验证的令牌验证

有关为监听程序配置 OAuth 2.0 的步骤,其中描述了 为 Kafka 代理配置 OAuth 2.0 支持

5.4.2.3. 快速本地 JWT 令牌验证配置

快速本地 JWT 令牌验证会在本地检查 JWT 令牌签名。

本地检查可确保令牌:

  • 符合 type,具体为访问令牌包含 Bearer 的(typ)声明值
  • 为有效(不是过期)
  • 具有与 有效IssuerURI匹配的签发者

在配置侦听器时,您可以指定 有效的IssuerURI 属性,以便任何未由授权服务器发布的令牌都会被拒绝。

授权服务器不需要在快速本地 JWT 令牌验证过程中联系。您可以通过指定 jwksEndpointUri 属性(由 OAuth 2.0 授权服务器公开的端点)来激活快速本地 JWT 令牌验证。端点包含用于验证签名的 JWT 令牌的公钥,这些令牌作为 Kafka 客户端作为凭证发送。

注意

与授权服务器的所有通信都应使用 TLS 加密来执行。

您可以在 AMQ Streams 项目命名空间中将证书信任存储配置为 OpenShift Secret,并使用 tlsTrustedCertificates 属性指向包含 truststore 文件的 OpenShift Secret。

您可能需要配置 userNameClaim 来从 JWT 令牌正确提取用户名。如果要使用 Kafka ACL 授权,您需要在验证过程中通过其用户名标识该用户。( JWT 令牌中的 声明通常是唯一 ID,而不是用户名。)

快速本地 JWT 令牌验证配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    #...
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
          validIssuerUri: <https://<auth-server-address>/auth/realms/tls>
          jwksEndpointUri: <https://<auth-server-address>/auth/realms/tls/protocol/openid-connect/certs>
          userNameClaim: preferred_username
          maxSecondsWithoutReauthentication: 3600
          tlsTrustedCertificates:
          - secretName: oauth-server-cert
            certificate: ca.crt
    #...
Copy to Clipboard Toggle word wrap

5.4.2.4. OAuth 2.0 内省端点配置

使用 OAuth 2.0 内省端点验证的令牌验证会将收到的访问令牌视为不透明的。Kafka 代理将访问令牌发送到内省端点,该端点使用验证所需的令牌信息进行响应。重要的是,如果特定的访问令牌有效,它会返回最新的信息,以及令牌过期时的相关信息。

要配置基于 OAuth 2.0 内省验证,您可以指定一个 introspectionEndpointUri 属性,而不是为快速本地 JWT 令牌验证指定的 jwksEndpointUri 属性。根据授权服务器,通常必须指定 clientIdclientSecret,因为内省端点通常受到保护。

内省端点配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
          clientId: kafka-broker
          clientSecret:
            secretName: my-cluster-oauth
            key: clientSecret
          validIssuerUri: <https://<auth-server-address>/auth/realms/tls>
          introspectionEndpointUri: <https://<auth-server-address>/auth/realms/tls/protocol/openid-connect/token/introspect>
          userNameClaim: preferred_username
          maxSecondsWithoutReauthentication: 3600
          tlsTrustedCertificates:
          - secretName: oauth-server-cert
            certificate: ca.crt
Copy to Clipboard Toggle word wrap

5.4.3. Kafka 代理的会话重新验证

您可以将 oauth 监听程序配置为使用 Kafka 客户端和 Kafka 代理之间的 OAuth 2.0 会话的 Kafka 会话重新验证。这个机制在指定的时间后会强制在客户端和代理之间执行经过身份验证的会话。当会话过期时,客户端会立即通过重复使用现有连接来启动一个新会话,而不是将其丢弃。

默认情况下,会话重新身份验证将被禁用。要启用它,您可以在 oauth 监听器配置中为 maxSecondsWithoutReauthentication 设置一个时间值。同一属性可用于为 OAUTHBEARER 和 PLAIN 身份验证配置会话重新身份验证。如需配置示例,请参阅 第 5.4.6.2 节 “为 Kafka 代理配置 OAuth 2.0 支持”

会话重新身份验证必须由客户端使用的 Kafka 客户端库支持。

会话重新身份验证可用于快速 本地 JWT内省端点 令牌验证。

客户端重新验证

当代理通过身份验证的会话过期时,客户端必须通过向代理发送一个新的有效访问令牌来重新验证到现有会话,而不丢弃连接。

如果令牌验证成功,则使用现有连接启动新的客户端会话。如果客户端无法重新验证,代理会在进一步尝试发送或接收消息时关闭连接。如果使用 Kafka 客户端库 2.2 或更高版本的 Java 客户端,如果代理上启用了 re-authentication 机制,则会自动重新验证。

如果使用,会话重新身份验证也适用于刷新令牌。会话过期时,客户端使用其刷新令牌来刷新访问令牌。然后,客户端使用新的访问令牌来重新验证到现有会话。

有关 OAUTHBEARER 和 PLAIN 的会话过期时间

配置会话重新身份验证后,会话到期工作与 OAUTHBEARER 和 PLAIN 身份验证不同。

对于 OAUTHBEARER 和 PLAIN,请使用客户端 ID 和 secret 方法:

  • 代理的经过身份验证的用户会话将在配置的 maxSeconds withoutReauthentication 下过期。
  • 如果访问令牌在配置的时间前过期,则会话将过期。

对于 PLAIN 使用长期访问令牌方法:

  • 代理的经过身份验证的用户会话将在配置的 maxSeconds withoutReauthentication 下过期。
  • 如果访问令牌在配置的时间之前过期,则重新身份验证将失败。虽然尝试了会话重新身份验证,但 PLAIN 没有刷新令牌的机制。

如果没有配置 maxSecondsWithoutReauthentication,OAUTHBEARER 和 PLAIN 客户端可以无限期地连接到代理,而无需重新验证。经过身份验证的会话不以访问令牌到期。但是,在配置授权时这可被视为被视为使用 keycloak 授权或安装自定义授权器。

5.4.4. OAuth 2.0 Kafka 客户端配置

Kafka 客户端配置有:

  • 从授权服务器获取有效的访问令牌(客户端 ID 和 Secret)所需的凭证
  • 使用授权服务器提供的工具获取有效的长期访问令牌或刷新令牌

发送给 Kafka 代理的唯一信息是访问令牌。用于通过授权服务器进行身份验证的凭据不会发送到代理。

当客户端获取访问令牌时,不需要进一步与授权服务器通信。

最简单的机制是使用客户端 ID 和 Secret 进行身份验证。使用长期的访问令牌或长期刷新令牌会增加复杂性,因为对授权服务器工具有额外的依赖。

注意

如果使用长期的访问令牌,可能需要在授权服务器中配置客户端,以增加令牌的最长生命周期。

如果 Kafka 客户端没有直接配置访问令牌,客户端会在 Kafka 会话通过联系授权服务器发起时交换访问令牌的凭证。Kafka 客户端交换:

  • 客户端 ID 和机密
  • 客户端 ID、刷新令牌和(可选)Secret

5.4.5. OAuth 2.0 客户端验证流程

OAuth 2.0 身份验证流取决于底层 Kafka 客户端和 Kafka 代理配置。该流必须由使用的授权服务器支持。

Kafka 代理监听程序配置决定客户端如何使用访问令牌进行身份验证。客户端可以传递客户端 ID 和机密,以请求访问令牌。

如果侦听器配置为使用 PLAIN 身份验证,客户端可以通过客户端 ID 和 secret 或用户名和访问令牌进行身份验证。这些值作为 PLAIN 机制 usernamepassword 属性传递。

侦听器配置支持以下令牌验证选项:

  • 您可以基于 JWT 签名检查和本地令牌内省使用快速本地令牌验证,而无需联系授权服务器。授权服务器提供了一个 JWKS 端点,其公共证书用于验证令牌上的签名。
  • 您可以使用授权服务器提供的令牌内省端点调用。每次建立新的 Kafka 代理连接时,代理都会将从客户端接收的访问令牌传递给授权服务器。Kafka 代理检查响应,以确认令牌是否有效。
注意

授权服务器可能只允许使用不透明的访问令牌,这意味着无法进行本地令牌验证。

还可以为以下类型的身份验证配置 Kafka 客户端凭证:

  • 使用之前生成的长期访问令牌直接进行本地访问
  • 与授权服务器联系,以获取要发出的新访问令牌(使用客户端 ID 和 secret 或刷新令牌)

您可以使用 SASL OAUTHBEARER 机制对 Kafka 身份验证使用以下通信流。

使用客户端 ID 和 secret 的客户端,并将验证委派到授权服务器

Client using client ID and secret with broker delegating validation to authorization server

  1. Kafka 客户端使用客户端 ID 和 secret 从授权服务器请求访问令牌,以及可选的刷新令牌。
  2. 授权服务器生成新的访问令牌。
  3. Kafka 客户端使用 SASL OAUTHBEARER 机制通过 Kafka 代理进行身份验证,以传递访问令牌。
  4. Kafka 代理使用自己的客户端 ID 和 secret 调用授权服务器上的令牌内省端点来验证访问令牌。
  5. 如果令牌有效,则建立 Kafka 客户端会话。

使用客户端 ID 和 secret 的客户端,以及执行快速本地令牌验证的代理

Client using client ID and secret with broker performing fast local token validation

  1. Kafka 客户端使用令牌端点的授权服务器验证,使用客户端 ID 和 secret,以及可选的刷新令牌。
  2. 授权服务器生成新的访问令牌。
  3. Kafka 客户端使用 SASL OAUTHBEARER 机制通过 Kafka 代理进行身份验证,以传递访问令牌。
  4. Kafka 代理使用 JWT 令牌签名检查和本地令牌内省在本地验证访问令牌。

使用长期访问令牌的客户端,并将验证委派到授权服务器

Client using long-lived access token with broker delegating validation to authorization server

  1. Kafka 客户端使用 SASL OAUTHBEARER 机制通过 Kafka 代理进行身份验证,以传递长期的访问令牌。
  2. Kafka 代理使用自己的客户端 ID 和 secret 调用授权服务器上的令牌内省端点来验证访问令牌。
  3. 如果令牌有效,则建立 Kafka 客户端会话。

使用长期访问令牌的客户端,以及执行快速本地验证的代理

Client using long-lived access token with broker performing fast local validation

  1. Kafka 客户端使用 SASL OAUTHBEARER 机制通过 Kafka 代理进行身份验证,以传递长期的访问令牌。
  2. Kafka 代理使用 JWT 令牌签名检查和本地令牌内省在本地验证访问令牌。
警告

快速本地 JWT 令牌签名验证仅适用于短传输的令牌,因为如果撤销令牌,则不会检查授权服务器。令牌到期时间写入到令牌中,但可以随时进行撤销,因此无需联系授权服务器即可考虑。任何发出的令牌都将被视为有效,直到它到期为止。

您可以使用 OAuth PLAIN 机制对 Kafka 身份验证使用以下通信流。

使用客户端 ID 和 secret 的客户端,代理获取客户端的访问令牌

Client using a client ID and secret with the broker obtaining the access token for the client

  1. Kafka 客户端以用户名和 secret 作为密码通过 clientId
  2. Kafka 代理使用令牌端点将 clientIdsecret 传递给授权服务器。
  3. 如果客户端凭据无效,授权服务器会返回一个全新的访问令牌或错误。
  4. Kafka 代理使用以下方法之一验证令牌:

    1. 如果指定了令牌内省端点,则 Kafka 代理通过调用授权服务器上的端点来验证访问令牌。如果令牌验证成功,则会建立一个会话。
    2. 如果使用本地令牌内省,则不会向授权服务器发出请求。Kafka 代理使用 JWT 令牌签名检查在本地验证访问令牌。

使用没有客户端 ID 和 secret 的长期访问令牌的客户端

Client using a long-lived access token without a client ID and secret

  1. Kafka 客户端通过用户名和密码。密码提供在运行客户端之前手动和配置的访问令牌的值。
  2. 密码通过 或不使用 $accessToken: 字符串前缀传递,具体取决于 Kafka 代理监听程序配置了用于身份验证的令牌端点。

    1. 如果配置了令牌端点,密码应以 $accessToken: 前缀,以便代理知道 password 参数包含访问令牌而不是客户端 secret。Kafka 代理将用户名解释为帐户用户名。
    2. 如果没有在 Kafka 代理监听器上配置令牌端点(强制使用 no-client-credentials 模式),密码应该提供没有前缀的访问令牌。Kafka 代理将用户名解释为帐户用户名。在这个模式中,客户端不使用客户端 ID 和 secret,密码 参数始终被解释为原始访问令牌。
  3. Kafka 代理使用以下方法之一验证令牌:

    1. 如果指定了令牌内省端点,则 Kafka 代理通过调用授权服务器上的端点来验证访问令牌。如果令牌验证成功,则会建立一个会话。
    2. 如果使用了本地令牌内省,则不会向授权服务器发出请求。Kafka 代理使用 JWT 令牌签名检查在本地验证访问令牌。

5.4.6. 配置 OAuth 2.0 身份验证

OAuth 2.0 用于在 Kafka 客户端和 AMQ Streams 组件间交互。

要将 OAuth 2.0 用于 AMQ Streams,您必须:

5.4.6.1. 配置 OAuth 2.0 授权服务器

这个步骤描述了配置与 AMQ Streams 集成所需的授权服务器的一般信息。

这些说明并非特定于产品。

这些步骤取决于所选授权服务器。有关如何设置 OAuth 2.0 访问的信息,请参阅授权服务器的产品文档。

注意

如果您已经部署了授权服务器,您可以跳过部署步骤并使用当前的部署。

流程

  1. 将授权服务器部署到集群中。
  2. 访问授权服务器的 CLI 或管理控制台,以便为 AMQ Streams 配置 OAuth 2.0。

    现在,准备授权服务器以用于 AMQ Streams。

  3. 配置 kafka-broker 客户端。
  4. 为应用程序的每个 Kafka 客户端组件配置客户端。

接下来要执行的操作

在部署和配置授权服务器后,将 Kafka 代理配置为使用 OAuth 2.0

5.4.6.2. 为 Kafka 代理配置 OAuth 2.0 支持

此流程描述了如何配置 Kafka 代理,以便代理监听程序可以使用授权服务器使用 OAuth 2.0 身份验证。

我们建议通过配置 TLS 监听器在加密接口中使用 OAuth 2.0。不建议使用普通的监听程序。

如果授权服务器使用由可信 CA 签名的证书并匹配 OAuth 2.0 服务器主机名,则 TLS 连接使用默认设置正常工作。否则,您可能需要使用探测器证书或禁用证书主机名验证配置信任存储。

在配置 Kafka 代理时,有两个选项可用于在新连接 Kafka 客户端的 OAuth 2.0 身份验证期间验证访问令牌:

开始前

有关为 Kafka 代理监听程序配置 OAuth 2.0 身份验证的更多信息,请参阅:

先决条件

  • AMQ Streams 和 Kafka 正在运行
  • 已部署了 OAuth 2.0 授权服务器

流程

  1. 在编辑器中更新 Kafka 资源的 Kafka 代理配置(Kafka.spec.kafka)。

    oc edit kafka my-cluster
    Copy to Clipboard Toggle word wrap
  2. 配置 Kafka 代理 监听程序 配置。

    每种侦听器的配置不一定是相同的,因为它们是独立的。

    此处的示例显示了为外部监听器配置的配置选项。

    示例 1:配置快速本地 JWT 令牌验证

    #...
    - name: external
      port: 9094
      type: loadbalancer
      tls: true
      authentication:
        type: oauth 
    1
    
        validIssuerUri: <https://<auth-server-address>/auth/realms/external> 
    2
    
        jwksEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/certs> 
    3
    
        userNameClaim: preferred_username 
    4
    
        maxSecondsWithoutReauthentication: 3600 
    5
    
        tlsTrustedCertificates: 
    6
    
        - secretName: oauth-server-cert
          certificate: ca.crt
        disableTlsHostnameVerification: true 
    7
    
        jwksExpirySeconds: 360 
    8
    
        jwksRefreshSeconds: 300 
    9
    
        jwksMinRefreshPauseSeconds: 1 
    10
    Copy to Clipboard Toggle word wrap

    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:使用内省端点配置令牌验证

    - name: external
      port: 9094
      type: loadbalancer
      tls: true
      authentication:
        type: oauth
        validIssuerUri: <https://<auth-server-address>/auth/realms/external>
        introspectionEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token/introspect> 
    1
    
        clientId: kafka-broker 
    2
    
        clientSecret: 
    3
    
          secretName: my-cluster-oauth
          key: clientSecret
        userNameClaim: preferred_username 
    4
    
        maxSecondsWithoutReauthentication: 3600 
    5
    Copy to Clipboard Toggle word wrap

    1
    令牌内省端点的 URI。
    2
    用于标识客户端的客户端 ID。
    3
    客户端 Secret 和客户端 ID 用于身份验证。
    4
    在令牌中包含实际用户名的令牌声明(或密钥)。用户名是用于标识用户的 主体userNameClaim 值将取决于所使用的授权服务器。
    5
    (可选)激活 Kafka 重新身份验证机制,以强制实施与访问令牌相同的长度。如果指定值小于访问令牌过期的时间,那么客户端必须在实际令牌到期前重新进行身份验证。默认情况下,当访问令牌过期时,会话不会过期,客户端也不会尝试重新身份验证。

    根据您应用 OAuth 2.0 身份验证以及授权服务器的类型,您可以使用额外的(可选)配置设置:

      # ...
      authentication:
        type: oauth
        # ...
        checkIssuer: false 
    1
    
        checkAudience: true 
    2
    
        fallbackUserNameClaim: client_id 
    3
    
        fallbackUserNamePrefix: client-account- 
    4
    
        validTokenType: bearer 
    5
    
        userInfoEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/userinfo 
    6
    
        enableOauthBearer: false 
    7
    
        enablePlain: true 
    8
    
        tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token 
    9
    
        customClaimCheck: "@.custom == 'custom-value'" 
    10
    
        clientAudience: AUDIENCE 
    11
    
        clientScope: SCOPE 
    12
    
        connectTimeoutSeconds: 60 
    13
    
        readTimeoutSeconds: 60 
    14
    
        groupsClaim: "$.groups" 
    15
    
        groupsClaimDelimiter: "," 
    16
    Copy to Clipboard Toggle word wrap
    1
    如果您的授权服务器不提供 声明,则无法执行签发者检查。在这种情况下,将 checkIssuer 设为 false,且不 指定有效的IssuerUri。默认为 true
    2
    如果您的授权服务器 提供了一个ud (udience)申索,并且希望强制执行听众检查,则将 checkAudience 设置为 true。受众检查确定令牌的预期接收者。因此,Kafka 代理将拒绝在其 aud 声明中没有 clientId 的令牌。默认为 false
    3
    授权服务器可能无法提供单一属性来识别常规用户和客户端。当客户端在其自己的名称中进行身份验证时,该服务器可能会提供 客户端 ID。当用户使用用户名和密码进行身份验证时,若要获取刷新令牌或访问令牌,服务器在客户端 ID 之外可能会提供 用户名 属性。如果主用户 ID 属性不可用,则使用此回退选项指定要使用的用户名声明(attribute)。
    4
    在适用 fallbackUserNameClaim 时,可能需要防止用户名声明的值和回退用户名声明之间的名称冲突。例如存在名为 producer 的客户端,但存在一个名为 producer 的普通用户。为了区分这两者,您可以使用此属性为客户端的用户 ID 添加前缀。
    5
    (仅适用于使用 introspectionEndpointUri)取决于您使用的授权服务器,内省端点可能会返回 令牌类型 属性,或者可能包含不同的值。您可以指定来自内省端点要包含的响应的有效令牌类型值。
    6
    (仅适用于使用 introspectionEndpointUri)授权服务器配置或实施,这样在 Introspection Endpoint 响应中不提供任何可识别的信息。要获取用户 ID,您可以将 userinfo 端点的 URI 配置为回退。userNameClaim、freUserNameClaimfallbackUserNamePrefix 设置应用于 userinfo 端点的响应。
    7
    将其设置为 false,以禁用监听器上的 OAUTHBEARER 机制。必须至少启用 PLAIN 或 OAUTHBEARER 之一。默认为 true
    8
    设置为 true,以在监听器上启用 PLAIN 身份验证,在所有平台上的客户端都受支持。
    9
    用于 PLAIN 机制的其他配置。如果指定,客户端可以使用 $accessToken: 前缀将访问令牌作为 密码 传递,通过 PLAIN 进行身份验证。对于生产环境,始终使用 https:// urls。
    10
    可以在验证过程中对 JWT 访问令牌实施额外的自定义规则,方法是将其设置为 JsonPath 过滤器查询。如果访问令牌不包含必要的数据,则会被拒绝。在使用 introspectionEndpointUri 时,自定义检查将应用到内省端点响应 JSON。
    11
    一个 audience 参数传递给令牌端点。在获取用于代理身份验证的访问令牌时,需要使用 使用者。它还使用在 PLAIN 客户端身份验证中使用 clientIdsecret 的 OAuth 2.0 客户端名称。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会受到监听程序影响令牌验证规则。
    12
    传递给令牌端点的 scope 参数。获取访问令牌进行代理身份验证时使用的 范围。它还使用在 PLAIN 客户端身份验证中使用 clientIdsecret 的 OAuth 2.0 客户端名称。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会受到监听程序影响令牌验证规则。
    13
    连接授权服务器时出现连接超时(以秒为单位)。默认值为 60。
    14
    连接到授权服务器时读取超时(以秒为单位)。默认值为 60。
    15
    JsonPath 查询,用于从 JWT 令牌或内省端点响应中提取组信息。默认情况下不设置。这可以由自定义授权者用来根据用户组做出授权决策。
    16
    以单个分隔字符串返回时用于解析组信息的分隔符。默认值为 ','(comma)。
  3. 保存并退出编辑器,然后等待滚动更新完成。
  4. 检查日志中的更新,或者查看 pod 状态转换:

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w
    Copy to Clipboard Toggle word wrap

    滚动更新将代理配置为使用 OAuth 2.0 身份验证。

5.4.6.3. 将 Kafka Java 客户端配置为使用 OAuth 2.0

此流程描述了如何配置 Kafka producer 和使用者 API,以使用 OAuth 2.0 与 Kafka 代理交互。

将客户端回调插件添加到您的 pom.xml 文件中,并配置系统属性。

先决条件

  • AMQ Streams 和 Kafka 正在运行
  • OAuth 2.0 授权服务器被部署并为 OAuth 访问 Kafka 代理配置
  • 为 OAuth 2.0 配置 Kafka 代理

流程

  1. 将支持 OAuth 2.0 的客户端程序库添加到 Kafka 客户端的 pom.xml 文件中:

    <dependency>
     <groupId>io.strimzi</groupId>
     <artifactId>kafka-oauth-client</artifactId>
     <version>0.10.0.redhat-00014</version>
    </dependency>
    Copy to Clipboard Toggle word wrap
  2. 为回调配置系统属性:

    例如:

    System.setProperty(ClientConfig.OAUTH_TOKEN_ENDPOINT_URI, “https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token”); 
    1
    
    System.setProperty(ClientConfig.OAUTH_CLIENT_ID, "<client_name>"); 
    2
    
    System.setProperty(ClientConfig.OAUTH_CLIENT_SECRET, "<client_secret>"); 
    3
    
    System.setProperty(ClientConfig.OAUTH_SCOPE, "<scope_value>") 
    4
    
    System.setProperty(ClientConfig.OAUTH_AUDIENCE, "<audience_value") 
    5
    Copy to Clipboard Toggle word wrap
    1
    授权服务器令牌端点的 URI。
    2
    客户端 ID,这是在授权服务器中创建 客户端 时使用的名称。
    3
    在授权服务器中创建 客户端 secret。
    4
    (可选)从令牌端点请求令牌 的范围。授权服务器可能需要客户端指定范围。
    5
    (可选 用于从令牌端点请求令牌的使用者。授权服务器可能需要客户端指定受众。
  3. 在 Kafka 客户端配置中,在 TLS 加密连接中启用 OAUTHBEARERPLAIN 机制。

    例如:

    为 Kafka 客户端启用 OAUTHBEARER

    props.put("sasl.jaas.config", "org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;");
    props.put("security.protocol", "SASL_SSL");
    props.put("sasl.mechanism", "OAUTHBEARER");
    props.put("sasl.login.callback.handler.class", "io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler");
    Copy to Clipboard Toggle word wrap

    为 Kafka 客户端启用 PLAIN

    props.put("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"$CLIENT_ID_OR_ACCOUNT_NAME\" password=\"$SECRET_OR_ACCESS_TOKEN\" ;");
    props.put("security.protocol", "SASL_SSL"); 
    1
    
    props.put("sasl.mechanism", "PLAIN");
    Copy to Clipboard Toggle word wrap

    1
    此处我们使用 SASL_SSL 接管 TLS 连接。仅限本地开发使用 SASL_PLAINTEXT 而不是未加密的连接。
  4. 验证 Kafka 客户端是否可以访问 Kafka 代理。

5.4.6.4. 为 Kafka 组件配置 OAuth 2.0

这个步骤描述了如何使用授权服务器将 Kafka 组件配置为使用 OAuth 2.0 身份验证。

您可以为以下配置身份验证:

  • Kafka Connect
  • Kafka MirrorMaker
  • Kafka Bridge

在这种情况下,Kafka 组件和授权服务器在同一集群中运行。

开始前

如需有关为 Kafka 组件配置 OAuth 2.0 身份验证的更多信息,请参阅:

先决条件

  • AMQ Streams 和 Kafka 正在运行
  • OAuth 2.0 授权服务器被部署并为 OAuth 访问 Kafka 代理配置
  • 为 OAuth 2.0 配置 Kafka 代理

流程

  1. 创建客户端 secret,并将其作为环境变量挂载到组件中。

    例如,我们为 Kafka Bridge 创建客户端 Secret

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Secret
    metadata:
     name: my-bridge-oauth
    type: Opaque
    data:
     clientSecret: MGQ1OTRmMzYtZTllZS00MDY2LWI5OGEtMTM5MzM2NjdlZjQw 
    1
    Copy to Clipboard Toggle word wrap
    1
    clientSecret 键必须采用 base64 格式。
  2. 创建或编辑 Kafka 组件的资源,以便为身份验证属性配置 OAuth 2.0 身份验证。

    对于 OAuth 2.0 身份验证,您可以使用:

    • 客户端 ID 和 secret
    • 客户端 ID 和刷新令牌
    • 访问令牌
    • TLS

    KafkaClientAuthenticationOAuth 模式参考提供了每个 的示例

    例如,这里的 OAuth 2.0 使用客户端 ID 和 secret 分配给 Kafka Bridge 客户端:

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      # ...
      authentication:
        type: oauth 
    1
    
        tokenEndpointUri: https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token 
    2
    
        clientId: kafka-bridge
        clientSecret:
          secretName: my-bridge-oauth
          key: clientSecret
        tlsTrustedCertificates: 
    3
    
        - secretName: oauth-server-cert
          certificate: tls.crt
    Copy to Clipboard Toggle word wrap
    1
    身份验证类型设置为 oauth
    2
    用于身份验证的令牌端点的 URI。
    3
    TLS 连接到授权服务器的可信证书。

    根据您应用 OAuth 2.0 身份验证以及授权服务器的类型,您可以使用其他配置选项:

    # ...
    spec:
      # ...
      authentication:
        # ...
        disableTlsHostnameVerification: true 
    1
    
        checkAccessTokenType: false 
    2
    
        accessTokenIsJwt: false 
    3
    
        scope: any 
    4
    
        audience: kafka 
    5
    
        connectTimeoutSeconds: 60 
    6
    
        readTimeoutSeconds: 60 
    7
    Copy to Clipboard Toggle word wrap
    1
    (可选)禁用 TLS 主机名验证。默认为 false
    2
    如果授权服务器没有在 JWT 令牌中返回 typ (类型)声明,您可以应用 checkAccessTokenType: false 来跳过令牌类型检查。默认为 true
    3
    如果使用不透明令牌,您可以应用 accessTokenIsJwt: false,以便访问令牌不会被视为 JWT 令牌。
    4
    (可选)从令牌端点请求令牌 的范围。授权服务器可能需要客户端指定范围。在这种情况下,它都是 any
    5
    (可选 用于从令牌端点请求令牌的使用者。授权服务器可能需要客户端指定受众。在本例中,是 kafka
    6
    (可选)连接到授权服务器时连接超时(以秒为单位)。默认值为 60。
    7
    (可选)连接到授权服务器时读取超时(以秒为单位)。默认值为 60。
  3. 将更改应用到 Kafka 资源的部署。

    oc apply -f your-file
    Copy to Clipboard Toggle word wrap
  4. 检查日志中的更新,或者查看 pod 状态转换:

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w
    Copy to Clipboard Toggle word wrap

    滚动更新配置组件,以使用 OAuth 2.0 身份验证与 Kafka 代理交互。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat