4.11. 使用基于 OAuth 2.0 令牌的授权
AMQ Streams 支持通过 Red Hat Single Sign-On Authorization Services 使用基于 OAuth 2.0 令牌的授权,它允许您集中管理安全策略和权限。
Red Hat Single Sign-On 中定义的安全策略和权限用于授予对 Kafka 代理上资源的访问权限。用户和客户端与允许对 Kafka 代理执行特定操作的策略进行匹配。
Kafka 允许所有用户默认对代理进行完全访问,同时还提供 AclAuthorizer
插件来配置基于 Access Control Lists (ACL)的授权。
ZooKeeper 存储 ACL 规则,以根据 用户名 授予或拒绝对资源的访问。但是,红帽单点登录基于 OAuth 2.0 令牌的授权在您希望实现对 Kafka 代理的访问控制方面具有更大的灵活性。另外,您可以将 Kafka 代理配置为使用 OAuth 2.0 授权和 ACL。
4.11.1. OAuth 2.0 授权机制 复制链接链接已复制到粘贴板!
AMQ Streams 中的 OAuth 2.0 授权使用红帽单点登录服务器授权服务 REST 端点,通过在特定用户上应用定义的安全策略来扩展基于令牌的身份验证,并为该用户提供授予不同资源的权限列表。策略使用角色和组来匹配用户的权限。OAuth 2.0 授权根据从 Red Hat Single Sign-On Authorization Services 用户获得的授予者列表在本地强制实施权限。
4.11.1.1. Kafka 代理自定义授权器 复制链接链接已复制到粘贴板!
AMQ Streams 提供了 Red Hat Single Sign-On authorizer (KeycloakRBACAuthorizer
)。为了可以使用 Red Hat Single Sign-On 提供的授权服务的 Red Hat Single Sign-On REST 端点,您可以在 Kafka 代理上配置自定义授权器。
授权程序根据需要从授权服务器获取授予权限的列表,并在 Kafka Broker 上本地强制实施授权,为每个客户端请求做出快速授权决策。
4.11.2. 配置 OAuth 2.0 授权支持 复制链接链接已复制到粘贴板!
这个步骤描述了如何使用 Red Hat Single Sign-On Authorization Services 将 Kafka 代理配置为使用 OAuth 2.0 授权服务。
开始前
考虑某些用户所需的访问权限或希望限制某些用户。您可以使用 Red Hat Single Sign-On 组、角色、客户端 和 用户在 Red Hat Single Sign-On 中配置访问权限的组合。
通常,组用于根据机构部门或地理位置匹配用户。和 角色用于根据其功能匹配用户。
使用红帽单点登录,您可以在 LDAP 中存储用户和组,而客户端和角色不能以这种方式存储。存储和对用户数据的访问可能是您选择配置授权策略的一个因素。
无论在 Kafka 代理上实现的授权是什么,超级用户始终对 Kafka 代理具有不受限制的访问。
先决条件
- AMQ Streams 必须通过 Red Hat Single Sign-On 配置为使用 OAuth 2.0 进行基于令牌的身份验证。设置授权时,您可以使用相同的 Red Hat Single Sign-On 服务器端点。
- 您需要了解如何管理 Red Hat Single Sign-On Authorization Services 的策略和权限,如 Red Hat Single Sign-On 文档所述。
流程
- 访问 Red Hat Single Sign-On Admin 控制台,或使用 Red Hat Single Sign-On Admin CLI 为设置 OAuth 2.0 身份验证时创建的 Kafka 代理客户端启用授权服务。
- 使用 Authorization Services 为客户端定义资源、授权范围、策略和权限。
- 通过分配角色和组,将权限绑定到用户和客户端。
将 Kafka 代理配置为使用 Red Hat Single Sign-On 授权。
将以下内容添加到 Kafka
server.properties
配置文件中,以在 Kafka 中安装授权器:authorizer.class.name=io.strimzi.kafka.oauth.server.authorizer.KeycloakRBACAuthorizer principal.builder.class=io.strimzi.kafka.oauth.server.authorizer.JwtKafkaPrincipalBuilder
authorizer.class.name=io.strimzi.kafka.oauth.server.authorizer.KeycloakRBACAuthorizer principal.builder.class=io.strimzi.kafka.oauth.server.authorizer.JwtKafkaPrincipalBuilder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 Kafka 代理添加配置以访问授权服务器和授权服务。
在此我们显示作为额外属性添加到
server.properties
的示例配置,但您也可以使用大写或大写的命名规则将它们定义为环境变量。strimzi.authorization.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token" strimzi.authorization.client.id="kafka"
strimzi.authorization.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token"
1 strimzi.authorization.client.id="kafka"
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow (可选)为特定 Kafka 集群添加配置。
例如:
strimzi.authorization.kafka.cluster.name="kafka-cluster"
strimzi.authorization.kafka.cluster.name="kafka-cluster"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 特定 Kafka 集群的名称。名称用于目标权限,因此可以在同一 Red Hat Single Sign-On 域中管理多个集群。默认值为
kafka-cluster
。
(可选)与简单授权决定。
例如:
strimzi.authorization.delegate.to.kafka.acl="false"
strimzi.authorization.delegate.to.kafka.acl="false"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果 Red Hat Single Sign-On Authorization Services 策略无法访问,将授权委派给 Kafka
AclAuthorizer
。默认值为false
。
(可选)将 TLS 连接的配置添加到授权服务器。
例如:
strimzi.authorization.ssl.truststore.location=<path-to-truststore> strimzi.authorization.ssl.truststore.password=<my-truststore-password> strimzi.authorization.ssl.truststore.type=JKS strimzi.authorization.ssl.secure.random.implementation=SHA1PRNG strimzi.authorization.ssl.endpoint.identification.algorithm=HTTPS
strimzi.authorization.ssl.truststore.location=<path-to-truststore>
1 strimzi.authorization.ssl.truststore.password=<my-truststore-password>
2 strimzi.authorization.ssl.truststore.type=JKS
3 strimzi.authorization.ssl.secure.random.implementation=SHA1PRNG
4 strimzi.authorization.ssl.endpoint.identification.algorithm=HTTPS
5 Copy to Clipboard Copied! Toggle word wrap Toggle overflow (可选)配置从授权服务器刷新授权。授予刷新作业的工作原理,方法是枚举活跃的令牌并请求每个令牌的最新授权。
例如:
strimzi.authorization.grants.refresh.period.seconds="120" strimzi.authorization.grants.refresh.pool.size="10"
strimzi.authorization.grants.refresh.period.seconds="120"
1 strimzi.authorization.grants.refresh.pool.size="10"
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 通过以客户端或具有特定角色的用户访问 Kafka 代理来验证配置的权限,确保它们具有必要的访问权限,或者没有应该具有访问权限。