4.10.2.2. Kafka 集群中的 OAuth 2.0 身份验证配置


要在 Kafka 集群中使用 OAuth 2.0 身份验证,您可以在 Kafka server.properties 文件中为 Kafka 集群启用 OAuth 身份验证监听程序配置。最低配置是必需的。您还可以配置 TLS 侦听器,其中 TLS 用于代理间通信。

您可以使用以下方法之一配置授权服务器用于令牌验证的代理:

  • 快速本地令牌验证: JWKS 端点与签名 JWT 格式的访问令牌组合
  • 内省 端点

您可以配置 OAUTHBEARER 或 PLAIN 身份验证,或两者。

以下示例显示了应用 全局 监听器配置的最小配置,这意味着代理间通信与应用客户端通过相同的侦听器。

这个示例还显示了特定监听器的 OAuth 2.0 配置,您可以在其中指定 listener.name.LISTENER-NAME.sasl.enabled.mechanisms 而不是 sasl.enabled.mechanismsLISTENER-NAME 是监听器不区分大小写的名称。在这里,我们为监听程序命名 CLIENT,因此属性名称为 listener.name.client.sasl.enabled.mechanisms

这个示例使用 OAUTHBEARER 身份验证。

示例:使用 JWKS 端点的 OAuth 2.0 身份验证的最小侦听器配置

sasl.enabled.mechanisms=OAUTHBEARER 1
listeners=CLIENT://0.0.0.0:9092 2
listener.security.protocol.map=CLIENT:SASL_PLAINTEXT 3
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER 4
sasl.mechanism.inter.broker.protocol=OAUTHBEARER 5
inter.broker.listener.name=CLIENT 6
listener.name.client.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler 7
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ 8
  oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS" \ 9
  oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/jwks" \ 10
  oauth.username.claim="preferred_username"  \ 11
  oauth.client.id="kafka-broker" \ 12
  oauth.client.secret="kafka-secret" \ 13
  oauth.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/token" ; 14
listener.name.client.oauthbearer.sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler 15
listener.name.client.oauthbearer.connections.max.reauth.ms=3600000 16

1
启用 OAUTHBEARER 机制,用于通过 SASL 进行凭据交换。
2
为要连接的客户端应用配置侦听器。系统 hostname 用作公告的主机名,客户端必须解析该主机名才能重新连接。在这个示例中,监听程序命名为 CLIENT
3
指定监听器的频道协议。SASL_SSL 用于 TLS。SASL_PLAINTEXT 用于未加密的连接(无 TLS),但存在 TCP 连接层窃听和拦截的风险。
4
指定 CLIENT 侦听器的 OAUTHBEARER 机制。客户端名称(CLIENT)通常使用大写的 listeners 属性指定,listener.name 属性(listener.name.client)小写,而 listener.name.client.* 属性的一部分则为小写。
5
指定用于代理间通信的 OAUTHBEARER 机制。
6
指定用于代理间通信的监听程序。需要指定 才能使配置有效。
7
在客户端监听程序上配置 OAuth 2.0 身份验证。
8
配置客户端和代理间通信的身份验证设置。oauth.client.idoauth.client.secretauth.token.endpoint.uri 属性与代理配置相关。
9
有效的签发者 URI。只有签发者发布的访问令牌才会被接受。例如: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME
10
JWKS 端点 URL。例如: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs
11
在令牌中包含实际用户名的令牌声明(或密钥)。用户名 是用于 标识用户的主体。该值取决于身份验证流和使用的授权服务器。
12
Kafka 代理的客户端 ID,适用于所有代理。这是在 授权服务器注册为 kafka-broker的客户端
13
Kafka 代理的 secret,在所有代理中都相同。
14
授权服务器的 OAuth 2.0 令牌端点 URL。对于生产环境,始终使用 HTTPs。例如: https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token
15
为代理间的通信启用(仅需要)OAuth 2.0 身份验证。
16
(可选)当令牌过期时强制会话到期,并激活 Kafka 重新身份验证机制。如果指定的值小于访问令牌过期的时间,客户端必须在实际令牌到期之前重新进行身份验证。默认情况下,会话不会在访问令牌过期时过期,客户端也不会尝试重新身份验证。

