16.3. 使用基于 OAuth 2.0 令牌的授权
Apache Kafka 的流支持通过 授权服务 使用基于 OAuth 2.0 令牌的授权,这可让您集中管理安全策略和权限。
红帽构建的 Keycloak 中定义的安全策略和权限授予 Kafka 资源的访问权限。用户和客户端与允许对 Kafka 代理执行特定操作的策略进行匹配。
Kafka 允许所有用户默认对代理进行完全访问,但也提供 AclAuthorizer 和 StandardAuthorizer 插件来配置基于 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选项进行配置,才能启用重新身份验证。
流程
- 访问红帽构建的 Keycloak 管理控制台,或使用 Red Hat build of Keycloak Admin CLI 为您在设置 OAuth 2.0 身份验证时创建的 OAuth 2.0 客户端启用授权服务。
- 使用 Authorization Services 为客户端定义资源、授权范围、策略和权限。
- 通过分配角色和组,将权限绑定到用户和客户端。
将
kafka资源配置为使用keycloak授权,并能够访问授权服务器和授权服务。OAuth 2.0 授权配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 类型
keycloak启用红帽构建的 Keycloak 授权。 - 2
- 红帽构建的 Keycloak 令牌端点的 URI。对于生产环境,请始终使用
https://urls。当您配置基于令牌的oauth身份验证时,您可以将jwksEndpointUri指定为本地 JWT 验证的 URI。tokenEndpointUriURI 的主机名必须相同。 - 3
- 红帽构建的 Keycloak 中 OAuth 2.0 客户端定义的客户端 ID,启用了授权服务。通常,
kafka被用作 ID。 - 4
- (可选) 如果红帽构建的 Keycloak 授权策略阻止了对 Kafka
AclAuthorizer和StandardAuthorizer的授权。默认为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,表示不会执行重试。要有效地使用这个选项,请考虑减少connectTimeoutSeconds和readTimeoutSeconds选项的超时时间。但请注意,重试可能会阻止当前的 worker 线程可供其他请求使用,如果太多请求停滞,则可能会导致 Kafka 无响应。 - 16
- (可选)启用或禁用 OAuth 指标。默认值为
false。 - 17
- (可选)有些授权服务器在客户端发送
Accept: application/json标头时遇到问题。通过设置includeAcceptHeader: false,不会发送标头。默认为true。
-
将更改应用到
Kafka配置。 检查日志中的更新,或通过监视 pod 状态转换:
oc logs -f ${POD_NAME} -c kafka oc get pod -woc logs -f ${POD_NAME} -c kafka oc get pod -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 滚动更新将代理配置为使用 OAuth 2.0 授权。
- 以客户端或具有特定角色的用户访问 Kafka 代理来验证配置的权限,确保它们具有必要的访问权限,且没有未经授权的访问权限。