4.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
  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

    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

    1
    令牌内省端点的 URI。
    2
    用于标识客户端的客户端 ID。
    3
    客户端机密和客户端 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
    1
    如果您的授权服务器不提供 iss 声明,则无法执行签发者检查。在这种情况下,把 checkIssuer 设置为 false,且不指定 validIssuerUri。默认值为 true
    2
    如果您的授权服务器提供 ud (严重)申索,并且您希望强制进行使用者检查,请将 checkAudience 设置为 true。使用者检查可识别令牌的预期接收者。因此,Kafka 代理将拒绝在其 aud 声明中没有其 clientId 的令牌。默认为 false
    3
    授权服务器不能提供单个属性来标识常规用户和客户端。当客户端在其自己的名称中进行身份验证时,服务器可能会提供 客户端 ID。当用户使用用户名和密码进行身份验证时,为了获取刷新令牌或访问令牌,服务器可能会提供除客户端 ID 之外 的用户名 属性。使用此回退选项指定用户名声明(attribute),以便在主用户 ID 属性不可用时使用。
    4
    在适用 fallbackUserNameClaim 的情况下,可能还需要防止用户名声明的值与回退用户名声明的值冲突。请考虑存在名为 producer 的客户端,但也存在名为 producer 的常规用户。为了区分这两者,您可以使用此属性向客户端的用户 ID 添加前缀。
    5
    (仅在使用 内省EndpointUri时)取决于您使用的授权服务器,内省端点可能会也可能不会返回 令牌类型 属性,或者它可能包含不同的值。您可以指定内省端点必须包含的有效令牌类型值。
    6
    (仅在使用 内省EndpointUri时)可以配置或实施授权服务器,以免在内省端点响应中提供任何可识别的信息。若要获取用户 ID,您可以将 userinfo 端点的 URI 配置为回退。userNameClaimfallbackUserNameClaimfallbackUserNamePrefix 设置应用于 userinfo 端点的响应。
    7
    将其设置为 false' 以禁用监听器上的 OAUTHBEARER 机制。必须至少启用 PLAIN 或 OAUTHBEARER 中的一个。默认为 'true
    8
    设置为 true,以便在监听器上启用 PLAIN 身份验证,这是所有平台上所有客户端支持的。Kafka 客户端必须启用 PLAIN 机制并设置 用户名和密码 。PLAIN 可用于使用 OAuth 访问令牌或 OAuth 客户端Idsecret (客户端凭据)进行身份验证。该行为还由是否指定 tokenEndpointUri 来控制。默认为 false。如果指定了 tokenEndpointUri,并且客户端将 密码 设置为以字符串 $accessToken: 开头,服务器会将密码解析为访问令牌,用户名 为帐户用户名。否则,用户名 将解释为 clientId密码 解析为客户端 secret,代理用于在客户端名称中获取访问令牌。如果没有指定 tokenEndpointUri密码 始终解析为访问令牌,并且 用户名 始终被解释为帐户用户名,它必须与从令牌提取的主体 ID 匹配。这称为"no-client-credentials"模式,因为客户端必须始终自行获取访问令牌,并且无法使用 clientIdsecret
    9
    PLAIN 机制的其他配置,允许客户端进行身份验证,方法是传递 clientIdsecret 作为 用户名和密码 ,如上点所述。如果没有指定,客户端只能通过传递访问令牌作为 密码 参数通过 PLAIN 进行身份验证。
    10
    可以通过将此规则设置为 JsonPath 过滤器查询,在验证期间对 JWT 访问令牌应用其他自定义规则。如果访问令牌不包含必要的数据,则会被拒绝。使用 内省EndpointUri 时,自定义检查应用到内省端点响应 JSON。
    11
    (可选) 传递到 令牌端点的使用者参数。在获取用于代理身份验证的访问令牌时,会使用 使用者。它也用于 OAuth 2.0 的客户端名称,通过 PLAIN 客户端身份验证使用 clientIdsecret。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响侦听器的令牌验证规则。
    12
    (可选)传递到令牌端点 的范围 参数。在获取用于代理身份验证的访问令牌时,会使用 范围。它也用于 OAuth 2.0 的客户端名称,通过 PLAIN 客户端身份验证使用 clientIdsecret。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响侦听器的令牌验证规则。
  3. 保存并退出编辑器,然后等待滚动更新完成。
  4. 检查日志中的更新,或者查看 pod 状态转换:

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.