4.4. 使用基于 OAuth 2.0 令牌的身份验证
AMQ Streams 支持使用 SASL OAUTHBEARER 机制进行 OAuth 2.0 身份验证。
OAuth 2.0 支持应用之间基于令牌的标准化身份验证和授权,使用中央授权服务器发布对资源的有限访问权限的令牌。
您可以配置 OAuth 2.0 身份验证,然后配置 OAuth 2.0 授权。
OAuth 2.0 身份验证也可与 简单
或基于 OPA 的 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
其它资源
4.4.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 提供基本支持的库。
为简化应用程序开发,AMQ Streams 为上游 Kafka 客户端 Java 库(但不为其他库)提供 OAuth 回调处理程序。因此,您不需要为此类客户端自行编写回调处理程序。应用客户端可以使用回调处理程序来提供访问令牌。以其他语言编写的客户端(如 Go)必须使用自定义代码连接到授权服务器并获取访问令牌。
使用 OAUTHBEARER 时,客户端会启动与 Kafka 代理的会话进行凭证交换,其中凭证采用回调处理程序提供的 bearer 令牌的形式。通过使用回调,您可以通过以下三种方法之一配置令牌置备:
- 客户端 ID 和 Secret(使用 OAuth 2.0 客户端凭证机制)
- 长期访问令牌,在配置时手动获得
- 长期存在的刷新令牌,在配置时手动获取
OAUTHBEARER 在 Kafka 代理的 oauth
监听程序配置中自动启用。您可以将 enableOauthBearer
属性设置为 true
,但这不是强制要求。
# ... authentication: type: oauth # ... enableOauthBearer: true
OAUTHBEARER 身份验证只能由支持协议级别的 OAUTHBEARER 机制的 Kafka 客户端使用。
PLAIN 概述
PLAIN 是供所有 Kafka 客户端工具(包括 kafkacat 等开发人员工具)使用的简单身份验证机制。为了启用 PLAIN 与 OAuth 2.0 身份验证一同使用,AMQ Streams 包含服务器端回调,并通过 PLAIN 调用这个 OAuth 2.0。
随着 PLAIN 的 AMQ Streams 实施,客户端凭据不会存储在 ZooKeeper 中。相反,客户端凭证在兼容授权服务器后面集中处理,这与使用 OAUTHBEARER 身份验证时类似。
当与 OAuth 2.0 over PLAIN 回调搭配使用时,Kafka 客户端使用以下方法之一向 Kafka 代理进行身份验证:
- 客户端 ID 和 secret(使用 OAuth 2.0 客户端凭证机制)
- 长期访问令牌,在配置时手动获得
客户端必须启用才能使用 PLAIN 身份验证,并提供 用户名和密码
。如果密码的前缀为
$accessToken:
,后跟访问令牌的值,Kafka 代理会将密码解析为访问令牌。否则,Kafka 代理会将 用户名
解释为客户端 ID,密码
将解释为客户端 secret。
如果将 密码
设置为访问令牌,用户名
必须设置为 Kafka 代理从访问令牌获取的相同主体名称。这个过程取决于您如何使用 userNameClaim、
或 fallbackUserNameClaim
、fallbackUser
namePrefixuserInfoEndpointUri
配置用户名提取。它还取决于您的授权服务器;特别是,如何将客户端 ID 映射到帐户名称。
要使用 PLAIN,您必须在 Kafka 代理的 oauth
监听程序配置中启用它。
在以下示例中,除了默认启用的 OAUTHBEARER 外,还启用了 PLAIN。如果只使用 PLAIN,可以通过将 enableOauthBearer 设置为
EARER。
false
来禁用 OAUTHB
# ...
authentication:
type: oauth
# ...
enablePlain: true
tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token