4.10. 使用基于 OAuth 2.0 令牌的身份验证
AMQ Streams 支持使用 OAUTHBEARER 和 PLAIN 机制的 OAuth 2.0 身份验证。
OAuth 2.0 支持应用之间基于令牌的标准化身份验证和授权,使用中央授权服务器发布对资源的有限访问权限的令牌。
Kafka 代理和客户端都需要配置为使用 OAuth 2.0。您可以配置 OAuth 2.0 身份验证,然后配置 OAuth 2.0 授权。
无论使用什么 授权服务器,OAuth 2.0 身份验证可以和基于 ACL 的 Kafka 授权一起使用。
通过使用 OAuth 2.0 身份验证,应用程序客户端可以访问应用服务器(称为 资源服务器)上的资源,而无需公开帐户凭据。
应用客户端通过访问令牌来进行身份验证,应用服务器也可以使用该令牌来确定要授予的访问权限级别。授权服务器处理关于访问权限的访问和咨询。
在 AMQ Streams 中:
- Kafka 代理充当 OAuth 2.0 资源服务器
- Kafka 客户端充当 OAuth 2.0 应用程序客户端
Kafka 客户端向 Kafka 代理进行身份验证。代理和客户端根据需要与 OAuth 2.0 授权服务器通信,以获取或验证访问令牌。
对于 AMQ Streams 的部署,OAuth 2.0 集成提供:
- 对 Kafka 代理的服务器端 OAuth 2.0 支持
- 客户端 OAuth 2.0 支持 Kafka MirrorMaker、Kafka Connect 和 Kafka Bridge
RHEL 上的 AMQ Streams 包括两个 OAuth 2.0 库:
kafka-oauth-client
-
提供一个名为
io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
的自定义登录回调处理程序类。要处理OAUTHBEARER
身份验证机制,请使用由 Apache Kafka 提供的OAuthBearerLoginModule
登录回调处理程序。 kafka-oauth-common
-
提供
kafka-oauth-client
库所需的一些功能的帮助程序库。
提供的客户端库还依赖于一些额外的第三方库,如 keycloak-core
、jackson-databind
和 slf4j-api
。
我们建议使用 Maven 项目打包您的客户端,以确保包含所有依赖项库。依赖库可能会在以后的版本中有所变化。
为 Kafka 客户端 Java 库提供了一个 OAuth 回调处理程序,因此您不需要为 Java 客户端自行编写回调处理程序。应用客户端可以使用回调处理程序来提供访问令牌。以其他语言编写的客户端(如 Go)必须使用自定义代码连接到授权服务器并获取访问令牌。
其它资源
4.10.1. OAuth 2.0 身份验证机制
AMQ Streams 支持 OAUTHBEARER 和 PLAIN 机制进行 OAuth 2.0 身份验证。这两种机制都允许 Kafka 客户端通过 Kafka 代理建立经过身份验证的会话。客户端、授权服务器和 Kafka 代理之间的身份验证流程因每种机制而异。
建议您将客户端配置为尽可能使用 OAUTHBEARER。OAUTHBEARER 提供比 PLAIN 更高的安全级别,因为客户端凭证 永远不会 与 Kafka 代理共享。只考虑在不支持 OAUTHBEARER 的 Kafka 客户端中使用 PLAIN。
如有必要,可以在相同的 OAuth 身份验证监听器配置中同时启用 OAUTHBEARER 和 PLAIN。
OAUTHBEARER 概述
Kafka 支持 OAUTHBEARER 身份验证机制,但必须明确配置它。许多 Kafka 客户端工具在协议级别使用为 OAUTHBEARER 提供基本支持的库。
使用 OAUTHBEARER 时,客户端会启动与 Kafka 代理的会话进行凭证交换,其中凭证采用回调处理程序提供的 bearer 令牌的形式。通过使用回调,您可以通过以下三种方法之一配置令牌置备:
- 客户端 ID 和 Secret(使用 OAuth 2.0 客户端凭证机制)
- 长期访问令牌,在配置时手动获得
- 长期存在的刷新令牌,在配置时手动获取
要使用 OAUTHBEARER,您必须在 Kafka 代理的 OAuth 身份验证监听程序配置中将 sasl.enabled.mechanisms
设置为 OAUTHBEARER
。有关详细配置,请参阅 第 4.10.2 节 “OAuth 2.0 Kafka 代理配置”。
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER
OAUTHBEARER 身份验证只能由支持协议级别的 OAUTHBEARER 机制的 Kafka 客户端使用。
PLAIN 概述
PLAIN 是所有 Kafka 客户端工具支持的简单身份验证机制,包括 kafkacat 等开发人员工具。为了启用 PLAIN 与 OAuth 2.0 身份验证一起使用,RHEL 上的 AMQ Streams 包括服务器端回调。PLAIN 的 AMQ 流实现被称为 OAuth 2.0 over PLAIN。
对于 OAuth 2.0 over PLAIN,客户端凭证不会存储在 ZooKeeper 中。相反,它们在兼容授权服务器后面被集中处理,这与使用 OAUTHBEARER 身份验证时类似。
当与 OAuth 2.0 over PLAIN 回调搭配使用时,Kafka 客户端使用以下方法之一向 Kafka 代理进行身份验证:
- 客户端 ID 和 secret(使用 OAuth 2.0 客户端凭证机制)
- 长期访问令牌,在配置时手动获得
客户端必须启用才能使用 PLAIN 身份验证,并提供 username
和 password
。如果密码前缀为 $accessToken:
,后跟访问令牌的值,Kafka 代理会将密码解释为访问令牌。否则,Kafka 代理会将 username
解释为客户端 ID,password
解释为客户端 secret。
如果将 password
设置为访问令牌,username
必须设置为 Kafka 代理从访问令牌获取的相同主体名称。该进程取决于您如何使用 userNameClaim
、fallbackUserNameClaim
、fallbackUsernamePrefix
或 userInfoEndpointUri
配置用户名提取。它还取决于您的授权服务器;特别是,如何将客户端 ID 映射到帐户名称。
您可以在 Kafka 代理的 OAuth 验证监听程序配置中启用 PLAIN。为此,请在 sasl.enabled.mechanisms
的值中添加 PLAIN
。
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER,PLAIN
有关详细配置,请参阅 第 4.10.2 节 “OAuth 2.0 Kafka 代理配置”。
4.10.1.1. 使用属性或变量配置 OAuth 2.0
您可以使用 Java 身份验证和授权服务(JAAS)属性或环境变量来配置 OAuth 2.0 设置。
-
JAAS 属性在
server.properties
配置文件中配置,并作为listener.name.LISTENER-NAME.oauthbearer.sasl.jaas.config
属性的键值对传递。 如果使用环境变量,您仍需要在
server.properties
文件中提供listener.name.LISTENER-NAME.oauthbearer.sasl.jaas.config
属性,但您可以省略其他 JAAS 属性。您可以使用大写或大写的环境变量命名约定。
AMQ Streams OAuth 2.0 库使用开头的属性:
-
oauth.
配置身份验证 -
strimzi.
配置 OAuth 2.0 授权