以下示例显示了 TLS 侦听器的最低配置,其中 TLS 用于代理间通信。

示例:OAuth 2.0 身份验证的 TLS 侦听器配置

listeners=REPLICATION://kafka:9091,CLIENT://kafka:9092 1
listener.security.protocol.map=REPLICATION:SSL,CLIENT:SASL_PLAINTEXT 2
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER
inter.broker.listener.name=REPLICATION
listener.name.replication.ssl.keystore.password=KEYSTORE-PASSWORD 3
listener.name.replication.ssl.truststore.password=TRUSTSTORE-PASSWORD
listener.name.replication.ssl.keystore.type=JKS
listener.name.replication.ssl.truststore.type=JKS
listener.name.replication.ssl.endpoint.identification.algorithm=HTTPS 4
listener.name.replication.ssl.secure.random.implementation=SHA1PRNG 5
listener.name.replication.ssl.keystore.location=PATH-TO-KEYSTORE 6
listener.name.replication.ssl.truststore.location=PATH-TO-TRUSTSTORE 7
listener.name.replication.ssl.client.auth=required 8
listener.name.client.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
  oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS" \
  oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/jwks" \
  oauth.username.claim="preferred_username" ; 9

1
在代理间通信和客户端应用需要单独的配置。
2
REPLICATION 侦听器配置为使用 TLS,并将 CLIENT 侦听器配置为通过未加密频道使用 SASL。客户端可以在生产环境中使用加密的频道(SASL_SSL)。
3
ssl. 属性定义 TLS 配置。
4
随机数字生成器实施.如果没有设置,则使用 Java 平台 SDK 默认。
5
主机名验证.如果设置为空字符串,则主机名验证将关闭。如果没有设置,则默认值为 HTTPS,它会强制对服务器证书进行主机名验证。
6
监听器的密钥存储路径。
7
监听器信任存储的路径。
8
指定在建立 TLS 连接时,REPLICATION 侦听器的客户端必须通过客户端证书进行身份验证(用于代理间的连接)。
9
为 OAuth 2.0 配置 CLIENT 侦听器。与授权服务器的连接应使用安全 HTTPS 连接。

以下示例显示了使用 PLAIN 身份验证机制通过 SASL 进行凭证交换的 OAuth 2.0 身份验证的最小配置。使用快速本地令牌验证。

示例:PLAIN 身份验证的最小监听器配置

listeners=CLIENT://0.0.0.0:9092 1
listener.security.protocol.map=CLIENT:SASL_PLAINTEXT 2
listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER,PLAIN 3
sasl.mechanism.inter.broker.protocol=OAUTHBEARER 4
inter.broker.listener.name=CLIENT 5
listener.name.client.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler 6
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ 7
  oauth.valid.issuer.uri="http://AUTH_SERVER/auth/realms/REALM" \ 8
  oauth.jwks.endpoint.uri="https://AUTH_SERVER/auth/realms/REALM/protocol/openid-connect/certs" \ 9
  oauth.username.claim="preferred_username"  \ 10
  oauth.client.id="kafka-broker" \ 11
  oauth.client.secret="kafka-secret" \ 12
  oauth.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/token" ; 13
listener.name.client.oauthbearer.sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler 14
listener.name.client.plain.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.plain.JaasServerOauthOverPlainValidatorCallbackHandler 15
listener.name.client.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ 16
  oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS" \ 17
  oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/jwks" \ 18
  oauth.username.claim="preferred_username"  \ 19
  oauth.token.endpoint.uri="http://AUTH_SERVER/auth/realms/REALM/protocol/openid-connect/token" ; 20
connections.max.reauth.ms=3600000 21

