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.mechanisms
。LISTENER-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.id
、oauth.client.secret
和auth.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 机制并设置
username
和password
。PLAIN 可用于使用 OAuth 访问令牌或 OAuthclientId
和secret
(客户端凭证)进行身份验证。该行为还由是否指定oauth.token.endpoint.uri
进行控制。如果指定了
oauth.token.endpoint.uri
,客户端设置password
以字符串$accessToken:
开头,服务器会将密码解析为访问令牌,并将username
解释为帐户用户名。否则,username
会被解释为clientId
,password
作为客户端secret
,代理用于在客户端名称中获取访问令牌。如果没有指定
oauth.token.endpoint.uri
,password
总是被解释为一个访问令牌,username
总是被解释为帐户用户名,它必须与从令牌中提取的主要 id 匹配。这称为 'no-client-credentials' 模式,因为客户端必须始终自行获取访问令牌,且无法使用clientId
和secret
。 - 4
- 指定 OAUTHBEARER 身份验证机制,用于代理间通信。
- 5
- 为 Inter-broker 通讯指定监听程序(本例中名为
CLIENT
)。需要此项,以使配置有效。 - 6
- 为 OAUTHBEARER 机制配置服务器回调处理程序。
- 7
- 使用 OAUTHBEARER 机制配置客户端和代理间通信的身份验证设置。
oauth.client.id
、oauth.client.secret
和oauth.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 机制的其他配置,允许客户端进行身份验证,方法是将
clientId
和secret
传递为username
和password
,如第 3 点所述。如果没有指定,客户端只能通过将访问令牌作为password
参数传递来通过 PLAIN 验证。 - 21
- (可选)当令牌过期时强制会话到期,并激活 Kafka 重新身份验证机制。如果指定的值小于访问令牌过期的时间,客户端必须在实际令牌到期之前重新进行身份验证。默认情况下,会话不会在访问令牌过期时过期,客户端也不会尝试重新身份验证。