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
- 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。
示例 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 checkAudience: true 2 fallbackUserNameClaim: client_id 3 fallbackUserNamePrefix: client-account- 4 validTokenType: bearer 5 userInfoEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/userinfo 6 enableOauthBearer: false 7 enablePlain: true 8 tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token 9 customClaimCheck: "@.custom == 'custom-value'" 10 clientAudience: AUDIENCE 11 clientScope: SCOPE 12
- 1
- 如果您的授权服务器不提供
iss
声明,则无法执行签发者检查。在这种情况下,把checkIssuer
设置为false
,且不指定validIssuerUri
。默认值为true
。 - 2
- 如果您的授权服务器提供
ud
(严重)申索,并且您希望强制进行使用者检查,请将checkAudience
设置为true
。使用者检查可识别令牌的预期接收者。因此,Kafka 代理将拒绝在其aud
声明中没有其clientId
的令牌。默认为false
。 - 3
- 授权服务器不能提供单个属性来标识常规用户和客户端。当客户端在其自己的名称中进行身份验证时,服务器可能会提供 客户端 ID。当用户使用用户名和密码进行身份验证时,为了获取刷新令牌或访问令牌,服务器可能会提供除客户端 ID 之外 的用户名 属性。使用此回退选项指定用户名声明(attribute),以便在主用户 ID 属性不可用时使用。
- 4
- 在适用
fallbackUserNameClaim
的情况下,可能还需要防止用户名声明的值与回退用户名声明的值冲突。请考虑存在名为producer
的客户端,但也存在名为producer
的常规用户。为了区分这两者,您可以使用此属性向客户端的用户 ID 添加前缀。 - 5
- (仅在使用
内省EndpointUri
时)取决于您使用的授权服务器,内省端点可能会也可能不会返回 令牌类型 属性,或者它可能包含不同的值。您可以指定内省端点必须包含的有效令牌类型值。 - 6
- (仅在使用
内省EndpointUri
时)可以配置或实施授权服务器,以免在内省端点响应中提供任何可识别的信息。若要获取用户 ID,您可以将userinfo
端点的 URI 配置为回退。userNameClaim
、fallbackUserNameClaim
和fallbackUserNamePrefix
设置应用于userinfo
端点的响应。 - 7
- 将其设置为
false' 以禁用监听器上的 OAUTHBEARER 机制。必须至少启用 PLAIN 或 OAUTHBEARER 中的一个。默认为 'true
。 - 8
- 设置为
true
,以便在监听器上启用 PLAIN 身份验证,这是所有平台上所有客户端支持的。Kafka 客户端必须启用 PLAIN 机制并设置用户名和密码
。PLAIN 可用于使用 OAuth 访问令牌或 OAuth
客户端Id
和secret
(客户端凭据)进行身份验证。该行为还由是否指定tokenEndpointUri
来控制。默认为false
。如果指定了tokenEndpointUri
,并且客户端将密码
设置为以字符串$accessToken:
开头,服务器会将密码解析为访问令牌,用户名
为帐户用户名。否则,用户名
将解释为clientId
,密码
解析为客户端secret
,代理用于在客户端名称中获取访问令牌。如果没有指定tokenEndpointUri
,密码
始终解析为访问令牌,并且用户名
始终被解释为帐户用户名,它必须与从令牌提取的主体 ID 匹配。这称为"no-client-credentials"模式,因为客户端必须始终自行获取访问令牌,并且无法使用clientId
和secret
。 - 9
- PLAIN 机制的其他配置,允许客户端进行身份验证,方法是传递
clientId
和secret
作为用户名和密码
,如上点所述。如果没有指定,客户端只能通过传递访问令牌作为
密码
参数通过 PLAIN 进行身份验证。 - 10
- 可以通过将此规则设置为 JsonPath 过滤器查询,在验证期间对 JWT 访问令牌应用其他自定义规则。如果访问令牌不包含必要的数据,则会被拒绝。使用
内省EndpointUri
时,自定义检查应用到内省端点响应 JSON。 - 11
- (可选)
传递到
令牌端点的使用者参数。在获取用于代理身份验证的访问令牌时,会使用 使用者。它也用于 OAuth 2.0 的客户端名称,通过 PLAIN 客户端身份验证使用clientId
和secret
。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响侦听器的令牌验证规则。 - 12
- (可选)传递到令牌端点
的范围
参数。在获取用于代理身份验证的访问令牌时,会使用 范围。它也用于 OAuth 2.0 的客户端名称,通过 PLAIN 客户端身份验证使用clientId
和secret
。这只会影响获取令牌的能力,以及令牌的内容,具体取决于授权服务器。它不会影响侦听器的令牌验证规则。
- 保存并退出编辑器,然后等待滚动更新完成。
检查日志中的更新,或者查看 pod 状态转换:
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
滚动更新将代理配置为使用 OAuth 2.0 身份验证。
接下来要做什么