4.4.6.2. 配置 Kafka 代理的 OAuth 2.0 支持
这个步骤描述了如何配置 Kafka 代理,以便代理监听程序被启用为使用授权服务器使用 OAuth 2.0 身份验证。
我们建议通过配置 TLS 侦听器在加密接口上使用 OAuth 2.0。不建议纯监听器。
如果授权服务器使用由可信 CA 签名的证书并匹配 OAuth 2.0 服务器主机名,则 TLS 连接可以使用默认设置。否则,您可能需要使用探测器证书或禁用证书主机名验证来配置信任存储。
在配置 Kafka 代理时,在新连接的 Kafka 客户端的 OAuth 2.0 验证过程中,您有两个用于验证访问令牌的机制:
开始前
有关为 Kafka 代理监听程序配置 OAuth 2.0 身份验证的更多信息,请参阅:
先决条件
- AMQ Streams 和 Kafka 正在运行
- 部署了 OAuth 2.0 授权服务器
步骤
在编辑器中更新
Kafka 资源的 Kafka 代理配置(
)。Kafka
.spec.kafkaoc edit kafka my-cluster
配置 Kafka 代理
监听程序
配置。每种侦听器的配置不一定是独立的,因为它们是独立的。
此处的示例显示了为外部侦听器配置的配置选项。
示例 1:配置快速本地 JWT 令牌验证
#... - name: external port: 9094 type: loadbalancer tls: true authentication: type: oauth 1 validIssuerUri: <https://<auth-server-address>/auth/realms/external> 2 jwksEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/certs> 3 userNameClaim: preferred_username 4 maxSecondsWithoutReauthentication: 3600 5 tlsTrustedCertificates: 6 - secretName: oauth-server-cert certificate: ca.crt disableTlsHostnameVerification: true 7 jwksExpirySeconds: 360 8 jwksRefreshSeconds: 300 9 jwksMinRefreshPauseSeconds: 1 10 enableECDSA: "true" 11
- 1
- 侦听器类型设置为
oauth
。 - 2
- 用于身份验证的令牌签发者的 URI。
- 3
- 用于本地 JWT 验证的 JWKS 证书端点 URI。
- 4
- 在令牌中包含实际用户名的令牌声明(或密钥)。用户名 是用于 标识用户的主体。
userNameClaim
值将取决于身份验证流和使用的授权服务器。 - 5
- (可选)激活 Kafka 重新身份验证机制,强制会话过期的时间与访问令牌相同。如果指定的值小于访问令牌过期的时间,客户端必须在实际令牌到期之前重新进行身份验证。默认情况下,会话不会在访问令牌过期时过期,客户端也不会尝试重新身份验证。
- 6
- (可选)用于 TLS 连接到授权服务器的受信任证书。
- 7
- (可选)禁用 TLS 主机名验证。默认为
false
。 - 8
- JWKS 证书在过期前被视为有效的时间。默认值为
360
秒。如果您指定了更长的时间,请考虑允许访问撤销的证书的风险。 - 9
- JWKS 证书刷新间隔的时间段。间隔必须至少比到期间隔短 60 秒。默认值为
300
秒。 - 10
- 连续尝试刷新 JWKS 公钥之间的最小暂停(以秒为单位)。当遇到未知签名密钥时,将在常规定期计划外调度 JWKS 密钥刷新,并且自上次刷新尝试后至少使用指定的暂停。刷新键遵循 exponential backoff 规则,不成功刷新会一直增加暂停,直到它到达
jwksRefreshSeconds
。默认值为 1。 - 11
- (可选)如果使用 ECDSA 在授权服务器上签署 JWT 令牌,则需要启用此功能。它使用 BouncyCastle 加密库安装额外的加密供应商。默认为
false
。
示例 2:使用内省端点配置令牌验证
- name: external port: 9094 type: loadbalancer tls: true authentication: type: oauth validIssuerUri: <https://<auth-server-address>/auth/realms/external> introspectionEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token/introspect> 1 clientId: kafka-broker 2 clientSecret: 3 secretName: my-cluster-oauth key: clientSecret userNameClaim: preferred_username 4 maxSecondsWithoutReauthentication: 3600 5
根据您应用 OAuth 2.0 身份验证的方式,以及授权服务器的类型,您可以使用额外的(可选)配置设置:
# ... authentication: type: oauth # ... checkIssuer: false 1 fallbackUserNameClaim: client_id 2 fallbackUserNamePrefix: client-account- 3 validTokenType: bearer 4 userInfoEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/userinfo 5
- 1
- 如果您的授权服务器不提供
iss
声明,则无法执行签发者检查。在这种情况下,把checkIssuer
设置为false
,且不指定validIssuerUri
。默认值为true
。 - 2
- 授权服务器不能提供单个属性来标识常规用户和客户端。当客户端在其自己的名称中进行身份验证时,服务器可能会提供 客户端 ID。当用户使用用户名和密码进行身份验证时,为了获取刷新令牌或访问令牌,服务器可能会提供除客户端 ID 之外 的用户名 属性。使用此回退选项指定用户名声明(attribute),以便在主用户 ID 属性不可用时使用。
- 3
- 在适用
fallbackUserNameClaim
的情况下,可能还需要防止用户名声明的值与回退用户名声明的值冲突。请考虑存在名为producer
的客户端,但也存在名为producer
的常规用户。为了区分这两者,您可以使用此属性向客户端的用户 ID 添加前缀。 - 4
- (仅在使用
内省EndpointUri
时)取决于您使用的授权服务器,内省端点可能会也可能不会返回 令牌类型 属性,或者它可能包含不同的值。您可以指定内省端点必须包含的有效令牌类型值。 - 5
- (仅在使用
内省EndpointUri
时)可以配置或实施授权服务器,以免在内省端点响应中提供任何可识别的信息。若要获取用户 ID,您可以将userinfo
端点的 URI 配置为回退。userNameClaim
、fallbackUserNameClaim
和fallbackUserNamePrefix
设置应用于userinfo
端点的响应。
- 保存并退出编辑器,然后等待滚动更新完成。
检查日志中的更新,或者查看 pod 状态转换:
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get po -w
滚动更新将代理配置为使用 OAuth 2.0 身份验证。
接下来要做什么