이 문서에서는 Apache Kafka 액세스 제어 목록 (ACL)을 Google Cloud Managed Service for Apache Kafka의 액세스 제어에 사용하는 방법을 설명합니다.
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 주 구성원입니다.
포괄적인 보안을 위해서는 다음을 구성해야 합니다.
관리 액세스를 위한 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 인증의 경우
User:CN=my-client,OU=my-org-unit과 같은 클라이언트 인증서의 고유 이름 (DN)입니다. 정확한 형식은 인증서의 주체에 따라 다릅니다. 주 구성원 매핑 규칙 은 이 값을 변환할 수 있습니다.
권한 유형(허용됨/거부됨): ACL 바인딩이 액세스를 허용하는지 거부하는지 여부입니다. 거부 바인딩이 우선 적용됩니다.
작업(O): 읽기, 쓰기 또는 만들기 등 수행된 작업입니다. 다양한 Kafka 프로토콜의 리소스에 적용되는 작업에 대한 자세한 내용은 Apache Kafka 문서의 프로토콜의 작업 및 리소스 를 참조하세요.
호스트(H): 요청이 시작되는 머신입니다. Managed Service for 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항목에 의해 명시적으로 차단되지 않는 한).
Managed Service for Apache Kafka는 서비스 에이전트에 클러스터에 대한 관리 액세스 권한을 부여합니다. 이 액세스를 통해 서비스 에이전트는 클러스터에 구성된 다른 ACL과 관계없이 Managed Service for Apache Kafka API에서 요청한 작업을 수행할 수 있습니다.
Managed Service for 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 CloudmTLS의 경우: 주 구성원은 클라이언트 인증서의 주체 고유 이름 (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 프로토콜 요청에 매핑됩니다.
예를 들어 READ 리소스 유형의 topic 작업은
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 클러스터 내의 모든 소비자 그룹에 대한 전체 관리 액세스 권한 (--operation=ALL)을 clusterAdmin@test-project.iam.gserviceaccount.com라는 서비스 계정에 부여합니다. 이 권한을 사용하면 서비스 계정이 모든 호스트에서 모든 소비자 그룹에 대한 모든 작업을 수행할 수 있습니다.
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: Managed Service for Apache Kafka 클러스터가 있는 Google Cloud 리전(예:
us-central1)입니다.
ACL 구성
Managed Service for Apache Kafka ACL API 또는 Apache Kafka 승인자 CLI kafka-acls.sh와 같은 오픈소스 Apache Kafka 도구를 사용하여 Apache Kafka ACL을 구성할 수 있습니다. 또는 Admin Client.
Managed Service for Apache Kafka는 Kafka 리소스 패턴별로 ACL을 구성합니다. 리소스 패턴은 다음으로 정의됩니다.
리소스 유형: 클러스터, 주제, 소비자 그룹 또는 트랜잭션 ID
패턴 유형: 리터럴 또는 프리픽스 (이름이 제공된 문자열로 시작하는 모든 리소스)
리소스 이름: ACL 항목이 적용되는 리소스 이름 또는 프리픽스입니다.
Managed Service for Apache Kafka ACL 리소스는 ACL 항목의 반복 목록으로 단일 Kafka 리소스 패턴에 대해 구성된 모든 액세스 제어를 나타냅니다. 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에서 읽을 수 있도록 허용하려면 Apache Kafka용 관리형 서비스 ACL
항목을 managed-kafka acls add-acl-entry
명령어를 사용하여 만듭니다.
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: 액세스 권한을 부여할 Apache Kafka용 관리형 서비스 주제를 지정합니다.topic-name을 주제의 실제 이름으로 바꿉니다.topic/프리픽스는 이 ACL 항목이 특정 (리터럴) 주제 리소스 패턴에 적용됨을 나타냅니다.LOCATION: Managed Service for 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='*': 주 구성원이 리소스에 액세스할 수 있는 리소스를 지정합니다.'*'는 모든 호스트에서 액세스 권한을 부여합니다. Managed Service for 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: Managed Service for 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 클라이언트가 클러스터의 모든 주제를 수정하지 못하도록 하려면 리소스 목록이 있는 Managed Service for Apache Kafka ACL 리소스를 만들어 모든 주제에 대한 ALTER, ALTER_CONFIGS, DELETE 작업을 거부하면 됩니다.AclEntry 이 접근 방식은 단일 구성에서 필요한 상태를 정의합니다.
또는 gcloud managed-kafka acls add-acl-entry 명령어를 사용하여 세 개의 개별 ACL 항목을 명령형으로 추가하여 동일한 결과를 얻을 수 있습니다. 이 메서드는 다음과 같이
작업 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이 Managed Service for Apache Kafka 클러스터 내의 모든 주제에 적용됨을 지정합니다.LOCATION: Managed Service for 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