이 문서에서는 Google Cloud Managed Service for Apache Kafka에서 액세스 제어를 위해 Apache Kafka 액세스 제어 목록 (ACL)을 사용하는 방법을 설명합니다.
Apache Kafka ACL은 Kafka 클러스터 내에서 세분화된 액세스 제어를 제공합니다. Managed Service for Apache Kafka는 KRaft 기반 Kafka 클러스터 메타데이터에 ACL을 저장하는 기본 StandardAuthorizer를 지원합니다.
이러한 ACL은 인증된 사용자가 주제에서 메시지를 생성하거나 소비하는 등 특정 Kafka 리소스에 대해 특정 작업을 실행할 수 있는지를 제어합니다.
이러한 ACL은 초기 연결에만 클러스터 수준 IAM 검사를 받는 표준 Apache Kafka 클라이언트를 사용하여 클러스터와의 상호작용을 제어하는 데 유용합니다. 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
Kafka ACL 액세스 제어 작동 방식
클라이언트는 클러스터 내에서 Kafka의 표준 ACL 승인자와 상호작용합니다. 승인자는 관련 Apache Kafka ACL을 평가하여 주제에 대한 생성 또는 그룹에서의 소비와 같이 주 구성원이 요청한 특정 작업을 승인합니다. ACL 검사에 사용되는 주체는 다음 인증 방법 중 하나에서 파생됩니다.
SASL: 서비스 계정 이메일과 같은 IAM 주 구성원입니다.
mTLS: 클라이언트 인증서의 고유 이름 (DN)으로, 주 구성원 매핑 규칙에 의해 변환될 수 있습니다.
포괄적인 보안을 위해서는 다음을 구성해야 합니다.
관리 액세스를 위한 IAM 권한입니다. 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
인증 방법과 관계없이 오픈소스 Apache Kafka 클라이언트에서 클러스터 내 데이터 액세스 및 작업을 위한 Kafka ACL
Apache Kafka ACL 사용
Apache Kafka ACL 바인딩의 형식은 다음과 같습니다.
Principal P is [Allowed/Denied] Operation O From Host H on any resource matching Resource Pattern RP.
다음은 형식에 관한 중요한 정보 목록입니다.
주체(P): 승인되는 사용자 ID입니다. 여기에는
User:가 프리픽스로 추가됩니다.SASL 인증의 경우 이는
User:my-service-account@my-project.iam.gserviceaccount.com와 같은 IAM 보안 주체입니다.mTLS 인증의 경우 클라이언트 인증서의 식별 이름(DN)(예:
User:CN=my-client,OU=my-org-unit)입니다. 정확한 형식은 인증서의 주체에 따라 다릅니다. 주 구성원 매핑 규칙을 사용하여 이 값을 변환할 수 있습니다.
권한 유형(허용/거부됨): ACL 바인딩이 액세스를 허용하는지 거부하는지 여부입니다. 거부 바인딩이 우선 적용됩니다.
작업(O): 읽기, 쓰기, 생성과 같이 수행된 작업입니다. 다양한 Kafka 프로토콜의 리소스에 적용되는 작업에 대한 자세한 내용은 Apache Kafka 문서의 프로토콜의 작업 및 리소스를 참고하세요.
호스트(H): 요청이 시작된 머신입니다. Apache Kafka용 관리형 서비스는 클라이언트 네트워크 주소를 변환하므로
'*'이외의 호스트 사용은 지원되지 않습니다.리소스 패턴(RP): 특정 리소스를 일치시키는 데 사용되는 패턴입니다. 리소스 패턴은 리소스 유형, 리소스 이름, 패턴 유형 (
LITERAL또는PREFIXED)으로 구성됩니다.
기본 액세스
Managed Service for Apache Kafka 클러스터는 Apache Kafka 속성 allow.everyone.if.no.acl.found이 true로 설정된 상태로 작동합니다. Kafka ACL의 존재 여부는 리소스에 대한 액세스 수준을 직접적으로 결정합니다.
주제와 같은 특정 리소스에 대해 정의된 Kafka ACL이 없으면 인증된 모든 주체에게 액세스 권한이 부여됩니다. 이 구성을 사용하면 ACL을 구성하지 않아도 Managed Service for Apache Kafka 클러스터를 즉시 작동할 수 있습니다.
해당 리소스에 대한 Kafka ACL을 정의하는 즉시 액세스가 제한됩니다. Kafka ACL의
ALLOW항목을 사용하여 명시적으로 권한이 부여된 주 구성원만 일치하는 리소스에 액세스할 수 있습니다 (DENY항목에 의해 명시적으로 차단되지 않는 한).
Apache Kafka용 관리형 서비스는 서비스 에이전트에 클러스터에 대한 관리 액세스 권한을 부여합니다. 이 액세스를 통해 서비스 에이전트는 클러스터에 구성된 다른 ACL과 관계없이 Managed Service for Apache Kafka API에서 요청한 작업을 실행할 수 있습니다. Apache Kafka용 관리형 서비스는 StandardAuthorizer 구현을 수정하여 이를 달성합니다. 이 수정사항은 읽기 및 쓰기 작업을 제외하고 서비스 에이전트에게 슈퍼 사용자와 유사한 권한을 부여합니다. 이 구성을 변경할 수 없습니다.
Kafka 보안 주체
Managed Service for Apache Kafka 클러스터의 Kafka 보안 주체는 Kafka StandardAuthorizer 접두사 "User:"로 지정됩니다.
SASL/IAM의 경우: 주 구성원은Google Cloud 계정입니다. 예를 들어 서비스 계정
test-kafka-client@test-project.iam.gserviceaccount.com에 대한 액세스 권한을 부여하려면 Kafka 보안 주체"User:test-kafka-client@test-project.iam.gserviceaccount.com"을 사용합니다. Kafka ACL 주 구성원은 그룹이나 주 구성원 집합이 아닌 사용자, 서비스 계정 또는 개별 IAM 주 구성원을 지정해야 합니다. Kafka ACL은 Google Cloud 보안 주체의 그룹 멤버십 확인을 지원하지 않습니다.mTLS의 경우: 주체는 클라이언트 인증서의 주제 고유 이름 (DN)에서 파생됩니다. 예를 들면
User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=US입니다. mTLS 주 구성원 매핑 규칙을 사용하여 DN을 ACL에 더 사용자 친화적인 주 구성원 문자열로 변환할 수 있습니다.
Google 그룹 또는 주 구성원 집합의 모든 구성원에 적용되는 ACL을 만들려면 프록시 서비스 계정 주 구성원과 서비스 계정 가장을 사용하면 됩니다.
그룹의 프록시로 사용할 서비스 계정을 만듭니다.
Google 그룹 또는 주 구성원 집합에 서비스 계정에 대한 서비스 계정 토큰 생성자 역할을 부여합니다. 서비스 계정에 대한 액세스 관리를 참고하세요.
프록시 서비스 계정에 Kafka ACL을 추가합니다. 주체의 예는
User:group-proxy@test-project.iam.gserviceaccount.com입니다.Kafka 클라이언트에서 서비스 계정 가장을 사용하여 서비스 계정으로 Kafka에 인증합니다. Google Cloud IAM은 프록시 서비스 계정을 가장할 수 있는 그룹의 구성원으로 개별 주 구성원을 승인합니다. Kafka는 클러스터의 기존 ACL에 대해 프록시 서비스 계정을 승인합니다.
생산자 및 소비자를 위한 Kafka 작업
작업은 리소스에서 수행되는 작업입니다. 각 리소스에 대해 작업은 해당 리소스의 하나 이상의 Kafka 프로토콜 요청에 매핑됩니다.
예를 들어 topic 리소스 유형의 READ 작업은 Fetch, OffsetCommit, TxnOffsetCommit Apache Kafka 프로토콜에 매핑됩니다.
주 구성원에게 주제에 대한 프로듀서 액세스 권한을 부여하려면 다음 단계를 실행하세요.
주제 리소스에서
WRITE및CREATE작업을 허용합니다.거래 ID를 사용하는 경우 거래 ID 리소스에서
WRITE작업을 허용합니다.
주 구성원에게 주제에 대한 소비자 액세스 권한을 부여하려면 다음 단계를 수행하세요.
주제 리소스에서
READ작업을 허용합니다.소비자 그룹 리소스에서
READ작업을 허용합니다.
Kafka API에서 지원하는 리소스의 유효한 작업에 대한 자세한 내용은 Apache Kafka 문서의 프로토콜의 작업 및 리소스를 참고하세요.
기본 거부 동작에 대한 ACL 구성
관리형 Kafka 클러스터는 allow.everyone.if.no.acl.found = true로 구성됩니다.
따라서 기본적으로 리소스에 ACL이 설정되어 있지 않으면 모든 주 구성원이 리소스에 액세스할 수 있습니다.
IAM과 유사한 default-deny 동작을 구성하려면 먼저 클러스터의 모든 리소스에 대한 관리자 사용자의 액세스를 구성하면 됩니다.
따라서 모든 리소스에는 ACL이 정의되고 allow.everyone.if.no.acl.found 동작이 억제됩니다.
기본적으로 ALLOW ACL에 의해 명시적으로 허용되지 않은 모든 주 구성원은 액세스가 거부됩니다.
예를 들어 서비스 계정 clusterAdmin@test-project.iam.gserviceaccount.com의 클러스터에 있는 모든 리소스에 ACL을 설정하려면 다음 ACL 항목을 만듭니다.
다음 gcloud CLI 명령어는 특정 리전에 있는 특정 Kafka 클러스터에 대한 전체 관리 액세스 권한 (--operation=ALL)을 clusterAdmin@test-project.iam.gserviceaccount.com라는 서비스 계정에 부여합니다. 이 권한을 사용하면 서비스 계정이 모든 호스트에서 클러스터에 대한 작업을 실행할 수 있습니다.
gcloud managed-kafka acls add-acl-entry cluster \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
다음 gcloud CLI 명령어는 특정 리전에 있는 특정 Kafka 클러스터 내의 모든 주제에 대한 전체 관리 액세스 권한 (--operation=ALL)을 clusterAdmin@test-project.iam.gserviceaccount.com라는 서비스 계정에 부여합니다. 이 권한을 사용하면 서비스 계정이 모든 호스트의 모든 주제에 대해 작업을 실행할 수 있습니다.
gcloud managed-kafka acls add-acl-entry allTopics \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
다음 gcloud CLI 명령어는 특정 리전에 있는 특정 Kafka 클러스터 내의 모든 소비자 그룹에 clusterAdmin@test-project.iam.gserviceaccount.com라는 서비스 계정에 전체 관리 액세스 권한 (--operation=ALL)을 부여합니다. 이 권한을 사용하면 서비스 계정이 모든 호스트에서 모든 소비자 그룹에 대해 작업을 실행할 수 있습니다.
gcloud managed-kafka acls add-acl-entry allConsumerGroups \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
다음 gcloud CLI 명령어는 특정 리전에 있는 특정 Kafka 클러스터 내의 모든 트랜잭션 ID에 대한 전체 관리 액세스 권한 (--operation=ALL)을 clusterAdmin@test-project.iam.gserviceaccount.com라는 서비스 계정에 부여합니다. 이 권한을 사용하면 서비스 계정이 모든 호스트의 모든 트랜잭션 ID에 대해 작업을 실행할 수 있습니다.
gcloud managed-kafka acls add-acl-entry allTransactionalIds \
--principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
--operation=ALL \
--permission-type=ALLOW \
--host=* \
--cluster=CLUSTER_ID \
--location=LOCATION
다음은 명령어에 관한 중요한 정보 목록입니다.
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL이 적용되는 주 구성원입니다. 주 구성원은 Kafka StandardAuthorizer 접두사User:이 있는Google Cloud 계정입니다.--operation=all: 부여되는 Kafka 작업입니다. 이 경우 전체 액세스 권한입니다.--permission-type=ALLOW: 이 ACL 항목은 액세스 권한을 부여합니다.--host='*': 주 구성원이 리소스에 액세스할 수 있는 호스트입니다.'*'는 모든 호스트에서 액세스 권한을 부여합니다. Managed Service for Apache Kafka는 호스트'*'가 있는 ACL만 지원합니다.CLUSTER_ID: Managed Service for Apache Kafka 클러스터의 이름입니다.
LOCATION: Apache Kafka용 관리형 서비스 클러스터가 있는 Google Cloud 리전(예:
us-central1)입니다.
ACL 구성
Apache Kafka용 관리형 서비스 ACL API 또는 Apache Kafka 승인자 CLI kafka-acls.sh 또는 Admin Client와 같은 오픈소스 Apache Kafka 도구를 사용하여 Apache Kafka ACL을 구성할 수 있습니다.
Managed Service for Apache Kafka는 Kafka 리소스 패턴별로 ACL을 구성합니다. 리소스 패턴은 다음과 같이 정의됩니다.
리소스 유형: 클러스터, 주제, 소비자 그룹 또는 트랜잭션 ID
패턴 유형: 리터럴 또는 접두사 (이름이 제공된 문자열로 시작하는 모든 리소스)
리소스 이름: ACL 항목이 적용되는 리소스 이름 또는 접두사입니다.
Managed Service for Apache Kafka ACL 리소스는 단일 Kafka 리소스 패턴에 대해 구성된 모든 액세스 제어를 ACL 항목의 반복 목록으로 나타냅니다. ACL 리소스의 이름은 ACL 바인딩의 리소스 패턴을 고유하게 식별합니다. 자세한 내용은 ACL ID를 참고하세요.
ACL 리소스 수준 (리소스 패턴의 모든 ACL 항목)에서 Managed Service for Apache Kafka ACL을 관리하거나 ACL 리소스 패턴의 개별 ACL 항목을 추가 및 삭제하여 점진적으로 관리할 수 있습니다.
자세한 내용은 관리형 Kafka ACL 만들기 및 관리형 Kafka ACL 항목 추가를 참고하세요.
주제에서 읽기 허용
서비스 계정 test-kafka-client@test-project.iam.gserviceaccount.com로 실행되는 오픈소스 Apache Kafka 클라이언트가 주제 topic-name에서 읽을 수 있도록 하려면 managed-kafka acls add-acl-entry 명령을 사용하여 Apache Kafka용 관리형 서비스 ACL 항목을 만드세요.
gcloud managed-kafka acls add-acl-entry topic/topic-name \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=READ \
--permission-type=ALLOW \
--host='*'
다음은 명령어에 관한 중요한 정보 목록입니다.
topic/topic-name: 액세스 권한을 부여할 Managed Service for Apache Kafka 주제를 지정합니다.topic-name을 주제의 실제 이름으로 바꿉니다.topic/접두사는 이 ACL 항목이 특정 (리터럴) 주제 리소스 패턴에 적용됨을 나타냅니다.LOCATION: Apache Kafka용 관리형 서비스 클러스터가 있는 Google Cloud 리전입니다(예:us-central1).CLUSTER_ID: Managed Service for Apache Kafka 클러스터의 이름입니다.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL이 적용되는 주 구성원입니다. 주 구성원은 Kafka StandardAuthorizer 접두사User:이 있는Google Cloud 계정입니다.--operation=READ: 부여되는 Kafka 작업입니다. 이 경우READ입니다.--permission-type=ALLOW: 이 ACL 항목이 액세스 권한을 부여함을 나타냅니다.--host='*': 주 구성원이 리소스에 액세스할 수 있는 호스트를 지정합니다.'*'는 모든 호스트에서 액세스 권한을 부여합니다. Apache Kafka용 관리형 서비스는 호스트'*'가 있는 ACL만 지원합니다.
읽기 액세스 권한을 삭제하려면 동일한 매개변수를 사용하여 remove-acl-entry 명령어를 사용하면 됩니다.
gcloud managed-kafka acls remove-acl-entry topic/topic-name \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=READ \
--permission-type=ALLOW \
--host='*'
공통 접두사가 있는 모든 주제에 쓰기 허용
서비스 계정 test-kafka-client@test-project.iam.gserviceaccount.com로 실행되는 오픈소스 Apache Kafka 클라이언트가 이름이 topic-prefix 접두사로 시작하는 모든 주제에 쓸 수 있도록 하려면 다음과 같이 관리형 Kafka ACL 항목을 추가하세요.
gcloud managed-kafka acls add-acl-entry topicPrefixed/topic-prefix \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=WRITE \
--permission-type=ALLOW \
--host='*'
다음은 명령어에 관한 중요한 정보 목록입니다.
topicPrefixed/topic-prefix: 액세스 권한을 부여할 Apache Kafka용 관리형 서비스 리소스 패턴을 지정합니다.topic-prefix를 주제의 실제 접두사로 바꿉니다.topicPrefixed/접두사는 이 ACL 항목이 접두사가 지정된 리소스 패턴(지정된 접두사와 일치하는 모든 주제)에 적용됨을 나타냅니다.PROJECT: Managed Service for Apache Kafka 클러스터가 있는 Google Cloud 프로젝트의 ID입니다.LOCATION: Apache Kafka용 관리형 서비스 클러스터가 있는 Google Cloud 리전(예:us-central1)입니다.CLUSTER_ID: Managed Service for Apache Kafka 클러스터의 이름입니다.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL이 적용되는 주 구성원입니다. 주 구성원은 Kafka StandardAuthorizer 접두사User:이 있는Google Cloud 계정입니다.--operation=WRITE: 부여되는 Kafka 작업입니다. 이 경우WRITE입니다.--permission-type=ALLOW: 이 ACL 항목은 액세스 권한을 부여합니다.--host='*': 주 구성원이 리소스에 액세스할 수 있는 호스트입니다.'*'는 모든 호스트에서 액세스 권한을 부여합니다. Managed Service for Apache Kafka는 호스트'*'가 있는 ACL만 지원합니다.
이 서비스 계정의 쓰기 액세스 권한을 삭제하려면 ACL 항목을 삭제하세요.
gcloud managed-kafka acls remove-acl-entry topicPrefixed/topic-prefix \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=WRITE \
--permission-type=ALLOW \
--host='*'
모든 주제 수정 거부
서비스 계정 test-kafka-client@test-project.iam.gserviceaccount.com로 실행되는 오픈소스 Apache Kafka 클라이언트가 클러스터의 모든 주제를 수정하지 못하도록 하려면 모든 주제에 대한 ALTER, ALTER_CONFIGS, DELETE 작업을 거부하는 AclEntry 리소스 목록이 있는 Apache Kafka용 관리형 서비스 ACL 리소스를 만들면 됩니다. 이 접근 방식은 단일 구성에서 필수 상태를 정의합니다.
또는 gcloud managed-kafka acls add-acl-entry 명령어를 사용하여 별도의 ACL 항목 3개를 명령형으로 추가하여 동일한 결과를 얻을 수 있습니다.
이 방법에서는 ALTER, ALTER_CONFIGS, DELETE 작업에 대한 액세스를 거부하는 명령어를 다음과 같이 실행합니다.
gcloud managed-kafka acls add-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=ALTER \
--permission-type=DENY \
--host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=ALTER_CONFIGS \
--permission-type=DENY \
--host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=DELETE \
--permission-type=DENY \
--host='*'
다음 정보는 각 add-acl-entry 명령어에 적용됩니다.
allTopics: 이 ACL이 Apache Kafka용 관리형 서비스 클러스터 내의 모든 주제에 적용됨을 지정합니다.LOCATION: Apache Kafka용 관리형 서비스 클러스터가 있는 Google Cloud 리전(예:us-central1)입니다.CLUSTER_ID: Managed Service for Apache Kafka 클러스터의 이름입니다.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': ACL이 적용되는 주 구성원을 지정합니다. 주 구성원은 KafkaStandardAuthorizer접두사User:가 있는Google Cloud 계정입니다.--operation: 거부된 Kafka 작업을 지정합니다.ALTER: 파티션 수 또는 복제 요소 변경과 같은 작업을 포함합니다.ALTER_CONFIGS: 주제 수준 구성 수정이 포함됩니다.DELETE: 주제 삭제가 포함됩니다.
--permission-type=DENY: 이러한 ACL 항목이 지정된 작업에 대한 액세스를 차단함을 나타냅니다.--host='*': 요청이 시작된 호스트와 관계없이 이 거부가 적용됨을 지정합니다. Managed Service for Apache Kafka는 호스트'*'가 있는 ACL만 지원합니다.
이러한 제한을 삭제하려면 추가된 각 항목에 대해 동일한 매개변수를 사용하여 remove-acl-entry 명령어를 사용합니다. 예를 들어 주제 삭제를 다시 허용하려면 다음을 실행합니다.
gcloud managed-kafka acls remove-acl-entry allTopics \
--cluster=CLUSTER_ID \
--location=LOCATION
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
--operation=DELETE \
--permission-type=DENY \
--host='*'
ACL 문제 해결
Apache Kafka 표준 승인자는 기본적으로 승인 거부에 대한 감사 로그를 작성합니다. Kafka 승인 오류가 발생하면 클러스터 로그에서 StandardAuthorizerData logAuditMessage를 검색하여 거부된 주 구성원, 리소스, 작업을 확인할 수 있습니다.
예를 들어 다음은 샘플 클러스터 로그입니다.
org.apache.kafka.metadata.authorizer.StandardAuthorizerData logAuditMessage\n
INFO: Principal = User:556291496362-compute@developer.iam.gserviceaccount.com is
Denied operation = DESCRIBE from host = 172.16.0.20 on resource = Topic:LITERAL:t1
for request = Metadata with resourceRefCount = 1 based on rule DefaultDeny