IAM 액세스 제어 - Amazon Managed Streaming for Apache Kafka

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

IAM 액세스 제어

Amazon MSK를 위한 IAM 액세스 제어를 사용하면 MSK 클러스터에 대한 인증과 권한 부여를 모두 처리할 수 있습니다. 이렇게 하면 인증에 한 메커니즘을 사용하고 권한 부여에 다른 메커니즘을 사용할 필요가 없습니다. 예를 들어 클라이언트가 클러스터에 쓰기를 시도할 때 Amazon MSK는 IAM을 사용하여 해당 클라이언트가 인증된 자격 증명인지 여부와 클러스터에 생성할 수 있는 권한이 있는지 여부를 확인합니다. IAM 액세스 제어는 Python, Go, JavaScript .NET으로 작성된 Kafka 클라이언트를 포함하여 자바 클라이언트와 비자바 클라이언트에서 작동합니다.

Amazon MSK는 액세스 이벤트를 기록하므로 이를 감사할 수 있습니다. 자세한 정보는 을 사용하여 AWS CloudTrail API 호출 로깅을 참조하세요.

IAM 액세스 제어를 가능하게 하기 위해 Amazon MSK는 Apache Kafka 소스 코드를 약간 수정합니다. 이러한 수정 사항으로 인해 Apache Kafka 환경이 눈에 띄게 달라지지는 않습니다.

중요

IAM 액세스 제어는 Apache 노드에는 적용되지 않습니다. ZooKeeper 이러한 노드에 대한 액세스를 제어하는 방법에 대한 자세한 내용은 아파치에 대한 액세스 제어 ZooKeeper 섹션을 참조하세요.

중요

클러스터에서 IAM 액세스 제어를 사용하는 경우 allow.everyone.if.no.acl.found Apache Kafka 설정은 적용되지 않습니다.

중요

IAM 액세스 제어를 사용하는 MSK 클러스터에 대해 Apache Kafka ACL API를 호출할 수 있습니다. 하지만 아파치 카프카 ACL은 IAM 역할에 대한 권한 부여에 영향을 주지 않습니다. IAM 정책을 사용하여 IAM 역할에 대한 액세스를 제어해야 합니다.

Amazon MSK의 IAM 액세스 제어 작동 방식

Amazon MSK에 대한 IAM 액세스 제어를 사용하려면 다음 단계를 수행하며, 이 섹션의 나머지 부분에서 자세히 설명합니다.

IAM 액세스 제어를 사용하는 클러스터 생성

이 섹션에서는 AWS Management Console, API 또는 를 사용하여 IAM 액세스 제어를 사용하는 클러스터를 생성하는 AWS CLI 방법을 설명합니다. 기존 클러스터에 대한 IAM 액세스 제어를 사용 설정하는 방법에 대한 자세한 내용은 클러스터의 보안 설정 업데이트 섹션을 참조하세요.

AWS Management Console 를 사용하여 IAM 액세스 제어를 사용하는 클러스터를 생성할 수 있습니다.
  1. https://console.aws.amazon.com/msk/에서 Amazon MSK 콘솔을 엽니다.

  2. 클러스터 생성을 선택합니다.

  3. 사용자 지정 설정으로 클러스터 생성을 선택합니다.

  4. 인증 섹션에서 IAM 액세스 제어를 선택합니다.

  5. 클러스터 생성을 위한 나머지 워크플로를 완료합니다.