1
为客户端应用程序配置要连接的监听程序(本例中名为 CLIENT )。系统 hostname 用作公告的主机名,客户端必须解析该主机名才能重新连接。由于这是唯一配置的侦听器,因此它也用于代理间通信。
2
将示例 CLIENT 侦听器配置为通过未加密频道使用 SASL。在生产环境中,客户端应使用加密通道(SASL_SSL)来防止 TCP 连接层被窃听和拦截。
3
启用用于 SASL 和 OAUTHBEARER 的凭据交换的 PLAIN 身份验证机制。OAUTHBEARER 也被指定,因为它是代理间通信所必需的。Kafka 客户端可以选择使用哪一种机制进行连接。

PLAIN 身份验证由所有平台上的所有客户端支持。Kafka 客户端必须启用 PLAIN 机制并设置 usernamepassword。PLAIN 可用于使用 OAuth 访问令牌或 OAuth clientIdsecret (客户端凭证)进行身份验证。该行为还由是否指定 oauth.token.endpoint.uri 进行控制。

如果指定了 oauth.token.endpoint.uri,客户端设置 password 以字符串 $accessToken: 开头,服务器会将密码解析为访问令牌,并将 username 解释为帐户用户名。否则,username 会被解释为 clientIdpassword 作为客户端 secret,代理用于在客户端名称中获取访问令牌。

如果没有指定 oauth.token.endpoint.uripassword 总是被解释为一个访问令牌,username 总是被解释为帐户用户名,它必须与从令牌中提取的主要 id 匹配。这称为 'no-client-credentials' 模式,因为客户端必须始终自行获取访问令牌,且无法使用 clientIdsecret

4
指定 OAUTHBEARER 身份验证机制,用于代理间通信。
5
为 Inter-broker 通讯指定监听程序(本例中名为 CLIENT )。需要此项,以使配置有效。
6
为 OAUTHBEARER 机制配置服务器回调处理程序。
7
使用 OAUTHBEARER 机制配置客户端和代理间通信的身份验证设置。oauth.client.idoauth.client.secretoauth.token.endpoint.uri 属性与代理配置相关。
8
有效的签发者 URI。仅接受来自这个签发者的访问令牌。例如 :https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME
9
JWKS 端点 URL。例如 :https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs
10
在令牌中包含实际用户名的令牌声明(或密钥)。用户名 标识用户的主体。该值取决于身份验证流和使用的授权服务器。
11
Kafka 代理的客户端 ID,适用于所有代理。这是在 授权服务器注册为 kafka-broker的客户端
12
Kafka 代理的 secret(所有代理相同)。
13
授权服务器的 OAuth 2.0 令牌端点 URL。对于生产环境,始终使用 HTTPS。例如 :https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token
14
为代理间通信启用 OAuth 2.0 身份验证。
15
配置用于 PLAIN 身份验证的服务器回调处理程序。
16
使用 PLAIN 身份验证配置客户端通信的身份验证设置。

oauth.token.endpoint.uri 是一个可选属性,使用 OAuth 2.0 客户端凭证机制在 PLAIN 上启用 OAuth 2.0

17
有效的签发者 URI。仅接受来自这个签发者的访问令牌。例如 :https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME
18
JWKS 端点 URL。例如 :https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs
19
在令牌中包含实际用户名的令牌声明(或密钥)。用户名 标识用户的主体。该值取决于身份验证流和使用的授权服务器。
20
授权服务器的 OAuth 2.0 令牌端点 URL。对于生产环境,始终使用 HTTPs。例如 :https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token

PLAIN 机制的其他配置,允许客户端进行身份验证,方法是将 clientIdsecret 传递为 usernamepassword,如第 3 点所述。如果没有指定,客户端只能通过将访问令牌作为 password 参数传递来通过 PLAIN 验证。

21
(可选)当令牌过期时强制会话到期,并激活 Kafka 重新身份验证机制。如果指定的值小于访问令牌过期的时间,客户端必须在实际令牌到期之前重新进行身份验证。默认情况下,会话不会在访问令牌过期时过期,客户端也不会尝试重新身份验证。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.