4.10.6.2. 配置 Kafka 代理的 OAuth 2.0 支持
这个步骤描述了如何配置 Kafka 代理,以便代理监听程序被启用为使用授权服务器使用 OAuth 2.0 身份验证。
我们建议通过配置 TLS 侦听器在加密接口上使用 OAuth 2.0。不建议纯监听器。
使用支持所选授权服务器的属性以及您要实施的授权类型来配置 Kafka 代理。
开始前
有关 Kafka 代理监听程序的配置和身份验证的更多信息,请参阅:
有关监听程序配置中使用的属性的描述,请参阅:
先决条件
- AMQ Streams 和 Kafka 正在运行
- 部署了 OAuth 2.0 授权服务器
流程
在
server.properties
文件中配置 Kafka 代理监听程序配置。例如,使用 OAUTHBEARER 机制:
sasl.enabled.mechanisms=OAUTHBEARER listeners=CLIENT://0.0.0.0:9092 listener.security.protocol.map=CLIENT:SASL_PLAINTEXT listener.name.client.sasl.enabled.mechanisms=OAUTHBEARER sasl.mechanism.inter.broker.protocol=OAUTHBEARER inter.broker.listener.name=CLIENT 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 ; listener.name.client.oauthbearer.sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
将代理连接设置配置为
listener.name.client.oauthbearer.sasl.jaas.config
的一部分。此处的示例演示了连接配置选项。
示例 1:使用 JWKS 端点配置进行本地令牌验证
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.valid.issuer.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME" \ oauth.jwks.endpoint.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/certs" \ oauth.jwks.refresh.seconds="300" \ oauth.jwks.refresh.min.pause.seconds="1" \ oauth.jwks.expiry.seconds="360" \ oauth.username.claim="preferred_username" \ oauth.ssl.truststore.location="PATH-TO-TRUSTSTORE-P12-FILE" \ oauth.ssl.truststore.password="TRUSTSTORE-PASSWORD" \ oauth.ssl.truststore.type="PKCS12" ; listener.name.client.oauthbearer.connections.max.reauth.ms=3600000
示例 2:通过 OAuth 2.0 内省端点将令牌验证委派给授权服务器
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.introspection.endpoint.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/introspection" \ # ...
如果需要,配置对授权服务器的访问权限。
生产环境通常需要这一步,除非使用 服务网格 等技术在容器外部配置安全频道。
提供用于连接到安全授权服务器的自定义信任存储。访问授权服务器时始终需要 SSL。
设置属性以配置信任存储。
例如:
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ # ... oauth.client.id="kafka-broker" \ oauth.client.secret="kafka-broker-secret" \ oauth.ssl.truststore.location="PATH-TO-TRUSTSTORE-P12-FILE" \ oauth.ssl.truststore.password="TRUSTSTORE-PASSWORD" \ oauth.ssl.truststore.type="PKCS12" ;
如果证书主机名与访问 URL 主机名不匹配,您可以关闭证书主机名验证:
oauth.ssl.endpoint.identification.algorithm=""
检查可确保客户端与授权服务器的连接是身份验证的。您可能需要在非生产环境中关闭验证。
根据您选择的身份验证流配置其他属性。
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ # ... oauth.token.endpoint.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/token" \ 1 oauth.custom.claim.check="@.custom == 'custom-value'" \ 2 oauth.scope="SCOPE" \ 3 oauth.check.audience="true" \ 4 oauth.audience="AUDIENCE" \ 5 oauth.valid.issuer.uri="https://https://AUTH-SERVER-ADDRESS/auth/REALM-NAME" \ 6 oauth.client.id="kafka-broker" \ 7 oauth.client.secret="kafka-broker-secret" \ 8 oauth.refresh.token="REFRESH-TOKEN-FOR-KAFKA-BROKERS" \ 9 oauth.access.token="ACCESS-TOKEN-FOR-KAFKA-BROKERS" ; 10
- 1
- 授权服务器的 OAuth 2.0 令牌端点 URL。对于生产环境,始终使用 HTTPs。使用
KeycloakRBACAuthorizer
时需要,或使用 OAuth 2.0 启用的监听程序进行内部通信。 - 2
- (可选) 自定义声明检查.在验证期间对 JWT 访问令牌应用其他自定义规则的 JsonPath 过滤器查询。如果访问令牌不包含必要的数据,则会被拒绝。使用 内省 端点方法时,自定义检查将应用到内省端点响应 JSON。
- 3
- (可选)传递给令牌端点的
scope
参数。在获取用于代理身份验证的访问令牌时,会使用 范围。它还在 OAuth 2.0 的客户端名称中使用clientId
和secret
进行 PLAIN 客户端身份验证。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响侦听器的令牌验证规则。 - 4
- (可选) 正确检查。如果您的授权服务器提供
aud
(严重)声明,并且您希望强制进行使用者检查,请将ouath.check.audience
设置为true
。使用者检查可识别令牌的预期接收者。因此,Kafka 代理将拒绝在其aud
声明中没有其clientId
的令牌。默认值为false
。 - 5
- (可选)传递给令牌端点的
audience
参数。在获取用于代理身份验证的访问令牌时,会使用 使用者。它还在 OAuth 2.0 的客户端名称中使用clientId
和secret
进行 PLAIN 客户端身份验证。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响侦听器的令牌验证规则。 - 6
- 有效的签发者 URI。只有签发者发布的访问令牌才会被接受。(始终需要.)
- 7
- Kafka 代理配置的客户端 ID,在所有代理中都相同。这是在 授权服务器注册为
kafka-broker
的客户端。使用内省端点进行令牌验证或使用KeycloakRBACAuthorizer
时需要此项。 - 8
- 为 Kafka 代理配置 secret,在所有代理中都相同。当代理必须与授权服务器进行身份验证时,必须指定客户端 secret、访问令牌或刷新令牌。
- 9
- (可选) Kafka 代理的长期刷新令牌。
- 10
- (可选) Kafka 代理的长期访问令牌。
根据您应用 OAuth 2.0 身份验证的方式,以及所使用的授权服务器类型,添加额外的配置设置:
listener.name.client.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ # ... oauth.check.issuer=false \ 1 oauth.fallback.username.claim="CLIENT-ID" \ 2 oauth.fallback.username.prefix="CLIENT-ACCOUNT" \ 3 oauth.valid.token.type="bearer" \ 4 oauth.userinfo.endpoint.uri="https://AUTH-SERVER-ADDRESS/auth/realms/REALM-NAME/protocol/openid-connect/userinfo" ; 5
- 1
- 如果您的授权服务器不提供
iss
声明,则无法执行签发者检查。在这种情况下,将oauth.check.issuer
设置为false
,且不要指定oauth.valid.issuer.uri
。默认值为true
。 - 2
- 授权服务器不能提供单个属性来标识常规用户和客户端。当客户端在其自己的名称中进行身份验证时,服务器可能会提供 客户端 ID。当用户使用用户名和密码进行身份验证时,为了获取刷新令牌或访问令牌,服务器可能会提供除客户端 ID 之外 的用户名 属性。使用此回退选项指定用户名声明(attribute),以便在主用户 ID 属性不可用时使用。
- 3
- 在适用
oauth.fallback.username.claim
的情况下,可能还需要防止名称在用户名声明的值和回退用户名声明的值之间发生冲突。请考虑存在名为producer
的客户端,但还有一个名为producer
的普通用户。为了区分这两者,您可以使用此属性向客户端的用户 ID 添加前缀。 - 4
- (仅在使用
oauth.introspection.endpoint.uri
时)取决于您使用的授权服务器,内省端点可能会也可能不会返回 令牌类型 属性,或者它可能包含不同的值。您可以指定内省端点必须包含的有效令牌类型值。 - 5
- (仅在使用
oauth.introspection.endpoint.uri
时适用)可以配置或实施授权服务器,以避免在内省端点响应中提供任何可识别的信息。要获取用户 ID,您可以将userinfo
端点的 URI 配置为回退。oauth.fallback.username.claim
、oauth.fallback.username.claim
和oauth.fallback.username.prefix
设置应用于userinfo
端点的响应。
接下来要做什么