API 또는 를 사용하여 IAM 액세스 제어를 사용하는 클러스터를 생성합니다. AWS CLI
  • IAM 액세스 제어가 활성화된 클러스터를 생성하려면 CreateClusterAPI 또는 create-cluster CLI 명령을 사용하고 파라미터에 다음 JSON을 전달하십시오. ClientAuthentication "ClientAuthentication": { "Sasl": { "Iam": { "Enabled": true } }

IAM 액세스 제어를 위한 클라이언트 구성

클라이언트가 IAM 액세스 제어를 사용하는 MSK 클러스터와 통신할 수 있도록 하려면 다음 메커니즘 중 하나를 사용할 수 있습니다.

  • SASL_OAUTHBEARER 메커니즘을 사용하여 비 Java 클라이언트 구성

  • SASL_OAUTHBEARER 메커니즘 또는 AWS_MSK_IAM 메커니즘을 사용하여 Java 클라이언트 구성

SASL_OAUTHBEARER 메커니즘을 사용하여 IAM 구성

  1. 아래 Python Kafka 클라이언트 예제에서 강조 표시된 구문을 가이드로 사용하여 client.properties 구성 파일을 편집합니다. 구성 변경은 다른 언어에서도 비슷합니다.

    #!/usr/bin/python3from kafka import KafkaProducer from kafka.errors import KafkaError import socket import time from aws_msk_iam_sasl_signer import MSKAuthTokenProvider class MSKTokenProvider(): def token(self): token, _ = MSKAuthTokenProvider.generate_auth_token('<my aws region>') return token tp = MSKTokenProvider() producer = KafkaProducer( bootstrap_servers='<my bootstrap string>', security_protocol='SASL_SSL', sasl_mechanism='OAUTHBEARER', sasl_oauth_token_provider=tp, client_id=socket.gethostname(), ) topic = "<my-topic>" while True: try: inp=input(">") producer.send(topic, inp.encode()) producer.flush() print("Produced!") except Exception: print("Failed to send message:", e) producer.close()
  2. 선택한 구성 언어의 헬퍼 라이브러리를 다운로드하고 해당 언어 라이브러리 홈페이지의 시작하기 섹션에 있는 지침을 따르세요.

MSK 사용자 지정 AWS_MSK_IAM 메커니즘을 사용하여 IAM을 구성

  1. client.properties 파일에 다음을 추가합니다. <PATH_TO_TRUST_STORE_FILE>을 클라이언트의 트러스트 스토어 파일에 대한 정규화된 경로로 변경합니다.

    참고

    특정 인증서를 사용하지 않으려면 client.properties 파일에서 ssl.truststore.location=<PATH_TO_TRUST_STORE_FILE>을 제거하면 됩니다. ssl.truststore.location의 값을 지정하지 않으면 Java 프로세스에서 기본 인증서를 사용합니다.

    ssl.truststore.location=<PATH_TO_TRUST_STORE_FILE> security.protocol=SASL_SSL sasl.mechanism=AWS_MSK_IAM sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required; sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler

    AWS 자격 증명을 위해 만든 명명된 프로필을 사용하려면 클라이언트 구성 awsProfileName="your profile name"; 파일에 포함시키십시오. 명명된 프로필에 대한 자세한 내용은 AWS CLI 설명서의 명명된 프로필을 참조하십시오.

  2. 안정적인 최신 aws-msk-iam-auth JAR 파일을 다운로드하여 클래스 경로에 배치합니다. Maven을 사용하는 경우 필요에 따라 버전 번호를 조정하여 다음 종속성을 추가합니다.

    <dependency> <groupId>software.amazon.msk</groupId> <artifactId>aws-msk-iam-auth</artifactId> <version>1.0.0</version> </dependency>

Amazon MSK 클라이언트 플러그인은 Apache 2.0 라이선스에 따라 오픈 소스로 제공됩니다.

권한 부여 정책 생성

권한 부여 정책을 클라이언트에 해당하는 IAM 역할에 연결합니다. 권한 부여 정책에서 역할에 대해 허용하거나 거부할 작업을 지정합니다. 클라이언트가 Amazon EC2 인스턴스를 사용하는 경우 권한 부여 정책을 해당 Amazon EC2 인스턴스의 IAM 역할에 연결합니다. 또는 명명된 프로필을 사용하도록 클라이언트를 구성한 다음 권한 부여 정책을 해당 명명된 프로필의 역할과 연결할 수 있습니다. IAM 액세스 제어를 위한 클라이언트 구성에서는 명명된 프로필을 사용하도록 클라이언트를 구성하는 방법에 대해 설명합니다.

IAM 정책을 만드는 방법에 대한 자세한 내용은 IAM 정책 생성을 참조하세요.

다음은 이름이 지정된 클러스터에 대한 권한 부여 정책의 예입니다 MyTestCluster. ActionResource 요소의 의미를 이해하려면 작업 및 리소스의 의미를 참조하세요.

중요

IAM 정책에 대한 변경 사항은 IAM API 및 AWS CLI 에 즉시 반영됩니다. 그러나 정책 변경이 적용되려면 상당한 시간이 소요될 수 있습니다. 대부분 정책 변경은 1분 이내에 적용됩니다. 네트워크 상태에 따라 지연 시간이 늘어날 수 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kafka-cluster:Connect", "kafka-cluster:AlterCluster", "kafka-cluster:DescribeCluster" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:cluster/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1" ] }, { "Effect": "Allow", "Action": [ "kafka-cluster:*Topic*", "kafka-cluster:WriteData", "kafka-cluster:ReadData" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/*" ] }, { "Effect": "Allow", "Action": [ "kafka-cluster:AlterGroup", "kafka-cluster:DescribeGroup" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:group/MyTestCluster/*" ] } ] }

데이터 생산 및 소비와 같은 일반적인 Apache Kafka 사용 사례에 해당하는 조치 요소가 포함된 정책을 생성하는 방법을 알아보려면 일반 사용 사례를 참조하세요.

Kafka 버전 2.8.0 이상에서는 WriteDataIdempotently 권한이 더 이상 사용되지 않습니다 (KIP-679). 기본적으로 enable.idempotence = true가 설정되어 있습니다. 따라서 Kafka 버전 2.8.0 이상의 경우 IAM은 Kafka ACL과 동일한 기능을 제공하지 않습니다. 해당 주제에 대한 WriteData 액세스 권한만 제공해서는 주제에 WriteDataIdempotently를 수행할 수 없습니다. 이는 모든 주제에 WriteData가 제공되는 경우에는 영향을 미치지 않습니다. 이 경우 WriteDataIdempotently가 허용됩니다. 이는 IAM 로직의 구현 방식과 Kafka ACL의 구현 방식에 차이가 있기 때문입니다.

이 문제를 해결하려면 아래 샘플과 유사한 정책을 사용하는 것을 권장합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kafka-cluster:Connect", "kafka-cluster:AlterCluster", "kafka-cluster:DescribeCluster", "kafka-cluster:WriteDataIdempotently" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:cluster/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1" ] }, { "Effect": "Allow", "Action": [ "kafka-cluster:*Topic*", "kafka-cluster:WriteData", "kafka-cluster:ReadData" ], "Resource": [ "arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/TestTopic" ] } ] }

이 경우 WriteDataTestTopic에 대한 쓰기를 허용하고 WriteDataIdempotently은 클러스터에 대한 멱등성 쓰기를 허용합니다. WriteDataIdempotently는 클러스터 수준 권한이라는 점에 유의해야 합니다. 주제 수준에서 사용할 수 없습니다. WriteDataIdempotently가 주제 수준으로 제한되어 있으면 해당 정책이 작동하지 않습니다.

IAM 액세스 제어를 위한 부트스트랩 브로커 가져오기

Amazon MSK 클러스터를 위한 부트스트랩 브로커 가져오기 섹션을 참조하십시오.

작업 및 리소스의 의미

이 섹션에서는 IAM 권한 부여 정책에서 사용할 수 있는 작업 및 리소스 요소의 의미에 대해 설명합니다. 정책 예제는 권한 부여 정책 생성을 참조하세요.

작업

다음 표에는 Amazon MSK를 위한 IAM 액세스 제어를 사용할 때 권한 부여 정책에 포함할 수 있는 작업이 나열되어 있습니다. 권한 부여 정책에 표의 작업 열에 있는 작업을 포함할 때는 필수 작업 열에 있는 해당 작업도 포함해야 합니다.

작업 설명 필수 작업 필수 리소스 서버리스 클러스터에 적용 가능
kafka-cluster:Connect 클러스터에 연결하고 인증할 수 있는 권한을 부여합니다. None cluster
kafka-cluster:DescribeCluster 클러스터의 다양한 측면을 설명할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DESCRIBE CLUSTER ACL과 동일합니다.

kafka-cluster:Connect

cluster
kafka-cluster:AlterCluster 클러스터의 다양한 측면을 변경할 수 있는 권한을 부여하며, 이는 Apache Kafka의 ALTER CLUSTER ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeCluster

cluster 아니요
kafka-cluster:DescribeClusterDynamicConfiguration 클러스터의 동적 구성을 설명할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DESCRIBE_CONFIGS CLUSTER ACL과 동일합니다.

kafka-cluster:Connect

cluster 아니요
kafka-cluster:AlterClusterDynamicConfiguration 클러스터의 동적 구성을 변경할 수 있는 권한을 부여하며, 이는 Apache Kafka의 ALTER_CONFIGS CLUSTER ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeClusterDynamicConfiguration

cluster 아니요
kafka-cluster:WriteDataIdempotently 클러스터에서 데이터를 멱등적으로 쓸 수 있는 권한을 부여하며, 이는 Apache Kafka의 IDEMPOTENT_WRITE CLUSTER ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:WriteData

cluster
kafka-cluster:CreateTopic 클러스터에 주제를 생성할 수 있는 권한을 부여하며, 이는 Apache Kafka의 CREATE CLUSTER/TOPIC ACL과 동일합니다.

kafka-cluster:Connect

주제
kafka-cluster:DescribeTopic 클러스터의 주제를 설명할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DESCRIBE TOPIC ACL과 동일합니다.

kafka-cluster:Connect

주제
kafka-cluster:AlterTopic 클러스터의 주제를 변경할 수 있는 권한을 부여하며, 이는 Apache Kafka의 ALTER TOPIC ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeTopic

주제
kafka-cluster:DeleteTopic 클러스터에서 주제를 삭제할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DELETE TOPIC ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeTopic

주제
kafka-cluster:DescribeTopicDynamicConfiguration 클러스터에서 주제의 동적 구성을 설명할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DESCRIBE_CONFIGS TOPIC ACL과 동일합니다.

kafka-cluster:Connect

주제
kafka-cluster:AlterTopicDynamicConfiguration 클러스터에서 주제의 동적 구성을 변경할 수 있는 권한을 부여하며, 이는 Apache Kafka의 ALTER_CONFIGS TOPIC ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

주제
kafka-cluster:ReadData 클러스터의 토픽에서 데이터를 읽을 수 있는 권한을 부여하며, 이는 Apache Kafka의 READ TOPIC ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:AlterGroup

주제
kafka-cluster:WriteData Apache Kafka의 WRITE TOPIC ACL에 해당하는 클러스터에서 주제에 데이터를 쓸 수 있는 권한을 부여합니다.

kafka-cluster:Connect

kafka-cluster:DescribeTopic

주제
kafka-cluster:DescribeGroup 클러스터에서 그룹을 설명할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DESCRIBE GROUP ACL과 동일합니다.

kafka-cluster:Connect

그룹
kafka-cluster:AlterGroup 클러스터의 그룹에 참여할 수 있는 권한을 부여하며, 이는 Apache Kafka의 READ GROUP ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeGroup

그룹
kafka-cluster:DeleteGroup 클러스터에서 그룹을 삭제할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DELETE GROUP ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeGroup

그룹
kafka-cluster:DescribeTransactionalId 클러스터에서 트랜잭션 ID를 설명할 수 있는 권한을 부여하며, 이는 Apache Kafka의 DESCRIBE TRANSACTIONAL_ID ACL과 동일합니다.

kafka-cluster:Connect

transactional-id
kafka-cluster:AlterTransactionalId 클러스터의 트랜잭션 ID를 변경할 수 있는 권한을 부여하며, 이는 Apache Kafka의 WRITE TRANSACTIONAL_ID ACL과 동일합니다.

kafka-cluster:Connect

kafka-cluster:DescribeTransactionalId

kafka-cluster:WriteData

transactional-id

콜론 뒤에 오는 작업에서 별표(*) 와일드카드를 여러 번 사용할 수 있습니다. 예를 들면 다음과 같습니다.

  • kafka-cluster:*Topickafka-cluster:CreateTopic, kafka-cluster:DescribeTopic, kafka-cluster:AlterTopic, kafka-cluster:DeleteTopic을 나타냅니다. kafka-cluster:DescribeTopicDynamicConfiguration 또는 kafka-cluster:AlterTopicDynamicConfiguration은 포함되지 않습니다.

  • kafka-cluster:*는 모든 권한을 나타냅니다.

리소스

다음 표에는 Amazon MSK를 위한 IAM 액세스 제어를 사용할 때 권한 부여 정책에 사용할 수 있는 4가지 유형의 리소스를 보여줍니다. DescribeClusterAPI 또는 AWS CLI describe-cluster 명령을 사용하여 AWS Management Console 또는 에서 클러스터 Amazon 리소스 이름 (ARN) 을 가져올 수 있습니다. 그런 다음 클러스터 ARN을 사용하여 주제, 그룹, 트랜잭션 ID ARN을 구성할 수 있습니다. 권한 부여 정책에서 리소스를 지정하려면 해당 리소스의 ARN을 사용합니다.

Resource ARN 형식
클러스터 arn:aws:kafka:region:account-id:cluster/cluster-name/cluster-uuid
주제 arn:aws:kafka:region:account-id:topic/cluster-name/cluster-uuid/topic-name
그룹 arn:aws:kafka:region:account-id:group/cluster-name/cluster-uuid/group-name
트랜잭션 ID arn:aws:kafka:region:account-id:transactional-id/cluster-name/cluster-uuid/transactional-id

별표(*) 와일드카드는 ARN의 :cluster/, :topic/, :group/, :transactional-id/ 뒤에 오는 부분 어디에서나 여러 번 사용할 수 있습니다. 다음은 별표(*) 와일드카드를 사용하여 여러 리소스를 참조하는 방법에 대한 몇 가지 예입니다.

  • arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/*: 클러스터의 UUID와 상관없이 모든 클러스터의 모든 주제 이름이 MyTestCluster 지정됩니다.

  • arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/*_test: 이름이 MyTestCluster '_test'이고 UUID가 abcd1234-0123-abcd-5678-1234abcd-1인 클러스터에서 이름이 “_test”로 끝나는 모든 주제.

  • arn:aws:kafka:us-east-1:0123456789012:transactional-id/MyTestCluster/*/5555abcd-1111-abcd-1234-abcd1234-1: 사용자 계정에 이름이 지정된 클러스터의 모든 구현에 대한 트랜잭션 ID가 5555abcd-1111-abcd-1234-1인 모든 트랜잭션 MyTestCluster 즉 MyTestCluster, 이름이 지정된 클러스터를 생성한 다음 삭제한 다음 같은 이름으로 다른 클러스터를 생성하면 이 리소스 ARN을 사용하여 두 클러스터에서 동일한 트랜잭션 ID를 표시할 수 있습니다. 그러나 삭제된 클러스터는 액세스할 수 없습니다.

일반 사용 사례

다음 표의 첫 번째 열에는 몇 가지 일반적인 사용 사례가 나와 있습니다. 클라이언트가 특정 사용 사례를 수행하도록 권한을 부여하려면 클라이언트의 권한 부여 정책에 해당 사용 사례에 필요한 작업을 포함하고 EffectAllow로 설정합니다.

Amazon MSK에 대한 IAM 액세스 제어의 일부인 모든 작업에 대한 자세한 내용은 작업 및 리소스의 의미 섹션을 참조하세요.

참고

기본적으로 작업이 거부됩니다. 클라이언트가 수행할 수 있도록 권한을 부여하려는 모든 작업을 명시적으로 허용해야 합니다.

사용 사례 필수 작업
관리자

kafka-cluster:*

주제 생성

kafka-cluster:Connect

kafka-cluster:CreateTopic

데이터 생산

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:WriteData

데이터 소비

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:DescribeGroup

kafka-cluster:AlterGroup

kafka-cluster:ReadData

멱등적으로 데이터 생산

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:WriteData

kafka-cluster:WriteDataIdempotently

트랜잭션 방식으로 데이터 생산

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:WriteData

kafka-cluster:DescribeTransactionalId

kafka-cluster:AlterTransactionalId

클러스터 구성 설명

kafka-cluster:Connect

kafka-cluster:DescribeClusterDynamicConfiguration

클러스터의 구성 업데이트

kafka-cluster:Connect

kafka-cluster:DescribeClusterDynamicConfiguration

kafka-cluster:AlterClusterDynamicConfiguration

주제 구성 설명

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

주제의 구성 업데이트

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

kafka-cluster:AlterTopicDynamicConfiguration

주제 변경

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:AlterTopic