15.4. OAuth 2.0 토큰 기반 인증 사용


Apache Kafka의 스트림은 OAUTHBEARERPLAIN 메커니즘을 사용한 OAuth 2.0 인증 사용을 지원합니다.

OAuth 2.0은 중앙 권한 부여 서버를 사용하여 리소스에 대한 제한된 액세스 권한을 부여하는 토큰을 발행하여 애플리케이션 간에 표준화된 토큰 기반 인증과 권한을 부여할 수 있습니다.

OAuth 2.0 인증을 구성한 다음 OAuth 2.0 인증을 구성할 수 있습니다.

Kafka 브로커 및 클라이언트는 모두 OAuth 2.0을 사용하도록 구성해야 합니다. OAuth 2.0 인증은 단순 또는 OPA 기반 Kafka 권한 과 함께 사용할 수도 있습니다.

OAuth 2.0 토큰 기반 인증을 사용하여 애플리케이션 클라이언트는 계정 자격 증명을 노출하지 않고 애플리케이션 서버( 리소스 서버라고 함)의 리소스에 액세스할 수 있습니다.

애플리케이션 클라이언트는 인증 수단으로 액세스 토큰을 전달합니다. 이 방법으로 부여할 액세스 수준을 결정하는 데 사용할 애플리케이션 서버가 사용할 수 있습니다. 권한 부여 서버는 액세스 권한 부여 및 액세스 관련 문의를 처리합니다.

Apache Kafka 스트림 컨텍스트에서 다음을 수행합니다.

  • Kafka 브로커는 OAuth 2.0 리소스 서버 역할을 합니다.
  • Kafka 클라이언트가 OAuth 2.0 애플리케이션 클라이언트 역할을 합니다.

Kafka 클라이언트는 Kafka 브로커에 인증합니다. 브로커 및 클라이언트는 필요에 따라 OAuth 2.0 권한 부여 서버와 통신하여 액세스 토큰을 얻거나 검증합니다.

Apache Kafka용 Streams 배포를 위해 OAuth 2.0 통합은 다음을 제공합니다.

  • Kafka 브로커에 대한 서버 측 OAuth 2.0 지원
  • Kafka MirrorMaker, Kafka Connect 및 Kafka Bridge에 대한 클라이언트 측 OAuth 2.0 지원

15.4.1. OAuth 2.0 인증 메커니즘

Apache Kafka의 스트림은 OAuth 2.0 인증을 위한 OAUTHBEARER 및 PLAIN 메커니즘을 지원합니다. 두 메커니즘을 통해 Kafka 클라이언트가 Kafka 브로커를 사용하여 인증된 세션을 설정할 수 있습니다. 클라이언트, 권한 부여 서버 및 Kafka 브로커 간의 인증 흐름은 각 메커니즘마다 다릅니다.

가능한 경우 OAUTHBEARER를 사용하도록 클라이언트를 구성하는 것이 좋습니다. OAUTHBEARER는 클라이언트 인증 정보가 Kafka 브로커와 공유 되지 않기 때문에 PLAIN보다 높은 수준의 보안을 제공합니다. OAUTHBEARER를 지원하지 않는 Kafka 클라이언트에서만 PLAIN을 사용하는 것이 좋습니다.

클라이언트 연결에 OAuth 2.0 인증을 사용하도록 Kafka 브로커 리스너를 구성합니다. 필요한 경우 동일한 oauth 리스너에서 OAUTHBEARER 및 PLAIN 메커니즘을 사용할 수 있습니다. 각 메커니즘을 지원하는 속성은 oauth 리스너 구성에 명시적으로 지정해야 합니다.

OAUTHBEARER 개요

OAUTHBEARER는 Kafka 브로커의 oauth 리스너 구성에서 자동으로 활성화됩니다. enableOauthBearer 속성을 true 로 설정할 수 있지만 필수는 아닙니다.

  # ...
  authentication:
    type: oauth
    # ...
    enableOauthBearer: true
Copy to Clipboard Toggle word wrap

많은 Kafka 클라이언트 툴은 프로토콜 수준에서 OAUTHBEARER에 대한 기본 지원을 제공하는 라이브러리를 사용합니다. 애플리케이션 개발을 지원하기 위해 Apache Kafka용 Streams는 업스트림 Kafka 클라이언트 Java 라이브러리에 대한 OAuth 콜백 처리기 를 제공합니다(다른 라이브러리는 아님). 따라서 자체 콜백 처리기를 작성할 필요가 없습니다. 애플리케이션 클라이언트는 콜백 처리기를 사용하여 액세스 토큰을 제공할 수 있습니다. Go와 같은 다른 언어로 작성된 클라이언트는 사용자 지정 코드를 사용하여 권한 부여 서버에 연결하고 액세스 토큰을 받아야 합니다.

클라이언트는 OAUTHBEARER를 사용하여 인증 정보 교환을 위해 Kafka 브로커로 세션을 시작합니다. 여기서 인증 정보는 콜백 처리기에서 제공하는 전달자 토큰의 형태를 취합니다. 콜백을 사용하면 다음 세 가지 방법 중 하나로 토큰 프로비저닝을 구성할 수 있습니다.

  • 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
  • 구성 시 수동으로 얻은 장기 액세스 토큰
  • 구성 시 수동으로 가져온 장기 새로 고침 토큰
참고

OAUTHBEARER 인증은 프로토콜 수준에서 OAUTHBEARER 메커니즘을 지원하는 Kafka 클라이언트에서만 사용할 수 있습니다.

PLAIN 개요

PLAIN을 사용하려면 Kafka 브로커의 oauth 리스너 구성에서 활성화해야 합니다.

다음 예제에서는 기본적으로 활성화되어 있는 OAUTHBEARER 외에도 PLAIN이 활성화됩니다. PLAIN만 사용하려면 enableOauthBearerfalse 로 설정하여 OAUTHBEARER를 비활성화할 수 있습니다.

  # ...
  authentication:
    type: oauth
    # ...
    enablePlain: true
    tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token
Copy to Clipboard Toggle word wrap

PLAIN은 모든 Kafka 클라이언트 툴에서 사용하는 간단한 인증 메커니즘입니다. OAuth 2.0 인증에 사용할 PLAIN을 활성화하려면 Apache Kafka의 Streams는 PLAIN 서버 측 콜백을 통해 OAuth 2.0 을 제공합니다.

PLAIN의 Streams for Apache Kafka 구현을 사용하면 클라이언트 인증 정보가 Zoo Cryostat에 저장되지 않습니다. 대신 OAUTHBEARER 인증이 사용되는 경우와 유사하게 클라이언트 자격 증명은 호환 권한 부여 서버 뒤에서 중앙에서 처리됩니다.

PLAIN 콜백을 통해 OAuth 2.0과 함께 사용하면 Kafka 클라이언트가 다음 방법 중 하나를 사용하여 Kafka 브로커로 인증합니다.

  • 클라이언트 ID 및 시크릿( OAuth 2.0 클라이언트 인증 정보 메커니즘 사용)
  • 구성 시 수동으로 얻은 장기 액세스 토큰

두 방법 모두 클라이언트는 Kafka 브로커에 인증 정보를 전달하기 위해 PLAIN 사용자 이름과 암호 속성을 제공해야 합니다. 클라이언트는 이러한 속성을 사용하여 클라이언트 ID와 시크릿 또는 사용자 이름 및 액세스 토큰을 전달합니다.

클라이언트 ID와 시크릿은 액세스 토큰을 가져오는 데 사용됩니다.

액세스 토큰은 암호 속성 값으로 전달됩니다. $accessToken: 접두사를 사용하거나 사용하지 않고 액세스 토큰을 전달합니다.

  • 리스너 구성에서 토큰 끝점(tokenEndpointUri)을 구성하는 경우 접두사가 필요합니다.
  • 리스너 구성에서 토큰 끝점(tokenEndpointUri)을 구성하지 않으면 접두사가 필요하지 않습니다. Kafka 브로커는 암호를 원시 액세스 토큰으로 해석합니다.

암호 가 액세스 토큰으로 설정된 경우 사용자 이름은 Kafka 브로커가 액세스 토큰에서 얻는 것과 동일한 주체 이름으로 설정해야 합니다. userNameClaim,fallbackUserNameClaim,fallbackUsernamePrefix, userInfoEndpointUri 속성을 사용하여 리스너에서 사용자 이름 추출 옵션을 지정할 수 있습니다. 사용자 이름 추출 프로세스는 권한 부여 서버(특히 클라이언트 ID를 계정 이름에 매핑하는 방법)에 따라 다릅니다.

참고

PLAIN을 통한 OAuth는 암호 부여 메커니즘을 지원하지 않습니다. 위에서 설명한 대로 클라이언트 인증 정보(client Id + secret) 또는 액세스 토큰을 통해 SASL PLAIN 메커니즘을 통해 'proxy'만 수행할 수 있습니다.

15.4.2. OAuth 2.0 Kafka 브로커 구성

OAuth 2.0에 대한 Kafka 브로커 구성은 다음과 같습니다.

  • 권한 부여 서버에서 OAuth 2.0 클라이언트 생성
  • Kafka 사용자 정의 리소스에서 OAuth 2.0 인증 구성
참고

권한 부여 서버와 관련하여 Kafka 브로커 및 Kafka 클라이언트는 모두 OAuth 2.0 클라이언트로 간주됩니다.

15.4.2.1. 권한 부여 서버의 OAuth 2.0 클라이언트 구성

세션 시작 중에 수신된 토큰을 확인하도록 Kafka 브로커를 구성하려면 다음 클라이언트 인증 정보가 활성화된 권한 부여 서버로 구성된 OAuth 2.0 클라이언트 정의를 생성하는 것이 좋습니다.

  • kafka 의 클라이언트 ID(예:)
  • 인증 메커니즘으로 클라이언트 ID 및 시크릿
참고

권한 부여 서버의 비공개 인트로스펙션 엔드포인트를 사용하는 경우에만 클라이언트 ID와 시크릿을 사용해야 합니다. 인증 정보는 빠른 로컬 JWT 토큰 검증과 마찬가지로 공용 권한 부여 서버 끝점을 사용할 때 필요하지 않습니다.

15.4.2.2. Kafka 클러스터의 OAuth 2.0 인증 구성

Kafka 클러스터에서 OAuth 2.0 인증을 사용하려면 인증 방법 oauth:을 사용하여 Kafka 클러스터 사용자 정의 리소스에 대한 tls 리스너 구성을 지정합니다.

OAuth 2.0의 인증 방법 유형 확인

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    # ...
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
      #...
Copy to Clipboard Toggle word wrap

리스너에서 OAuth 2.0 인증을 구성할 수 있습니다. TLS 암호화와 함께 OAuth 2.0 인증을 사용하는 것이 좋습니다(tls: true). 암호화 없이 연결은 토큰 도난을 통해 네트워크 도청 및 무단 액세스에 취약합니다.

보안 전송 계층이 클라이언트와 통신할 수 있도록 type: oauth 를 사용하여 외부 리스너를 구성합니다.

외부 리스너와 함께 OAuth 2.0 사용

# ...
listeners:
  - name: external3
    port: 9094
    type: loadbalancer
    tls: true
    authentication:
      type: oauth
    #...
Copy to Clipboard Toggle word wrap

tls 속성은 기본적으로 false 이므로 활성화해야 합니다.

인증 유형을 OAuth 2.0으로 정의한 경우 인트로스펙션 엔드포인트를 사용하여 빠른 로컬 JWT 검증 또는 토큰 검증으로 검증 유형에 따라 구성을 추가합니다.

설명 및 예제를 사용하여 리스너에 대해 OAuth 2.0 을 구성하는 절차는 Kafka 브로커에 대한 OAuth 2.0 지원 구성에 설명되어 있습니다.

15.4.2.3. 빠른 로컬 JWT 토큰 검증 구성

빠른 로컬 JWT 토큰 검증은 JWT 토큰 서명을 로컬로 확인합니다.

로컬 검사에서는 토큰이 있는지 확인합니다.

  • 액세스 토큰에 대한 Bearer 의 (typ) 클레임 값을 포함하여 유형 준수
  • 유효함 (종료되지 않음)
  • 유효한IssuerURI와 일치하는 발행자가 있음

리스너를 구성할 때 권한 부여 서버가 발행하지 않은 모든 토큰이 거부되도록 유효한IssuerURI 속성을 지정합니다.

빠른 로컬 JWT 토큰 검증 중에 권한 부여 서버에 연결할 필요가 없습니다. OAuth 2.0 권한 부여 서버에서 노출하는 끝점인 jwksEndpointUri 속성을 지정하여 빠른 로컬 JWT 토큰 검증을 활성화합니다. 엔드포인트에는 Kafka 클라이언트가 인증 정보로 전송되는 서명된 JWT 토큰의 유효성을 검사하는 데 사용되는 공개 키가 포함되어 있습니다.

참고

권한 부여 서버와의 모든 통신은 TLS 암호화를 사용하여 수행해야 합니다.

인증서 신뢰 저장소를 Apache Kafka 프로젝트 네임스페이스의 Streams에서 OpenShift Secret으로 구성하고 tlsTrustedCertificates 속성을 사용하여 truststore 파일이 포함된 OpenShift 보안을 가리킬 수 있습니다.

JWT 토큰에서 사용자 이름을 올바르게 추출하도록 userNameClaim 을 구성할 수 있습니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.

Kafka ACL 권한을 사용하려면 인증 중에 사용자 이름으로 사용자를 식별해야 합니다. ( JWT 토큰의 하위 클레임은 일반적으로 사용자 이름이 아닌 고유 ID입니다.)

빠른 로컬 JWT 토큰 검증을 위한 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    #...
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
          validIssuerUri: <https://<auth_server_address>/auth/realms/tls>
          jwksEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/certs>
          userNameClaim: preferred_username
          maxSecondsWithoutReauthentication: 3600
          tlsTrustedCertificates:
          - secretName: oauth-server-cert
            certificate: ca.crt
    #...
Copy to Clipboard Toggle word wrap

15.4.2.4. OAuth 2.0 인트로스펙션 엔드 포인트 구성

OAuth 2.0 인트로스펙션 엔드포인트를 사용하는 토큰 검증은 수신된 액세스 토큰을 불투명으로 처리합니다. Kafka 브로커는 검증에 필요한 토큰 정보로 응답하는 인트로스펙션 엔드포인트에 액세스 토큰 토큰을 보냅니다. 중요한 것은 특정 액세스 토큰이 유효한 경우 최신 정보와 토큰이 만료되는 시기에 대한 정보를 반환합니다.

OAuth 2.0 인트로스펙션 기반 검증을 구성하려면 빠른 로컬 JWT 토큰 검증에 지정된 jwksEndpointUri 속성 대신 introspectionEndpointUri 속성을 지정합니다. 인증 서버에 따라 인트로스펙션 엔드포인트가 일반적으로 보호되므로 clientIdclientSecret 을 지정해야 합니다.

인트로스펙션 엔드 포인트 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
  kafka:
    listeners:
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: oauth
          clientId: kafka-broker
          clientSecret:
            secretName: my-cluster-oauth
            key: clientSecret
          validIssuerUri: <https://<auth_server_-_address>/auth/realms/tls>
          introspectionEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/token/introspect>
          userNameClaim: preferred_username
          maxSecondsWithoutReauthentication: 3600
          tlsTrustedCertificates:
          - secretName: oauth-server-cert
            certificate: ca.crt
Copy to Clipboard Toggle word wrap

15.4.3. Kafka 브로커에 대한 세션 재인증

Kafka 클라이언트와 Kafka 브로커 간의 OAuth 2.0 세션에 Kafka 세션 재인증 을 사용하도록 oauth 리스너를 구성할 수 있습니다. 이 메커니즘은 정의된 기간 후에 클라이언트와 브로커 간에 인증된 세션 만료를 적용합니다. 세션이 만료되면 클라이언트는 기존 연결을 삭제하는 대신 다시 사용하여 새 세션을 즉시 시작합니다.

세션 재인증은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 oauth 리스너 구성에서 maxSecondsWithoutReauthentication 의 시간 값을 설정합니다. 동일한 속성은 OAUTHBEARER 및 PLAIN 인증에 대한 세션 재인증을 구성하는 데 사용됩니다. 구성 예제는 15.4.6.2절. “Kafka 브로커에 대한 OAuth 2.0 지원 구성” 을 참조하십시오.

세션 재인증은 클라이언트에서 사용하는 Kafka 클라이언트 라이브러리에서 지원해야 합니다.

세션 재인증은 빠른 로컬 JWT 또는 인트로스펙션 엔드포인트 토큰 검증과 함께 사용할 수 있습니다.

클라이언트 재인증

브로커의 인증된 세션이 만료되면 연결을 삭제하지 않고 새 유효한 액세스 토큰을 브로커에 전송하여 클라이언트가 기존 세션으로 다시 인증해야 합니다.

토큰 유효성 검사가 성공하면 기존 연결을 사용하여 새 클라이언트 세션이 시작됩니다. 클라이언트가 다시 인증되지 않으면 메시지를 보내거나 수신하려고 하면 브로커가 연결을 종료합니다. Kafka 클라이언트 라이브러리 2.2 이상을 사용하는 Java 클라이언트는 브로커에서 재인증 메커니즘이 활성화된 경우 자동으로 다시 인증됩니다.

세션 재인증은 사용되는 경우 토큰 새로 고침에도 적용됩니다. 세션이 만료되면 클라이언트는 새로 고침 토큰을 사용하여 액세스 토큰을 새로 고칩니다. 그런 다음 클라이언트는 새 액세스 토큰을 사용하여 기존 세션에 다시 인증합니다.

OAUTHBEARER 및 PLAIN의 세션 만료

세션 재인증이 구성되면 OAUTHBEARER 및 PLAIN 인증에 대해 세션 만료가 다르게 작동합니다.

OAUTHBEARER 및 PLAIN의 경우 클라이언트 ID 및 시크릿 방법을 사용합니다.

  • 브로커의 인증된 세션은 구성된 maxSecondsWithoutReauthentication 에서 만료됩니다.
  • 구성된 시간 전에 액세스 토큰이 만료되면 세션이 이전에 만료됩니다.

장기 액세스 토큰 방법을 사용하는 PLAIN의 경우:

  • 브로커의 인증된 세션은 구성된 maxSecondsWithoutReauthentication 에서 만료됩니다.
  • 구성된 시간 전에 액세스 토큰이 만료되면 재인증이 실패합니다. 세션 재인증이 시도되었지만 PLAIN에는 토큰을 새로 고치는 메커니즘이 없습니다.

maxSecondsWithoutReauthentication구성되지 않은 경우 OAUTHBEARER 및 PLAIN 클라이언트는 다시 인증할 필요 없이 브로커에 무기한 연결을 유지할 수 있습니다. 인증된 세션은 액세스 토큰 만료로 끝나지 않습니다. 그러나 예를 들어 keycloak 권한 부여를 사용하거나 사용자 정의 승인기를 설치하여 권한을 구성할 때 이를 고려할 수 있습니다.

15.4.4. OAuth 2.0 Kafka 클라이언트 구성

Kafka 클라이언트는 다음 중 하나로 구성됩니다.

  • 권한 부여 서버에서 유효한 액세스 토큰을 가져오는 데 필요한 인증 정보(클라이언트 ID 및 시크릿)
  • 권한 부여 서버에서 제공하는 툴을 사용하여 얻은 유효한 장기 액세스 토큰 또는 새로 고침 토큰

Kafka 브로커로 전송된 유일한 정보는 액세스 토큰입니다. 액세스 토큰을 얻기 위해 권한 부여 서버로 인증하는 데 사용되는 인증 정보는 브로커로 전송되지 않습니다.

클라이언트에서 액세스 토큰을 가져올 때 권한 부여 서버와의 추가 통신이 필요하지 않습니다.

가장 간단한 메커니즘은 클라이언트 ID 및 시크릿을 사용한 인증입니다. 장기 액세스 토큰 또는 수명이 긴 새로 고침 토큰을 사용하면 권한 부여 서버 도구에 대한 추가 종속성이 있기 때문에 복잡성이 향상됩니다.

참고

장기 액세스 토큰을 사용하는 경우 토큰의 최대 수명을 늘리려면 권한 부여 서버에서 클라이언트를 구성해야 할 수 있습니다.

Kafka 클라이언트가 액세스 토큰으로 직접 구성되지 않은 경우 클라이언트는 권한 부여 서버에 연결하여 Kafka 세션 시작 중에 액세스 토큰에 대한 인증 정보를 교환합니다. Kafka 클라이언트 교환:

  • 클라이언트 ID 및 시크릿
  • 클라이언트 ID, 새로 고침 토큰, 시크릿(선택 사항)
  • 사용자 이름과 암호, 클라이언트 ID 및 시크릿 사용(선택 사항)

15.4.5. OAuth 2.0 클라이언트 인증 흐름

OAuth 2.0 인증 흐름은 기본 Kafka 클라이언트 및 Kafka 브로커 구성에 따라 다릅니다. 이 흐름은 사용된 권한 부여 서버에서도 지원해야 합니다.

Kafka 브로커 리스너 구성은 클라이언트가 액세스 토큰을 사용하여 인증하는 방법을 결정합니다. 클라이언트는 클라이언트 ID와 시크릿을 전달하여 액세스 토큰을 요청할 수 있습니다.

리스너가 PLAIN 인증을 사용하도록 구성된 경우 클라이언트는 클라이언트 ID 및 시크릿 또는 사용자 이름 및 액세스 토큰으로 인증할 수 있습니다. 이러한 값은 PLAIN 메커니즘의 사용자 이름암호 속성으로 전달됩니다.

리스너 구성은 다음 토큰 검증 옵션을 지원합니다.

  • 권한 부여 서버에 연결하지 않고도 JWT 서명 확인 및 로컬 토큰 인트로스펙션에 따라 빠른 로컬 토큰 검증을 사용할 수 있습니다. 권한 부여 서버는 토큰의 서명의 유효성을 검사하는 데 사용되는 공용 인증서가 있는 JWKS 엔드포인트를 제공합니다.
  • 권한 부여 서버에서 제공하는 토큰 인트로스펙션 엔드포인트를 호출할 수 있습니다. 새 Kafka 브로커 연결이 설정될 때마다 브로커는 클라이언트에서 수신한 액세스 토큰을 권한 부여 서버로 전달합니다. Kafka 브로커는 토큰이 유효한지 여부를 확인하기 위해 응답을 확인합니다.
참고

권한 부여 서버는 불투명 액세스 토큰만 사용할 수 있으므로 로컬 토큰 유효성 검사는 사용할 수 없습니다.

다음과 같은 인증 유형에 대해 Kafka 클라이언트 인증 정보를 구성할 수도 있습니다.

  • 이전에 생성된 장기 액세스 토큰을 사용하여 로컬 액세스 직접
  • 새 액세스 토큰을 발행하기 위해 권한 부여 서버와 연락합니다(클라이언트 ID와 시크릿 또는 새로 고침 토큰 또는 사용자 이름과 암호 사용)

15.4.5.1. SASL OAUTHBEARER 메커니즘을 사용한 클라이언트 인증 흐름의 예

SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 인증에 다음 통신 흐름을 사용할 수 있습니다.

브로커에서 인증 서버에 검증을 위임하는 클라이언트 ID와 시크릿을 사용하는 클라이언트

Client using client ID and secret with broker delegating validation to authorization server

  1. Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 권한 부여 서버에서 액세스 토큰을 요청하고 선택적으로 새로 고침 토큰을 요청합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
  2. 권한 부여 서버에서 새 액세스 토큰을 생성합니다.
  3. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 액세스 토큰을 전달하여 Kafka 브로커로 인증합니다.
  4. Kafka 브로커는 자체 클라이언트 ID와 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 엔드포인트를 호출하여 액세스 토큰을 검증합니다.
  5. 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.

브로커가 빠른 로컬 토큰 검증을 수행하는 클라이언트 ID 및 시크릿을 사용하는 클라이언트

Client using client ID and secret with broker performing fast local token validation

  1. Kafka 클라이언트는 클라이언트 ID 및 시크릿을 사용하여 토큰 끝점의 권한 부여 서버와 필요한 경우 새로 고침 토큰을 사용하여 인증합니다. 또는 클라이언트는 사용자 이름과 암호를 사용하여 인증할 수 있습니다.
  2. 권한 부여 서버에서 새 액세스 토큰을 생성합니다.
  3. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 액세스 토큰을 전달하여 Kafka 브로커로 인증합니다.
  4. Kafka 브로커는 JWT 토큰 서명 검사 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬로 검증합니다.

브로커로 권한 부여 서버에 검증을 위임하는 장기 액세스 토큰을 사용하는 클라이언트

Client using long-lived access token with broker delegating validation to authorization server

  1. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 브로커로 인증하여 장기 액세스 토큰을 전달합니다.
  2. Kafka 브로커는 자체 클라이언트 ID와 시크릿을 사용하여 권한 부여 서버에서 토큰 인트로스펙션 엔드포인트를 호출하여 액세스 토큰을 검증합니다.
  3. 토큰이 유효한 경우 Kafka 클라이언트 세션이 설정됩니다.

브로커가 빠른 로컬 유효성 검사를 수행하는 장기 액세스 토큰을 사용하는 클라이언트

Client using long-lived access token with broker performing fast local validation

  1. Kafka 클라이언트는 SASL OAUTHBEARER 메커니즘을 사용하여 Kafka 브로커로 인증하여 장기 액세스 토큰을 전달합니다.
  2. Kafka 브로커는 JWT 토큰 서명 검사 및 로컬 토큰 인트로스펙션을 사용하여 액세스 토큰을 로컬로 검증합니다.
주의

빠른 로컬 JWT 토큰 서명 검증은 토큰이 취소된 경우 권한 부여 서버와 확인되지 않으므로 수명이 짧은 토큰에만 적합합니다. 토큰 만료는 토큰에 기록되지만 취소는 언제든지 발생할 수 있으므로 권한 부여 서버에 연결하지 않아도 됩니다. 발행된 토큰은 만료될 때까지 유효한 것으로 간주됩니다.

15.4.5.2. SASL PLAIN 메커니즘을 사용한 클라이언트 인증 흐름의 예

OAuth PLAIN 메커니즘을 사용하여 Kafka 인증에 다음 통신 흐름을 사용할 수 있습니다.

브로커가 클라이언트의 액세스 토큰을 가져오는 클라이언트 ID와 시크릿을 사용하는 클라이언트

Client using a client ID and secret with the broker obtaining the access token for the client

  1. Kafka 클라이언트는 사용자 이름으로 clientId 를 전달하고 시크릿 을 암호로 전달합니다.
  2. Kafka 브로커는 토큰 끝점을 사용하여 clientIdsecret 을 권한 부여 서버에 전달합니다.
  3. 인증 서버는 새로운 액세스 토큰을 반환하거나 클라이언트 자격 증명이 유효하지 않은 경우 오류를 반환합니다.
  4. Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.

    1. 토큰 인트로스펙션 엔드포인트가 지정된 경우 Kafka 브로커는 권한 부여 서버에서 엔드포인트를 호출하여 액세스 토큰을 검증합니다. 토큰 유효성 검사가 성공하면 세션이 설정됩니다.
    2. 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 이루어지지 않습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 액세스 토큰을 로컬로 검증합니다.

클라이언트 ID 및 시크릿 없이 장기 액세스 토큰을 사용하는 클라이언트

Client using a long-lived access token without a client ID and secret

  1. Kafka 클라이언트는 사용자 이름과 암호를 전달합니다. 암호는 수동으로 가져와 클라이언트를 실행하기 전에 구성한 액세스 토큰의 값을 제공합니다.
  2. 이 암호는 Kafka 브로커 리스너가 인증을 위해 토큰 끝점으로 구성되었는지 여부에 따라 $accessToken: 문자열 접두사와 함께 전달됩니다.

    1. 토큰 끝점이 구성된 경우 브로커에 password 매개변수에 클라이언트 시크릿이 아닌 액세스 토큰이 포함되어 있음을 알 수 있도록 암호 앞에 $accessToken: 가 붙여야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다.
    2. 토큰 끝점이 Kafka 브로커 리스너에 구성되지 않은 경우( no-client-credentials 모드사용) 암호는 접두사 없이 액세스 토큰을 제공해야 합니다. Kafka 브로커는 사용자 이름을 계정 사용자 이름으로 해석합니다. 이 모드에서 클라이언트는 클라이언트 ID와 시크릿을 사용하지 않으며 password 매개변수는 항상 원시 액세스 토큰으로 해석됩니다.
  3. Kafka 브로커는 다음 방법 중 하나로 토큰을 검증합니다.

    1. 토큰 인트로스펙션 엔드포인트가 지정된 경우 Kafka 브로커는 권한 부여 서버에서 엔드포인트를 호출하여 액세스 토큰을 검증합니다. 토큰 유효성 검사가 성공하면 세션이 설정됩니다.
    2. 로컬 토큰 인트로스펙션이 사용되는 경우 권한 부여 서버에 대한 요청이 없습니다. Kafka 브로커는 JWT 토큰 서명 검사를 사용하여 액세스 토큰을 로컬로 검증합니다.

15.4.6. OAuth 2.0 인증 구성

OAuth 2.0은 Kafka 클라이언트와 Apache Kafka 구성 요소의 스트림 간의 상호 작용에 사용됩니다.

Apache Kafka에 OAuth 2.0을 사용하려면 다음을 수행해야 합니다.

15.4.6.1. OAuth 2.0 인증 서버 구성

이 절차에서는 일반적으로 Apache Kafka용 Streams와 통합하기 위해 권한 부여 서버를 구성해야 하는 작업을 설명합니다.

이 지침은 제품에 한정되어 있지 않습니다.

단계는 선택한 권한 부여 서버에 따라 다릅니다. OAuth 2.0 액세스를 설정하는 방법에 대한 정보는 권한 부여 서버에 대한 제품 설명서를 참조하십시오.

참고

권한 부여 서버가 이미 배포된 경우 배포 단계를 건너뛰고 현재 배포를 사용할 수 있습니다.

프로세스

  1. 권한 부여 서버를 클러스터에 배포합니다.
  2. 권한 부여 서버의 CLI 또는 관리 콘솔에 액세스하여 Apache Kafka용 OAuth 2.0을 구성합니다.

    이제 Apache Kafka용 Streams에서 작동하도록 권한 부여 서버를 준비합니다.

  3. kafka-broker 클라이언트를 구성합니다.
  4. 애플리케이션의 각 Kafka 클라이언트 구성 요소에 대해 클라이언트를 구성합니다.

다음에 수행할 작업

권한 부여 서버를 배포하고 구성한 후 OAuth 2.0을 사용하도록 Kafka 브로커를 구성합니다.

15.4.6.2. Kafka 브로커에 대한 OAuth 2.0 지원 구성

다음 절차에서는 브로커 리스너가 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.

tls: true 가 있는 리스너를 통해 암호화된 인터페이스를 통해 OAuth 2.0을 사용하는 것이 좋습니다. 일반 리스너는 권장되지 않습니다.

인증 서버가 신뢰할 수 있는 CA에서 서명한 인증서를 사용하고 OAuth 2.0 서버 호스트 이름과 일치하는 경우 TLS 연결이 기본 설정을 사용하여 작동합니다. 그렇지 않으면 적절한 인증서를 사용하여 truststore를 구성하거나 인증서 호스트 이름 검증을 비활성화해야 할 수 있습니다.

Kafka 브로커를 구성할 때 새로 연결된 Kafka 클라이언트의 OAuth 2.0 인증 중에 액세스 토큰을 확인하는 데 사용되는 메커니즘에 대한 두 가지 옵션이 있습니다.

시작하기 전

Kafka 브로커 리스너에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 다음을 참조하십시오.

사전 요구 사항

  • Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
  • OAuth 2.0 인증 서버가 배포됨

