Daniel Fonai created KAFKA-13730:
------------------------------------

             Summary: OAuth access token validation fails if it does not 
contain the "sub" claim
                 Key: KAFKA-13730
                 URL: https://issues.apache.org/jira/browse/KAFKA-13730
             Project: Kafka
          Issue Type: Bug
          Components: clients
    Affects Versions: 3.1.0
            Reporter: Daniel Fonai


Client authentication fails, when configured to use OAuth and the JWT access 
token does {*}not contain the sub claim{*}. This issue was discovered while 
testing Kafka integration with Ping Identity OAuth server. According to Ping's 
[documentation|https://apidocs.pingidentity.com/pingone/devguide/v1/api/#access-tokens-and-id-tokens]:
{quote}sub – A string that specifies the identifier for the authenticated user. 
This claim is not present for client_credentials tokens.
{quote}
In this case Kafka broker rejects the token regardless of the 
[sasl.oauthbearer.sub.claim.name|https://kafka.apache.org/documentation/#brokerconfigs_sasl.oauthbearer.sub.claim.name]
 property value.
 
----
 
Steps to reproduce:

1. Client configuration:
{noformat}
security.protocol=SASL_PLAINTEXT
sasl.mechanism=OAUTHBEARER
sasl.login.callback.handler.class=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerLoginCallbackHandler
sasl.oauthbearer.token.endpoint.url=https://oauth.server.fqdn/token/endpoint
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule
 required\
 clientId="kafka-client"\
 clientSecret="kafka-client-secret";
sasl.oauthbearer.sub.claim.name=client_id # claim name for the principal to be 
extracted from, needed for client side validation too
{noformat}
2. Broker configuration:
{noformat}
sasl.enabled.mechanisms=...,OAUTHBEARER
listener.name.sasl_plaintext.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule
 required;
listener.name.sasl_plaintext.oauthbearer.sasl.server.callback.handler.class=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerValidatorCallbackHandler
sasl.oauthbearer.jwks.endpoint.url=https://oauth.server.fqdn/jwks/endpoint
sasl.oauthbearer.expected.audience=oauth-audience # based on OAuth server setup
sasl.oauthbearer.sub.claim.name=client_id # claim name for the principal to be 
extracted from
{noformat}
3. Try to perform some client operation:
{noformat}
kafka-topics --bootstrap-server `hostname`:9092 --list --command-config 
oauth-client.properties
{noformat}
Result:

Client authentication fails due to invalid access token.
 - client log:

{noformat}
[2022-03-11 16:21:20,461] ERROR [AdminClient clientId=adminclient-1] Connection 
to node -1 (localhost/127.0.0.1:9092) failed authentication due to: 
{"status":"invalid_token"} (org.apache.kafka.clients.NetworkClient)
[2022-03-11 16:21:20,463] WARN [AdminClient clientId=adminclient-1] Metadata 
update failed due to authentication error 
(org.apache.kafka.clients.admin.internals.AdminMetadataManager)
org.apache.kafka.common.errors.SaslAuthenticationException: 
{"status":"invalid_token"}
Error while executing topic command : {"status":"invalid_token"}
[2022-03-11 16:21:20,468] ERROR 
org.apache.kafka.common.errors.SaslAuthenticationException: 
{"status":"invalid_token"}
 (kafka.admin.TopicCommand$)
{noformat}
 - broker log:

{noformat}
[2022-03-11 16:21:20,150] WARN Could not validate the access token: JWT 
(claims->{"client_id":"...","iss":"...","iat":1647012079,"exp":1647015679,"aud":[...],"env":"...","org":"..."})
 rejected due to invalid claims or other invalid content. Additional details: 
[[14] No Subject (sub) claim is present.] 
(org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerValidatorCallbackHandler)
org.apache.kafka.common.security.oauthbearer.secured.ValidateException: Could 
not validate the access token: JWT 
(claims->{"client_id":"...","iss":"...","iat":1647012079,"exp":1647015679,"aud":[...],"env":"...","org":"..."})
 rejected due to invalid claims or other invalid content. Additional details: 
[[14] No Subject (sub) claim is present.]
        at 
org.apache.kafka.common.security.oauthbearer.secured.ValidatorAccessTokenValidator.validate(ValidatorAccessTokenValidator.java:159)
        at 
org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerValidatorCallbackHandler.handleValidatorCallback(OAuthBearerValidatorCallbackHandler.java:184)
        at 
org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerValidatorCallbackHandler.handle(OAuthBearerValidatorCallbackHandler.java:169)
        at 
org.apache.kafka.common.security.oauthbearer.internals.OAuthBearerSaslServer.process(OAuthBearerSaslServer.java:156)
        at 
org.apache.kafka.common.security.oauthbearer.internals.OAuthBearerSaslServer.evaluateResponse(OAuthBearerSaslServer.java:101)
        at 
org.apache.kafka.common.security.authenticator.SaslServerAuthenticator.handleSaslToken(SaslServerAuthenticator.java:451)
        at 
org.apache.kafka.common.security.authenticator.SaslServerAuthenticator.authenticate(SaslServerAuthenticator.java:280)
        at 
org.apache.kafka.common.network.KafkaChannel.prepare(KafkaChannel.java:181)
        at 
org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:543)
        at org.apache.kafka.common.network.Selector.poll(Selector.java:481)
        at kafka.network.Processor.poll(SocketServer.scala:989)
        at kafka.network.Processor.run(SocketServer.scala:892)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.jose4j.jwt.consumer.InvalidJwtException: JWT 
(claims->{"client_id":"...","iss":"...","iat":1647012079,"exp":1647015679,"aud":[...],"env":"...","org":"..."})
 rejected due to invalid claims or other invalid content. Additional details: 
[[14] No Subject (sub) claim is present.]
        at org.jose4j.jwt.consumer.JwtConsumer.validate(JwtConsumer.java:466)
        at 
org.jose4j.jwt.consumer.JwtConsumer.processContext(JwtConsumer.java:311)
        at org.jose4j.jwt.consumer.JwtConsumer.process(JwtConsumer.java:433)
        at 
org.apache.kafka.common.security.oauthbearer.secured.ValidatorAccessTokenValidator.validate(ValidatorAccessTokenValidator.java:157)
        ... 12 more
[2022-03-11 16:21:20,154] INFO [SocketServer listenerType=ZK_BROKER, nodeId=0] 
Failed authentication with /127.0.0.1 ({"status":"invalid_token"}) 
(org.apache.kafka.common.network.Selector)
{noformat}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to