6.6. OAuth 2.0 토큰 기반 권한 부여 사용
Apache Kafka의 스트림은 Red Hat Single Sign-On 인증 서비스를 통해 OAuth 2.0 토큰 기반 권한 사용을 지원하므로 보안 정책과 권한을 중앙에서 관리할 수 있습니다.
Red Hat Single Sign-On에 정의된 보안 정책 및 권한은 Kafka 브로커의 리소스에 대한 액세스 권한을 부여하는 데 사용됩니다. 사용자와 클라이언트는 Kafka 브로커에서 특정 작업을 수행하기 위해 액세스를 허용하는 정책과 일치합니다.
Kafka는 기본적으로 모든 사용자에게 브로커에 대한 전체 액세스를 허용하며 AclAuthorizer
및 StandardAuthorizer
플러그인도 제공하여 ACL(Access Control Lists)을 기반으로 권한 부여를 구성합니다. 이러한 플러그인에서 관리하는 ACL 규칙은 사용자 이름을 기반으로 리소스에 대한 액세스 권한을 부여하거나 거부하는 데 사용되며 이러한 규칙은 Kafka 클러스터 자체에 저장됩니다. 그러나 Red Hat Single Sign-On을 사용한 OAuth 2.0 토큰 기반 권한 부여는 Kafka 브로커에 대한 액세스 제어를 구현하는 방법에 대한 유연성을 훨씬 높여 줍니다. 또한 OAuth 2.0 권한 부여 및 ACL을 사용하도록 Kafka 브로커를 구성할 수 있습니다.
6.6.1. OAuth 2.0 인증 메커니즘
Apache Kafka용 스트림의 OAuth 2.0 인증에서는 Red Hat Single Sign-On 서버 권한 부여 REST 끝점을 사용하여 특정 사용자에게 정의된 보안 정책을 적용하고 해당 사용자의 다른 리소스에 부여된 권한 목록을 제공하여 Red Hat Single Sign-On을 사용하여 토큰 기반 인증을 확장합니다. 정책은 역할과 그룹을 사용하여 사용자와 권한을 일치시킵니다. OAuth 2.0 권한 부여는 Red Hat Single Sign-On 인증 서비스에서 사용자에 대한 수신된 권한 목록을 기반으로 권한을 로컬로 적용합니다.
6.6.1.1. Kafka 브로커 사용자 정의 승인
Red Hat Single Sign-On 승인자 (KeycloakAuthorizer
)는 Apache Kafka용 Streams와 함께 제공됩니다. Red Hat Single Sign-On에서 제공하는 권한 부여 서비스에 Red Hat Single Sign-On REST 엔드포인트를 사용하려면 Kafka 브로커에서 사용자 지정 승인자를 구성합니다.
인증자는 필요에 따라 권한 부여 서버에서 부여된 권한 목록을 가져와서 Kafka 브로커에 로컬로 권한 부여를 적용하여 각 클라이언트 요청에 대해 신속하게 권한 부여 결정을 내립니다.
6.6.2. OAuth 2.0 권한 부여 지원 구성
다음 절차에서는 Red Hat Single Sign-On 인증 서비스를 사용하여 OAuth 2.0 인증을 사용하도록 Kafka 브로커를 구성하는 방법을 설명합니다.
사전 준비 사항
필요한 액세스 또는 특정 사용자에 대해 제한하려는 경우를 고려하십시오. Red Hat Single Sign-On 그룹,역할,클라이언트 및 사용자를 결합하여 Red Hat Single Sign-On에서 액세스를 구성할 수 있습니다.
일반적으로 그룹은 조직 부서 또는 지리적 위치를 기반으로 사용자와 일치시키는 데 사용됩니다. 및 역할은 해당 기능을 기반으로 사용자와 일치시키는 데 사용됩니다.
Red Hat Single Sign-On을 사용하면 사용자와 그룹을 LDAP에 저장할 수 있지만 클라이언트와 역할은 이러한 방식으로 저장할 수 없습니다. 사용자 데이터에 대한 스토리지 및 액세스는 권한 부여 정책 구성 방법의 요소가 될 수 있습니다.
Super 사용자는 Kafka 브로커에서 구현된 권한 부여에 관계없이 항상 Kafka 브로커에 대한 무제한 액세스 권한을 갖습니다.
사전 요구 사항
프로세스
- Red Hat Single Sign-On 관리 콘솔에 액세스하거나 Red Hat Single Sign-On 관리 CLI를 사용하여 OAuth 2.0 인증을 설정할 때 생성한 Kafka 브로커 클라이언트에 대한 인증 서비스를 활성화합니다.
- 인증 서비스를 사용하여 클라이언트에 대한 리소스, 권한 부여 범위, 정책 및 권한을 정의합니다.
- 역할 및 그룹을 할당하여 사용자 및 클라이언트에 권한을 바인딩합니다.
Red Hat Single Sign-On 권한을 사용하도록 Kafka 브로커를 구성합니다.
Kafka
server.properties
구성 파일에 다음을 추가하여 Kafka에 인증자를 설치합니다.authorizer.class.name=io.strimzi.kafka.oauth.server.authorizer.KeycloakAuthorizer principal.builder.class=io.strimzi.kafka.oauth.server.OAuthKafkaPrincipalBuilder
authorizer.class.name=io.strimzi.kafka.oauth.server.authorizer.KeycloakAuthorizer principal.builder.class=io.strimzi.kafka.oauth.server.OAuthKafkaPrincipalBuilder
Copy to Clipboard Copied! Kafka 브로커에 대한 구성을 추가하여 권한 부여 서버 및 권한 부여 서비스에 액세스합니다.
여기서는
server.properties
에 추가 속성을 추가하지만 대문자 또는 대문자 이름 지정 규칙을 사용하여 환경 변수로 정의할 수도 있습니다.strimzi.authorization.token.endpoint.uri="https://<auth_server_address>/auth/realms/REALM-NAME/protocol/openid-connect/token" strimzi.authorization.client.id="kafka"
strimzi.authorization.token.endpoint.uri="https://<auth_server_address>/auth/realms/REALM-NAME/protocol/openid-connect/token"
1 strimzi.authorization.client.id="kafka"
2 Copy to Clipboard Copied! (선택 사항) 특정 Kafka 클러스터에 대한 구성을 추가합니다.
예를 들면 다음과 같습니다.
strimzi.authorization.kafka.cluster.name="kafka-cluster"
strimzi.authorization.kafka.cluster.name="kafka-cluster"
1 Copy to Clipboard Copied! - 1
- 특정 Kafka 클러스터의 이름입니다. 이름은 권한을 대상으로 지정하는 데 사용되며 동일한 Red Hat Single Sign-On 영역에서 여러 클러스터를 관리할 수 있습니다. 기본값은
kafka-cluster
입니다.
(선택 사항) 간단한 인증으로 위임합니다.
strimzi.authorization.delegate.to.kafka.acl="true"
strimzi.authorization.delegate.to.kafka.acl="true"
1 Copy to Clipboard Copied! - 1
- Red Hat Single Sign-On 인증 서비스 정책에서 액세스가 거부되는 경우 Kafka
AclAuthorizer
에 권한을 위임합니다. 기본값은false
입니다.
(선택 사항) 권한 부여 서버에 TLS 연결에 대한 구성을 추가합니다.
예를 들면 다음과 같습니다.
strimzi.authorization.ssl.truststore.location=<path_to_truststore> strimzi.authorization.ssl.truststore.password=<my_truststore_password> strimzi.authorization.ssl.truststore.type=JKS strimzi.authorization.ssl.secure.random.implementation=SHA1PRNG strimzi.authorization.ssl.endpoint.identification.algorithm=HTTPS
strimzi.authorization.ssl.truststore.location=<path_to_truststore>
1 strimzi.authorization.ssl.truststore.password=<my_truststore_password>
2 strimzi.authorization.ssl.truststore.type=JKS
3 strimzi.authorization.ssl.secure.random.implementation=SHA1PRNG
4 strimzi.authorization.ssl.endpoint.identification.algorithm=HTTPS
5 Copy to Clipboard Copied! (선택 사항) 권한 부여 서버에서 권한 부여 새로 고침을 구성합니다. 부여 새로 고침 작업은 활성 토큰을 열거하고 각각에 대한 최신 권한을 요청하여 작동합니다.
예를 들면 다음과 같습니다.
strimzi.authorization.grants.refresh.period.seconds="120" strimzi.authorization.grants.refresh.pool.size="10" strimzi.authorization.grants.max.idle.time.seconds="300" strimzi.authorization.grants.gc.period.seconds="300" strimzi.authorization.reuse.grants="false"
strimzi.authorization.grants.refresh.period.seconds="120"
1 strimzi.authorization.grants.refresh.pool.size="10"
2 strimzi.authorization.grants.max.idle.time.seconds="300"
3 strimzi.authorization.grants.gc.period.seconds="300"
4 strimzi.authorization.reuse.grants="false"
5 Copy to Clipboard Copied! - 1
- 권한 부여 서버의 권한 부여 목록이 새로 고침되는 빈도(기본적으로 분당 시간)를 지정합니다. 디버깅 목적으로 새로 고침을 비활성화하려면
"0"
으로 설정합니다. - 2
- grants 새로 고침 작업에 사용되는 스레드 풀의 크기(병합 정도)를 지정합니다. 기본값은
"5"
입니다. - 3
- 캐시의 유휴 부여를 제거할 수 있는 시간(초)입니다. 기본값은 300입니다.
- 4
- 캐시에서 오래된 권한을 정리하는 작업의 연속 실행 사이의 시간(초)입니다. 기본값은 300입니다.
- 5
- 최신 부여를 새 세션에 대해 가져올지 여부를 제어합니다. 비활성화되면 Red Hat Single Sign-On에서 부여가 검색되고 사용자에게 캐시됩니다. 기본값은
true
입니다.
(선택 사항) 권한 부여 서버와 통신할 때 네트워크 시간 초과를 구성합니다.
예를 들면 다음과 같습니다.
strimzi.authorization.connect.timeout.seconds="60" strimzi.authorization.read.timeout.seconds="60" strimzi.authorization.http.retries="2"
strimzi.authorization.connect.timeout.seconds="60"
1 strimzi.authorization.read.timeout.seconds="60"
2 strimzi.authorization.http.retries="2"
3 Copy to Clipboard Copied! - 1
- Red Hat Single Sign-On 토큰 끝점에 연결할 때 연결 시간(초)입니다. 기본값은
60
입니다. - 2
- Red Hat Single Sign-On 토큰 끝점에 연결할 때 읽기 제한 시간(초)입니다. 기본값은
60
입니다. - 3
- 권한 부여 서버에 대한 실패한 HTTP 요청을 재시도하지 않고 재시도할 최대 횟수입니다. 기본값은
0
입니다. 즉, 재시도가 수행되지 않습니다. 이 옵션을 효과적으로 사용하려면strimzi.authorization.connect.timeout.seconds
및strimzi.authorization.read.timeout.seconds
옵션의 시간 초과 시간을 줄이는 것이 좋습니다. 그러나 재시도하면 현재 작업자 스레드를 다른 요청에 사용할 수 없게 될 수 있으며 요청이 너무 많으면 Kafka 브로커가 응답하지 않을 수 있습니다.
(선택 사항) 토큰 검증 및 권한 부여에 OAuth 2.0 메트릭을 활성화합니다.
oauth.enable.metrics="true"
oauth.enable.metrics="true"
1 Copy to Clipboard Copied! - 1
- OAuth 메트릭을 활성화하거나 비활성화할지 여부를 제어합니다. 기본값은
false
입니다.
(선택 사항) 요청에서
Accept
헤더를 제거합니다.oauth.include.accept.header="false"
oauth.include.accept.header="false"
1 Copy to Clipboard Copied! - 1
- 헤더를 포함하는 경우
false
로 설정하면 권한 부여 서버와 통신할 때 문제가 발생합니다. 기본값은true
입니다.
- Kafka 브로커에 특정 역할이 있는 클라이언트 또는 사용자로 액세스하여 구성된 권한에 액세스하고 필요한 액세스 권한이 있는지 또는 권한이 없는지 확인합니다.