프로세스

  1. 편집기에서 Kafka 리소스의 Kafka 브로커 구성(Kafka.spec.kafka)을 업데이트합니다.

    oc edit kafka my-cluster
    Copy to Clipboard Toggle word wrap
  2. Kafka 브로커 리스너 구성을 구성합니다.

    각 리스너 유형에 대한 구성은 독립적이므로 동일하지 않아야 합니다.

    다음 예제에서는 외부 리스너에 대해 구성된 구성 옵션을 보여줍니다.

    예 1: 빠른 로컬 JWT 토큰 검증 구성

    #...
    - name: external3
      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
    Copy to Clipboard Toggle word wrap

    1
    리스너 유형이 oauth 로 설정되었습니다.
    2
    인증에 사용되는 토큰 발행자의 URI입니다.
    3
    로컬 JWT 검증에 사용되는 JWKS 인증서 끝점의 URI입니다.
    4
    사용자를 식별하는 데 사용되는 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 해당 값은 권한 부여 서버에 따라 다릅니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
    5
    (선택 사항) 액세스 토큰과 동일한 기간에 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료될 때까지 남은 시간보다 작으면 클라이언트는 실제 토큰 만료 전에 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되고 클라이언트가 재인증을 시도하지 않으면 세션이 만료되지 않습니다.
    6
    (선택 사항) 권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.
    7
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    8
    JWKS 인증서가 만료되기 전에 유효한 인증서로 간주됩니다. 기본값은 360 초입니다. 더 긴 시간을 지정하면 취소된 인증서에 대한 액세스를 허용할 위험을 고려하십시오.
    9
    JWKS 인증서 새로 고침 간격입니다. 간격은 만료 간격보다 60초 이상 짧아야 합니다. 기본값은 300 초입니다.
    10
    JWKS 공개 키를 새로 고치는 시도 사이의 최소 일시 중지 시간(초)입니다. 알 수 없는 서명 키가 발생하면 JWKS 키 새로 고침이 마지막 새로 고침 시도 이후 지정된 일시 중지를 사용하여 정기적인 스케줄 외부에 예약됩니다. 키를 새로 고치는 것은 지수 백오프 규칙을 따르며 jwksRefreshSeconds 에 도달할 때까지 일시 중지를 늘리면 실패한 새로 고침을 다시 시도합니다. 기본값은 1입니다.

    예 2: 인트로스펙션 끝점을 사용하여 토큰 검증 구성

    - name: external3
      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
    Copy to Clipboard Toggle word wrap

    1
    토큰 인트로스펙션 엔드포인트의 URI입니다.
    2
    클라이언트를 식별하는 클라이언트 ID입니다.
    3
    클라이언트 시크릿 및 클라이언트 ID는 인증에 사용됩니다.
    4
    사용자를 식별하는 데 사용되는 실제 사용자 이름을 포함하는 토큰 클레임(또는 키)입니다. 해당 값은 권한 부여 서버에 따라 다릅니다. 필요한 경우 "['user.info'].['user.id']" 와 같은 JsonPath 표현식을 사용하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
    5
    (선택 사항) 액세스 토큰과 동일한 기간에 세션 만료를 적용하는 Kafka 재인증 메커니즘을 활성화합니다. 지정된 값이 액세스 토큰이 만료될 때까지 남은 시간보다 작으면 클라이언트는 실제 토큰 만료 전에 다시 인증해야 합니다. 기본적으로 액세스 토큰이 만료되고 클라이언트가 재인증을 시도하지 않으면 세션이 만료되지 않습니다.

    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://<auth_server_address>/auth/realms/external/protocol/openid-connect/userinfo 
    6
    
        enableOauthBearer: false 
    7
    
        enablePlain: true 
    8
    
        tokenEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token 
    9
    
        customClaimCheck: "@.custom == 'custom-value'" 
    10
    
        clientAudience: audience 
    11
    
        clientScope: scope 
    12
    
        connectTimeoutSeconds: 60 
    13
    
        readTimeoutSeconds: 60 
    14
    
        httpRetries: 2 
    15
    
        httpRetryPauseMs: 300 
    16
    
        groupsClaim: "$.groups" 
    17
    
        groupsClaimDelimiter: "," 
    18
    
        includeAcceptHeader: false 
    19
    Copy to Clipboard Toggle word wrap
    1
    권한 부여 서버에서 iss 클레임을 제공하지 않으면 발급자 검사를 수행할 수 없습니다. 이 경우 checkIssuerfalse 로 설정하고 유효한IssuerUri 를 지정하지 마십시오. 기본값은 true 입니다.
    2
    권한 부여 서버가 aud (audience) 클레임을 제공하고 대상 검사를 적용하려는 경우 checkAudiencetrue 로 설정합니다. 대상 검사에서는 의도된 토큰 수신자를 식별합니다. 결과적으로 Kafka 브로커는 aud 클레임에 clientId 가 없는 토큰을 거부합니다. 기본값은 false 입니다.
    3
    권한 부여 서버는 일반 사용자와 클라이언트를 모두 식별하는 단일 속성을 제공하지 않을 수 있습니다. 클라이언트가 자체 이름으로 인증하면 서버에서 클라이언트 ID 를 제공할 수 있습니다. 사용자가 사용자 이름과 암호를 사용하여 새로 고침 토큰 또는 액세스 토큰을 가져오는 경우 서버는 클라이언트 ID 외에도 사용자 이름 속성을 제공할 수 있습니다. 기본 사용자 ID 속성을 사용할 수 없는 경우 사용할 사용자 이름 클레임(attribute)을 지정하려면 이 대체 옵션을 사용합니다. 필요한 경우 "['client.info'].['client.id']" 와 같은 JsonPath 표현식을 사용하여 대체 사용자 이름을 검색하여 토큰 내의 중첩된 JSON 속성에서 사용자 이름을 검색할 수 있습니다.
    4
    fallbackUserNameClaim 이 적용 가능한 경우 사용자 이름 클레임의 값과 대체 사용자 이름 클레임의 이름 충돌을 방지할 수도 있습니다. producer 라는 클라이언트가 존재하지만 producer 라는 일반 사용자도 존재하는 상황을 고려하십시오. 이 속성을 사용하여 클라이언트의 사용자 ID에 접두사를 추가할 수 있습니다.
    5
    ( introspectionEndpointUri) 사용 중인 권한 부여 서버에 따라 인트로스펙션 엔드 포인트가 토큰 유형 속성을 반환하거나 반환하지 않거나 다른 값을 포함할 수 있습니다. 인트로스펙션 끝점의 응답에 포함되어야 하는 유효한 토큰 유형 값을 지정할 수 있습니다.
    6
    (추천 EndpointUri) 인증 서버가 Introspection Endpoint 응답에서 식별 가능한 정보를 제공하지 않도록 인증 서버를 구성하거나 구현할 수 있습니다. 사용자 ID를 얻으려면 userinfo 끝점의 URI를 폴백으로 구성할 수 있습니다. userNameClaim,fallbackUserNameClaimfallbackUserNamePrefix 설정은 userinfo 끝점 응답에 적용됩니다.
    7
    리스너에서 OAUTHBEARER 메커니즘을 비활성화하려면 이를 false 로 설정합니다. PLAIN 또는 OAUTHBEARER 중 하나 이상을 활성화해야 합니다. 기본값은 true 입니다.
    8
    모든 플랫폼에서 클라이언트에 지원되는 리스너에서 PLAIN 인증을 활성화하려면 true 로 설정합니다.
    9
    PLAIN 메커니즘에 대한 추가 구성입니다. 지정된 경우 클라이언트는 $accessToken: 접두사를 사용하여 암호로 액세스 토큰을 전달하여 PLAIN을 통해 인증할 수 있습니다. 프로덕션의 경우 항상 https:// urls를 사용합니다.
    10
    이를 JsonPath 필터 쿼리로 설정하여 검증 중에 JWT 액세스 토큰에 추가 사용자 지정 규칙을 적용할 수 있습니다. 액세스 토큰에 필요한 데이터가 포함되어 있지 않으면 거부됩니다. introspectionEndpointUri 를 사용하는 경우 사용자 정의 검사가 인트로스펙션 엔드포인트 응답 JSON에 적용됩니다.
    11
    토큰 끝점에 전달된 audience 매개변수입니다. 대상 은broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다. clientIdsecret 을 사용하는 PLAIN 클라이언트 인증의 OAuth 2.0용 클라이언트 이름에도 사용됩니다. 이는 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠에만 영향을 미칩니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다.
    12
    토큰 끝점에 전달된 scope 매개변수입니다. 범위는 broker 간 인증을 위한 액세스 토큰을 가져올 때 사용됩니다. clientIdsecret 을 사용하는 PLAIN 클라이언트 인증의 OAuth 2.0용 클라이언트 이름에도 사용됩니다. 이는 권한 부여 서버에 따라 토큰과 토큰의 콘텐츠에만 영향을 미칩니다. 리스너의 토큰 검증 규칙에는 영향을 미치지 않습니다.
    13
    권한 부여 서버에 연결할 때 연결 시간(초)입니다. 기본값은 60입니다.
    14
    권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    15
    권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    16
    권한 부여 서버에 실패한 HTTP 요청을 다시 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 있으므로 일시 중지가 적용되지 않습니다. 이는 실패한 요청을 유발하는 많은 문제가 요청당 네트워크 결함 또는 프록시 문제로 인해 신속하게 해결할 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하가 발생하거나 트래픽이 많은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 성공적인 재시도 가능성을 높일 수 있습니다.
    17
    JWT 토큰 또는 인트로스펙션 엔드포인트 응답에서 그룹 정보를 추출하는 데 사용되는 JsonPath 쿼리입니다. 이 옵션은 기본적으로 설정되어 있지 않습니다. 이 옵션을 구성하면 사용자 정의 작성자가 사용자 그룹을 기반으로 권한 부여 결정을 내릴 수 있습니다.
    18
    그룹으로 구분된 단일 문자열로 반환될 때 그룹 정보를 구문 분석하는 데 사용되는 구분 기호입니다. 기본값은 ',' (comma)입니다.
    19
    일부 인증 서버는 Accept: application/json 헤더를 보내는 클라이언트에 문제가 있습니다. includeAcceptHeader: false 를 설정하면 헤더가 전송되지 않습니다. 기본값은 true 입니다.
  3. 편집기를 저장하고 종료한 다음 롤링 업데이트가 완료될 때까지 기다립니다.
  4. 로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w
    Copy to Clipboard Toggle word wrap

    롤링 업데이트는 브로커가 OAuth 2.0 인증을 사용하도록 구성합니다.

15.4.6.3. OAuth 2.0을 사용하도록 Kafka Java 클라이언트 구성

Kafka 브로커와의 상호 작용에 OAuth 2.0을 사용하도록 Kafka 생산자 및 소비자 API를 구성합니다. 클라이언트 pom.xml 파일에 콜백 플러그인을 추가한 다음 OAuth 2.0에 대해 클라이언트를 구성합니다.

