16.3. 使用基于 OAuth 2.0 令牌的授权


Apache Kafka 的流支持通过 授权服务 使用基于 OAuth 2.0 令牌的授权,这可让您集中管理安全策略和权限。

红帽构建的 Keycloak 中定义的安全策略和权限授予 Kafka 资源的访问权限。用户和客户端与允许对 Kafka 代理执行特定操作的策略进行匹配。

Kafka 允许所有用户默认对代理进行完全访问,但也提供 AclAuthorizerStandardAuthorizer 插件来配置基于 Access Control Lists (ACL)的授权。由这些插件管理的 ACL 规则用于根据 用户名 授予或拒绝资源访问,这些规则存储在 Kafka 集群本身中。

但是,红帽构建的 Keycloak 基于 OAuth 2.0 令牌的授权为您要实施 Kafka 代理的访问控制提供了更大的灵活性。另外,您可以将 Kafka 代理配置为使用 OAuth 2.0 授权和 ACL。

16.3.1. 示例:启用 OAuth 2.0 授权

本例流程演示了如何使用红帽构建的 Keycloak 授权服务将 Kafka 配置为使用 OAuth 2.0 授权服务。要使用红帽构建的 Keycloak 启用 OAuth 2.0 授权,请将 Kafka 资源配置为使用 keycloak 授权,并指定访问授权服务器和红帽构建的 Keycloak 授权服务所需的属性。

红帽构建的 Keycloak 服务器授权服务 REST 端点通过对特定用户应用定义的安全策略来扩展基于令牌的验证,并为该用户提供授予不同资源的权限列表。策略使用角色和组来匹配用户的权限。OAuth 2.0 授权根据从红帽构建 Keycloak 授权服务的用户授予者列表在本地强制实施权限。

红帽构建的 Keycloak 授权器 (KeycloakAuthorizer)由 Apache Kafka 的 Streams 提供。授权器根据需要从授权服务器获取授予权限的列表,并在 Kafka 上在本地强制实施授权,为每个客户端请求做出快速授权决策。

开始前

考虑某些用户所需的访问权限或希望限制某些用户。您可以使用红帽构建的 Keycloak 角色客户端和 用户在 Red Hat build of Keycloak 中配置访问权限。

通常,组用于根据机构部门或地理位置匹配用户。和 角色用于根据其功能匹配用户。

使用红帽构建的 Keycloak,您可以在 LDAP 中存储用户和组,而客户端和角色无法以这种方式存储。存储和对用户数据的访问可能是您选择配置授权策略的一个因素。

注意

无论实现的授权,超级用户 始终对 Kafka 有不受限制的访问。

先决条件

  • Apache Kafka 的流必须配置为使用带有红帽构建的 Keycloak 的 OAuth 2.0 进行基于令牌的身份验证。设置授权时,您可以使用与 Keycloak 服务器端点相同的红帽构建。
  • OAuth 2.0 身份验证必须使用 maxSecondsWithoutReauthentication 选项进行配置,才能启用重新身份验证。

流程

  1. 访问红帽构建的 Keycloak 管理控制台,或使用 Red Hat build of Keycloak Admin CLI 为您在设置 OAuth 2.0 身份验证时创建的 OAuth 2.0 客户端启用授权服务。
  2. 使用 Authorization Services 为客户端定义资源、授权范围、策略和权限。
  3. 通过分配角色和组,将权限绑定到用户和客户端。
  4. kafka 资源配置为使用 keycloak 授权,并能够访问授权服务器和授权服务。

    OAuth 2.0 授权配置示例

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      kafka:
        # ...
        authorization:
          type: keycloak 
    1
    
          tokenEndpointUri: <https://<auth-server-address>/realms/external/protocol/openid-connect/token> 
    2
    
          clientId: kafka 
    3
    
          delegateToKafkaAcls: false 
    4
    
          disableTlsHostnameVerification: false 
    5
    
          superUsers: 
    6
    
            - CN=user-1
            - user-2
            - CN=user-3
          tlsTrustedCertificates: 
    7
    
            - secretName: oauth-server-cert
              pattern: "*.crt"
          grantsRefreshPeriodSeconds: 60 
    8
    
          grantsRefreshPoolSize: 5 
    9
    
          grantsMaxIdleSeconds: 300 
    10
    
          grantsGcPeriodSeconds: 300 
    11
    
          grantsAlwaysLatest: false 
    12
    
          connectTimeoutSeconds: 60 
    13
    
          readTimeoutSeconds: 60 
    14
    
          httpRetries: 2 
    15
    
          enableMetrics: false 
    16
    
          includeAcceptHeader: false 
    17
    
        #...
    Copy to Clipboard Toggle word wrap

    1
    类型 keycloak 启用红帽构建的 Keycloak 授权。
    2
    红帽构建的 Keycloak 令牌端点的 URI。对于生产环境,请始终使用 https:// urls。当您配置基于令牌的 oauth 身份验证时,您可以将 jwksEndpointUri 指定为本地 JWT 验证的 URI。tokenEndpointUri URI 的主机名必须相同。
    3
    红帽构建的 Keycloak 中 OAuth 2.0 客户端定义的客户端 ID,启用了授权服务。通常,kafka 被用作 ID。
    4
    (可选) 如果红帽构建的 Keycloak 授权策略阻止了对 Kafka AclAuthorizerStandardAuthorizer 的授权。默认为 false
    5
    (可选)禁用 TLS 主机名验证。默认为 false
    6
    (可选)设计的超级用户。
    7
    (可选)在 TLS 连接到授权服务器的指定 secret 中以 X.509 格式存储的证书。
    8
    (可选)两个连续之间的时间授予刷新运行。这是活跃会话的最大时间,用于检测红帽构建的 Keycloak 上用户的任何权限更改。默认值为 60。
    9
    (可选)用于刷新(并行)活跃会话授予的线程数量。默认值为 5。
    10
    (可选)缓存中闲置授权可以被驱除的时间(以秒为单位)。默认值为 300。
    11
    (可选) 连续运行从缓存中清除过时的作业之间的时间(以秒为单位)。默认值为 300。
    12
    (可选)控制是否为新会话获取最新的授权。启用后,会从红帽构建的 Keycloak 和缓存的用户检索授予。默认值为 false
    13
    (可选)连接到红帽构建的 Keycloak 令牌端点时的连接超时(以秒为单位)。默认值为 60。
    14
    (可选)连接到红帽构建的 Keycloak 令牌端点时的读取超时(以秒为单位)。默认值为 60。
    15
    (可选)重试的最大次数(不会暂停)授权服务器的失败 HTTP 请求。默认值为 0, 表示不会执行重试。要有效地使用这个选项,请考虑减少 connectTimeoutSecondsreadTimeoutSeconds 选项的超时时间。但请注意,重试可能会阻止当前的 worker 线程可供其他请求使用,如果太多请求停滞,则可能会导致 Kafka 无响应。
    16
    (可选)启用或禁用 OAuth 指标。默认值为 false
    17
    (可选)有些授权服务器在客户端发送 Accept: application/json 标头时遇到问题。通过设置 includeAcceptHeader: false,不会发送标头。默认为 true
  5. 将更改应用到 Kafka 配置。
  6. 检查日志中的更新,或通过监视 pod 状态转换:

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

    滚动更新将代理配置为使用 OAuth 2.0 授权。

  7. 以客户端或具有特定角色的用户访问 Kafka 代理来验证配置的权限,确保它们具有必要的访问权限,且没有未经授权的访问权限。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat