4.5.4. 试用红帽单点登录授权服务
本例介绍了如何使用带有 keycloak
授权的红帽单点登录授权服务。使用 Red Hat Single Sign-On Authorization Services 对 Kafka 客户端实施访问限制。红帽单点登录授权服务使用授权范围、策略和权限来定义并应用对资源的访问控制。
红帽单点登录授权服务 REST 端点为经过身份验证的用户提供所授予资源权限的列表。授权列表(权限)从红帽单点登录服务器获取,作为 Kafka 客户端建立身份验证会话后的第一个操作。这个列表会在后台刷新,以便检测到对授权的更改。授权会在每个用户会话的 Kafka 代理上进行缓存和强制实施,以提供快速的授权决策。
AMQ Streams 提供了两个示例文件,其中包含用于设置 Red Hat Single Sign-On 的部署工件:
kafka-ephemeral-oauth-single-keycloak-authz.yaml
-
使用红帽单点登录为基于 OAuth 2.0 令牌的授权配置
Kafka
自定义资源示例。您可以使用自定义资源来部署使用keycloak
授权和基于令牌的oauth
身份验证的 Kafka 集群。 kafka-authz-realm.json
- 配置有示例组、用户、角色和客户端的红帽单点登录域示例。您可以将该域导入到 Red Hat Single Sign-On 实例,以设置精细的权限来访问 Kafka。
如果要通过 Red Hat Single Sign-On 尝试示例,请使用这些文件按照所示的顺序执行本节中概述的任务。
Authentication
当您配置基于令牌的 oauth
身份验证时,您可以将 jwksEndpointUri
指定为本地 JWT 验证的 URI。在配置 keycloak
授权时,您可以将 tokenEndpointUri
指定为 Red Hat Single Sign-On 令牌端点的 URI。两个 URI 的主机名必须相同。
使用组或角色策略定向权限
在红帽单点登录中,启用服务帐户的机密客户端可以使用客户端 ID 和机密以自己的名称向服务器进行身份验证。对于通常使用自有名称的微服务,而非作为特定用户的代理(如网站)而言,这非常方便。服务帐户可以像普通用户一样分配角色。但是,他们不能分配有组。因此,如果要使用服务帐户为微服务设置权限,则无法使用组策略,而是应使用角色策略。相反,如果您只想将某些权限限制为需要使用用户名和密码进行身份验证的普通用户帐户,您可以实现这一点,作为使用组策略而不是角色策略的一个副作用。本例中用于以 ClusterManager
开头的权限。通常使用 CLI 工具以交互方式执行集群管理。在使用生成的访问令牌验证 Kafka 代理前,要求用户登录是合适的。在这种情况下,访问令牌代表特定的用户,而不是客户端应用。
4.5.4.1. 访问红帽单点登录管理控制台
设置红帽单点登录,然后连接到其管理控制台,再添加预配置的域。使用示例 kafka-authz-realm.json
文件导入该域。您可以在管理控制台中检查为域定义的授权规则。规则授予对配置为使用 Red Hat Single Sign-On 域示例的 Kafka 集群上资源的访问权限。
先决条件
- 正在运行的 OpenShift 集群。
-
AMQ Streams
示例/security/keycloak-authorization/kafka-authz-realm.json
文件包含预配置域。
流程
- 使用 Red Hat Single Sign-On Operator 安装 Red Hat Single Sign-On 服务器,如 Red Hat Single Sign-On 文档中的服务器安装和配置 中所述。
- 等待红帽单点登录实例运行。
获取外部主机名,以便能够访问管理控制台。
NS=sso oc get ingress keycloak -n $NS
在本例中,我们假定红帽单点登录服务器正在
sso
命名空间中运行。获取
admin 用户的密码
。oc get -n $NS pod keycloak-0 -o yaml | less
密码存储为 secret,因此获取 Red Hat Single Sign-On 实例的配置 YAML 文件,以标识 secret 的名称(secret
KeyRef.name
)。使用机密的名称获取明文密码。
SECRET_NAME=credential-keycloak oc get -n $NS secret $SECRET_NAME -o yaml | grep PASSWORD | awk '{print $2}' | base64 -D
在本例中,我们假设 secret 的名称是 credentials
-keycloak
。使用用户名
admin
和您获取的密码登录管理控制台。使用
https://HOSTNAME
访问 OpenShift 入口。现在,您可以使用管理控制台将示例域上传到红帽单点登录。
- 单击 Add Realm 以 导入示例域。
添加 example
/security/keycloak-authorization/kafka-authz-realm.json
文件,然后单击 Create。现在,
在管理控制台中,kafka-authz
作为当前域。默认视图显示 Master 域。
在 Red Hat Single Sign-On Admin Console 中,进入 Clients > kafka > Authorization > Settings,并检查 Decision Strategy 是否已设置为 Affirmative。
一个策略意味着,客户端必须至少满足一个策略才能访问 Kafka 集群。
在红帽单点管理控制台中,前往 组、用户、角色和 客户端 以查看域配置。
- 组
-
组用于创建用户组
和设置用户权限。组是分配了名称的用户组。它们用于将用户划分到地理、组织或部门单元中。组可以链接到 LDAP 身份提供程序。您可以通过自定义 LDAP 服务器 admin 用户界面让用户成为组的成员,例如,授予 Kafka 资源的权限。 - 用户
-
用户
用于创建用户。本例中定义了alice
和bob
。Alice
是ClusterManager
组的成员,bob
是ClusterManager-my-cluster
组的成员。用户可以存储在 LDAP 身份提供商中。 - 角色
-
角色
将用户或客户端标记为具有特定权限。角色是类似于组的概念。它们通常用于为用户 添加 组织角色,并具有必要的权限。角色不能存储在 LDAP 身份提供商中。如果 LDAP 是必需的,您可以改为使用组,并将红帽单点登录角色添加到组,以便在为用户分配组时也获得相应的角色。 - 客户端
客户端
可以具有特定的配置。在本例中,配置了kafka
、kafka-cli
、team-a-client
和team-b-client
客户端。-
kafka
客户端供 Kafka 代理用于执行必要的 OAuth 2.0 通信,以进行访问令牌验证。此客户端还包含授权服务资源定义、策略和授权范围,用于在 Kafka 代理上执行授权。授权配置在 Authorization 选项卡的kafka
客户端中定义,在 Settings 选项卡中打开 授权启用 时可看到该配置。 -
kafka-cli
客户端是一个公共客户端,在使用用户名和密码进行身份验证时供 Kafka 命令行工具使用,以获取访问令牌或刷新令牌。 -
team-a-client
和team-b-client
客户端是机密客户端,代表对某些 Kafka 主题有部分访问权限的服务。
-
在 Red Hat Single Sign-On Admin Console 中,进入 Authorization > Permissions,以查看使用为域定义的资源和策略所授予的权限。
例如,
kafka
客户端有以下权限:Dev Team A can write to topics that start with x_ on any cluster Dev Team B can read from topics that start with x_ on any cluster Dev Team B can update consumer group offsets that start with x_ on any cluster ClusterManager of my-cluster Group has full access to cluster config on my-cluster ClusterManager of my-cluster Group has full access to consumer groups on my-cluster ClusterManager of my-cluster Group has full access to topics on my-cluster
- Dev 团队 A
-
Dev 团队 A 域角色可以写入任何群集上以
x_
开头的主题。这结合了名为Topic:x_*
、Describe和
Write
范围以及Dev Team A 策略
的资源。Dev 团队 A 策略
与具有名为Dev Team A
的域角色的所有用户匹配。 - Dev 团队 B
-
Dev 团队 B 域角色可以从任何群集上以
x_
开头的主题中读取。这结合了主题:x_*
、Group:x_*
资源、Describe
范围以及和
ReadDev Team B
策略。Dev 团队 B
策略匹配具有名为Dev Team B 的域角色的所有用户
。匹配的用户和客户端能够从主题中读取,并为名称以x_
开头的主题和消费者组更新所消耗的偏移量。