클라이언트 구성에 다음을 지정합니다.

  • SASL(Simple Authentication and Security Layer) 보안 프로토콜:

    • TLS 암호화 연결을 통한 인증을 위한 SASL_SSL
    • 암호화되지 않은 연결을 통한 인증을 위한 SASL_PLAINTEXT

      프로덕션에는 SASL_SSL 을 사용하고 로컬 개발에는 SASL_PLAINTEXT 를 사용하십시오. SASL_SSL 을 사용하는 경우 추가 ssl.truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버에 대한 보안 연결(https://)을 위해서는 truststore 구성이 필요합니다. OAuth 2.0 권한 부여 서버를 확인하려면 인증 서버의 CA 인증서를 클라이언트 구성의 신뢰 저장소에 추가합니다. PEM 또는 PKCS #12 형식으로 신뢰 저장소를 구성할 수 있습니다.

  • Kafka SASL 메커니즘:

    • 전달자 토큰을 사용하여 인증 정보 교환을 위한 OAUTHBEARER
    • 클라이언트 인증 정보(clientId + 시크릿) 또는 액세스 토큰을 전달하는 PLAIN
  • SASL 메커니즘을 구현하는 JAAS(Java Authentication and Authorization Service) 모듈:

    • org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule 은 OAuthbearer 메커니즘을 구현합니다.
    • org.apache.kafka.common.security.plain.PlainLoginModule 은 일반 메커니즘을 구현합니다.

    OAuthbearer 메커니즘을 사용할 수 있으려면 사용자 정의 io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler 클래스를 콜백 처리기로 추가해야 합니다. JaasClientOauthLoginCallbackHandler 는 클라이언트 로그인 중에 토큰을 액세스하기 위해 권한 부여 서버로의 OAuth 콜백을 처리합니다. 이를 통해 자동 토큰 갱신을 통해 사용자 개입 없이 지속적인 인증을 보장할 수 있습니다. 또한 OAuth 2.0 암호 부여 방법을 사용하여 클라이언트의 로그인 인증 정보를 처리합니다.

  • SASL 인증 속성은 다음 인증 방법을 지원합니다.

    • OAuth 2.0 클라이언트 인증 정보
    • OAuth 2.0 암호 부여(더 이상 사용되지 않음)
    • 액세스 토큰
    • 토큰 새로 고침

    SASL 인증 속성을 JAAS 구성(sasl.jaas.configsasl.login.callback.handler.class)으로 추가합니다. 인증 속성을 구성하는 방법은 OAuth 2.0 권한 부여 서버에 액세스하기 위해 사용 중인 인증 방법에 따라 다릅니다. 이 절차에서 속성은 속성 파일에 지정 된 다음 클라이언트 구성에 로드됩니다.In this procedure, the properties are specified in a properties file, then loaded into the client configuration.

참고

인증 속성을 환경 변수로 지정하거나 Java 시스템 속성으로 지정할 수도 있습니다. Java 시스템 속성의 경우 setProperty 를 사용하여 설정하고 -D 옵션을 사용하여 명령줄에서 전달할 수 있습니다.

사전 요구 사항

  • Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
  • OAuth 2.0 권한 부여 서버가 Kafka 브로커에 대한 OAuth 액세스용으로 배포 및 구성됨
  • Kafka 브로커는 OAuth 2.0으로 구성되어 있습니다.

프로세스

  1. OAuth 2.0 지원이 포함된 클라이언트 라이브러리를 Kafka 클라이언트의 pom.xml 파일에 추가합니다.

    <dependency>
     <groupId>io.strimzi</groupId>
     <artifactId>kafka-oauth-client</artifactId>
     <version>0.15.0.redhat-00007</version>
    </dependency>
    Copy to Clipboard Toggle word wrap
  2. 속성 파일에 다음 구성을 지정하여 클라이언트 속성을 구성합니다.

    • 보안 프로토콜
    • SASL 메커니즘
    • 사용 방법에 따른 JAAS 모듈 및 인증 속성

      예를 들어 client.properties 파일에 다음을 추가할 수 있습니다.

      클라이언트 인증 메커니즘 속성

      security.protocol=SASL_SSL 
      1
      
      sasl.mechanism=OAUTHBEARER 
      2
      
      ssl.truststore.location=/tmp/truststore.p12 
      3
      
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \ 
      4
      
        oauth.client.id="<client_id>" \ 
      5
      
        oauth.client.secret="<client_secret>" \ 
      6
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ 
      7
      
        oauth.ssl.truststore.password="$STOREPASS" \ 
      8
      
        oauth.ssl.truststore.type="PKCS12" \ 
      9
      
        oauth.scope="<scope>" \ 
      10
      
        oauth.audience="<audience>" ; 
      11
      
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
      Copy to Clipboard Toggle word wrap

      1
      TLS 암호화 연결을 위한 SASL_SSL 보안 프로토콜. 로컬 개발을 위해 암호화되지 않은 연결보다 SASL_PLAINTEXT 를 사용하십시오.
      2
      OAUTHBEARER 또는 PLAIN 으로 지정된 SASL 메커니즘 .
      3
      Kafka 클러스터에 대한 보안 액세스를 위한 신뢰 저장소 구성입니다.
      4
      권한 부여 서버 토큰 끝점의 URI입니다.
      5
      권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
      6
      권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      7
      위치에는 권한 부여 서버의 공개 키 인증서(truststore.p12)가 포함되어 있습니다.
      8
      truststore에 액세스하기 위한 암호입니다.
      9
      truststore 유형입니다.
      10
      (선택 사항) 토큰 끝점에서 토큰을 요청하는 범위 입니다. 권한 부여 서버에는 클라이언트가 범위를 지정해야 할 수 있습니다.
      11
      (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다. 권한 부여 서버에는 클라이언트가 대상을 지정해야 할 수 있습니다.

      암호는 메커니즘 속성 부여

      security.protocol=SASL_SSL
      sasl.mechanism=OAUTHBEARER
      ssl.truststore.location=/tmp/truststore.p12
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \
        oauth.client.id="<client_id>" \ 
      1
      
        oauth.client.secret="<client_secret>" \ 
      2
      
        oauth.password.grant.username="<username>" \ 
      3
      
        oauth.password.grant.password="<password>" \ 
      4
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
        oauth.ssl.truststore.password="$STOREPASS" \
        oauth.ssl.truststore.type="PKCS12" \
        oauth.scope="<scope>" \
        oauth.audience="<audience>" ;
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
      Copy to Clipboard Toggle word wrap

      1
      권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
      2
      (선택 사항) 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      3
      암호 부여 인증의 사용자 이름입니다. OAuth 암호 부여 구성(사용자 이름 및 암호)은 OAuth 2.0 암호 부여 방법을 사용합니다. 암호 부여를 사용하려면 제한된 권한이 있는 권한 부여 서버에서 클라이언트에 대한 사용자 계정을 만듭니다. 계정은 서비스 계정처럼 작동해야 합니다. 인증에 사용자 계정이 필요하지만 새로 고침 토큰을 사용하는 것이 좋습니다.
      4
      암호 부여 인증입니다.
      참고

      SASL PLAIN은 OAuth 2.0 암호 부여 방법을 사용하여 사용자 이름과 암호(암호 부여)를 전달하는 것을 지원하지 않습니다.

      토큰 속성에 액세스

      security.protocol=SASL_SSL
      sasl.mechanism=OAUTHBEARER
      ssl.truststore.location=/tmp/truststore.p12
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \
        oauth.access.token="<access_token>" \ 
      1
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
        oauth.ssl.truststore.password="$STOREPASS" \
        oauth.ssl.truststore.type="PKCS12" ;
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
      Copy to Clipboard Toggle word wrap

      1
      Kafka 클라이언트용 장기 액세스 토큰입니다.

      토큰 속성 새로 고침

      security.protocol=SASL_SSL
      sasl.mechanism=OAUTHBEARER
      ssl.truststore.location=/tmp/truststore.p12
      ssl.truststore.password=$STOREPASS
      ssl.truststore.type=PKCS12
      sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
        oauth.token.endpoint.uri="<token_endpoint_url>" \
        oauth.client.id="<client_id>" \ 
      1
      
        oauth.client.secret="<client_secret>" \ 
      2
      
        oauth.refresh.token="<refresh_token>" \ 
      3
      
        oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
        oauth.ssl.truststore.password="$STOREPASS" \
        oauth.ssl.truststore.type="PKCS12" ;
      sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
      Copy to Clipboard Toggle word wrap

      1
      권한 부여 서버에서 클라이언트를 생성할 때 사용되는 이름인 클라이언트 ID입니다.
      2
      (선택 사항) 권한 부여 서버에서 클라이언트를 생성할 때 생성된 클라이언트 시크릿입니다.
      3
      Kafka 클라이언트의 장기 새로 고침 토큰입니다.
  3. OAUTH 2.0 인증의 클라이언트 속성을 Java 클라이언트 코드에 입력합니다.

    클라이언트 속성의 입력 표시 예

    Properties props = new Properties();
    try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) {
      props.load(reader);
    }
    Copy to Clipboard Toggle word wrap

  4. Kafka 클라이언트가 Kafka 브로커에 액세스할 수 있는지 확인합니다.

15.4.6.4. Kafka 구성 요소에 대한 OAuth 2.0 구성

다음 절차에서는 권한 부여 서버를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 구성 요소를 구성하는 방법을 설명합니다.

다음에 대한 인증을 구성할 수 있습니다.

  • Kafka Connect
  • Kafka MirrorMaker
  • Kafka Bridge

이 시나리오에서는 Kafka 구성 요소와 권한 부여 서버가 동일한 클러스터에서 실행되고 있습니다.

시작하기 전

Kafka 구성 요소에 대한 OAuth 2.0 인증 구성에 대한 자세한 내용은 KafkaClientAuthenticationOAuth 스키마 참조를 참조하십시오. 스키마 참조에는 구성 옵션의 예가 포함되어 있습니다.

사전 요구 사항

  • Apache Kafka 및 Kafka의 스트림이 실행 중입니다.
  • OAuth 2.0 권한 부여 서버가 Kafka 브로커에 대한 OAuth 액세스용으로 배포 및 구성됨
  • Kafka 브로커는 OAuth 2.0으로 구성되어 있습니다.

프로세스

  1. 클라이언트 시크릿을 생성하고 구성 요소에 환경 변수로 마운트합니다.

    예를 들어, 여기에서 Kafka 브리지의 클라이언트 시크릿 을 생성하고 있습니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Secret
    metadata:
     name: my-bridge-oauth
    type: Opaque
    data:
     clientSecret: MGQ1OTRmMzYtZTllZS00MDY2LWI5OGEtMTM5MzM2NjdlZjQw 
    1
    Copy to Clipboard Toggle word wrap
    1
    clientSecret 키는 base64 형식이어야 합니다.
  2. 인증 속성에 대해 OAuth 2.0 인증이 구성되도록 Kafka 구성 요소의 리소스를 생성하거나 편집합니다.

    OAuth 2.0 인증의 경우 다음 옵션을 사용할 수 있습니다.

    • 클라이언트 ID 및 시크릿
    • 클라이언트 ID 및 새로 고침 토큰
    • 액세스 토큰
    • 사용자 이름 및 암호
    • TLS

    예를 들어 여기에서 OAuth 2.0은 클라이언트 ID와 시크릿 및 TLS를 사용하여 Kafka 브리지 클라이언트에 할당됩니다.

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      # ...
      authentication:
        type: oauth 
    1
    
        tokenEndpointUri: https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token 
    2
    
        clientId: kafka-bridge
        clientSecret:
          secretName: my-bridge-oauth
          key: clientSecret
        tlsTrustedCertificates: 
    3
    
        - secretName: oauth-server-cert
          certificate: tls.crt
    Copy to Clipboard Toggle word wrap
    1
    oauth 로 설정된 인증 유형입니다.
    2
    인증을 위한 토큰 끝점의 URI입니다.
    3
    권한 부여 서버에 대한 TLS 연결에 대한 신뢰할 수 있는 인증서입니다.

    OAuth 2.0 인증 적용 방법과 권한 부여 서버 유형에 따라 다음을 사용할 수 있는 추가 구성 옵션이 있습니다.

    # ...
    spec:
      # ...
      authentication:
        # ...
        disableTlsHostnameVerification: true 
    1
    
        checkAccessTokenType: false 
    2
    
        accessTokenIsJwt: false 
    3
    
        scope: any 
    4
    
        audience: kafka 
    5
    
        connectTimeoutSeconds: 60 
    6
    
        readTimeoutSeconds: 60 
    7
    
        httpRetries: 2 
    8
    
        httpRetryPauseMs: 300 
    9
    
        includeAcceptHeader: false 
    10
    Copy to Clipboard Toggle word wrap
    1
    (선택 사항) TLS 호스트 이름 확인을 비활성화합니다. 기본값은 false 입니다.
    2
    권한 부여 서버가 JWT 토큰 내에 typ (type) 클레임을 반환하지 않으면 checkAccessTokenType: false 를 적용하여 토큰 유형 검사를 건너뛸 수 있습니다. 기본값은 true 입니다.
    3
    불투명 토큰을 사용하는 경우 액세스 토큰이 JWT 토큰으로 처리되지 않도록 accessTokenIsJwt: false 를 적용할 수 있습니다.
    4
    (선택 사항) 토큰 끝점에서 토큰을 요청하는 범위 입니다. 권한 부여 서버에는 클라이언트가 범위를 지정해야 할 수 있습니다. 이 경우 모든.
    5
    (선택 사항) 토큰 끝점에서 토큰을 요청하는 대상입니다. 권한 부여 서버에는 클라이언트가 대상을 지정해야 할 수 있습니다. 이 경우 kafka 입니다.
    6
    (선택 사항) 권한 부여 서버에 연결할 때 연결 시간 초과(초)입니다. 기본값은 60입니다.
    7
    (선택 사항) 권한 부여 서버에 연결할 때 읽기 제한 시간(초)입니다. 기본값은 60입니다.
    8
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 재시도하는 최대 횟수입니다. 기본값은 0 입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면 connectTimeoutSecondsreadTimeoutSeconds 옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
    9
    (선택 사항) 권한 부여 서버에 실패한 HTTP 요청을 다시 시도하기 전에 대기하는 시간입니다. 기본적으로 이 시간은 0으로 설정되어 있으므로 일시 중지가 적용되지 않습니다. 이는 실패한 요청을 유발하는 많은 문제가 요청당 네트워크 결함 또는 프록시 문제로 인해 신속하게 해결할 수 있기 때문입니다. 그러나 권한 부여 서버가 과부하가 발생하거나 트래픽이 많은 경우 이 옵션을 100ms 이상으로 설정하여 서버의 부하를 줄이고 성공적인 재시도 가능성을 높일 수 있습니다.
    10
    (선택 사항) 일부 인증 서버는 Accept: application/json 헤더를 보내는 클라이언트에 문제가 있습니다. includeAcceptHeader: false 를 설정하면 헤더가 전송되지 않습니다. 기본값은 true 입니다.
  3. Kafka 리소스의 배포에 변경 사항을 적용합니다.

    oc apply -f your-file
    Copy to Clipboard Toggle word wrap
  4. 로그에서 업데이트를 확인하거나 Pod 상태 전환을 확인하여 업데이트를 확인합니다.

    oc logs -f ${POD_NAME} -c ${CONTAINER_NAME}
    oc get pod -w
    Copy to Clipboard Toggle word wrap

    롤링 업데이트는 OAuth 2.0 인증을 사용하여 Kafka 브로커와 상호 작용하기 위한 구성 요소를 구성합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat