IAM访问控制 - Amazon Managed Streaming for Apache Kafka

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

IAM访问控制

IAMAmazon 的访问控制MSK使您能够处理MSK集群的身份验证和授权。这样就不需要使用一种身份验证机制和另一种授权机制。例如,当客户端尝试写入您的集群时,Amazon 会MSK使用IAM来检查该客户端是否为经过身份验证的身份,以及它是否有权向您的集群生成。IAM访问控制适用于 Java 和非 Java 客户端,包括用 Python JavaScript、Go 和编写的 Kafka 客户端。 NET。

Amazon 会MSK记录访问事件,以便您可以对其进行审计。有关更多信息,请参阅 使用记录API通话 AWS CloudTrail

为了使IAM访问控制成为可能,亚马逊MSK对 Apache Kafka 源代码进行了细微的修改。这些修改不会给您的 Apache Kafka 体验造成明显的影响。

重要

IAM访问控制不适用于 Apache ZooKeeper 节点。有关如何控制对这些节点的访问权限的信息,请参阅 控制对 Apache 的访问权限 ZooKeeper

重要

如果您的集群使用IAM访问控制,allow.everyone.if.no.acl.foundApache Kafka 设置将不起作用。

重要

你可以ACLAPIs为使用IAM访问控制的MSK集群调用 Apache Kafka。但是,Apache Kafka 对角色的IAM授权ACLs没有影响。您必须使用IAM策略来控制IAM角色的访问权限。

Amazon IAM 访问控制MSK的工作原理

要使用 Amazon 的IAM访问控制MSK,请执行以下步骤,本节其余部分将详细介绍这些步骤。

创建使用IAM访问控制的集群

本节介绍如何使用 AWS Management Console API、或创建使用IAM访问控制的集群。 AWS CLI 有关如何为现有集群开启IAM访问控制的信息,请参阅更新集群的安全设置

使用创建使用IAM访问控制的集群 AWS Management Console
  1. 打开 Amazon MSK 控制台,网址为https://console.aws.amazon.com/msk/

  2. 选择创建集群

  3. 选择使用自定义设置创建集群

  4. 在 “身份验证” 部分,选择IAM访问控制

  5. 完成创建集群的其余工作流程。

使用API或创建使用IAM访问控制的集群 AWS CLI
  • 要创建启用了IAM访问控制的集群,请使用CreateClusterAPI或 create-c CLI luster 命令,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 文件中。Replace(替换) <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-authJAR文件,并将其放在类路径中。如果您使用 Maven,请添加以下依赖项,并根据需要调整版本号:

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

亚马逊MSK客户端插件是在 Apache 2.0 许可下开源的。

创建授权策略

将授权策略附加到与客户端对应的IAM角色。在授权策略中,您可以指定角色允许或拒绝哪些操作。如果您的客户端位于亚马逊EC2实例上,请将授权策略与该亚马逊EC2实例的IAM角色相关联。或者,您也可以将客户端配置为使用命名配置文件,然后将授权策略与该命名配置文件的角色关联。为客户端配置IAM访问控制 介绍如何将客户端配置为使用命名配置文件。

有关如何创建IAM策略的信息,请参阅创建IAM策略

以下是名为的集群的授权策略示例 MyTestCluster。要了解 ActionResource 元素的语义,请参阅 操作和资源的语义

重要

您对IAM策略所做的更改会 AWS CLI 立即反映在IAMAPIs和中。但是,策略更改可能需要很长时间才能生效。在大多数情况下,策略更改会在不到一分钟的时间内生效。网络状况有时可能会增加延迟时间。

{ "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权限已被弃用 (-679)。KIP默认情况下,设置了 enable.idempotence = true。因此,对于 Kafka 版本 2.8.0 及更高版本,IAM不提供与 Kafka 相同的功能。ACLs仅提供 WriteData 对某个主题的访问权限,无法 WriteDataIdempotently 到该主题。这不影响向ALL主题提供的情况。WriteData在这种情况下,允许 WriteDataIdempotently。这是由于IAM逻辑实现与 Kafka ACLs 的实现方式存在差异。

要解决这个问题,建议使用类似于以下示例的策略:

{ "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" ] } ] }

在这种情况下,WriteData 允许写入 TestTopic,而 WriteDataIdempotently 允许对集群进行幂等性写入。请务必注意,WriteDataIdempotently 是集群级别的权限。它不能在主题级别使用。如果 WriteDataIdempotently 仅限于主题级别,则此策略将不起作用。

获取用于IAM访问控制的引导程序代理

请参阅 获取 Amazon MSK 集群的引导程序代理

操作和资源的语义

本节介绍可在IAM授权策略中使用的操作和资源元素的语义。有关策略示例,请参阅创建授权策略

操作

下表列出了您在使用 Amazon IAM 访问控制时可以在授权策略中包含的操作MSK。当您在授权策略中包含表操作列中的操作时,还必须包含所需操作列中的相应操作。

操作 描述 所需的操作 所需的 资源 适用于无服务器集群
kafka-cluster:Connect 授予连接和验证集群的权限。 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 的 CREATECLUSTER/。TOPIC ACL

kafka-cluster:Connect

topic
kafka-cluster:DescribeTopic 授予描述集群上主题的权限,相当于 Apache Kafka 的权限。DESCRIBE TOPIC ACL

kafka-cluster:Connect

topic
kafka-cluster:AlterTopic 授予在集群上更改主题的权限,相当于 Apache Kafka 的权限。ALTER TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

topic
kafka-cluster:DeleteTopic 授予删除集群上主题的权限,相当于 Apache Kafka 的权限。DELETE TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

topic
kafka-cluster:DescribeTopicDynamicConfiguration 授予描述集群上主题动态配置的权限,相当于 Apache Kafka 的 DESCRIBE _。CONFIGS TOPIC ACL

kafka-cluster:Connect

topic
kafka-cluster:AlterTopicDynamicConfiguration 授予更改集群上主题动态配置的权限,相当于 Apache Kafka 的 ALTER _。CONFIGS TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopicDynamicConfiguration

topic
kafka-cluster:ReadData 授予从集群上主题中读取数据的权限,相当于 Apache Kafka 的权限。READ TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

kafka-cluster:AlterGroup

topic
kafka-cluster:WriteData 授予向集群上主题写入数据的权限,相当于 Apache Kafka 的权限 WRITE TOPIC ACL

kafka-cluster:Connect

kafka-cluster:DescribeTopic

topic
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 授予描述集群IDs上交易的权限,相当于 Apache Kafka 的 _ID。DESCRIBE TRANSACTIONAL ACL

kafka-cluster:Connect

transactional-id
kafka-cluster:AlterTransactionalId 授予修改集群IDs上交易的权限,相当于 Apache Kafka 的 _ID。WRITE TRANSACTIONAL ACL

kafka-cluster:Connect

kafka-cluster:DescribeTransactionalId

kafka-cluster:WriteData

transactional-id

在冒号之后的操作中,您可以任意次数地使用星号 (*) 通配符。示例如下。

  • kafka-cluster:*Topic 代表 kafka-cluster:CreateTopickafka-cluster:DescribeTopickafka-cluster:AlterTopickafka-cluster:DeleteTopic。它不包括 kafka-cluster:DescribeTopicDynamicConfigurationkafka-cluster:AlterTopicDynamicConfiguration

  • kafka-cluster:* 代表所有权限。

资源

下表显示了在使用 Amazon IAM 访问控制时,您可以在授权策略中使用的四种资源MSK。您可以使用或 d escribe- AWS CLI cluster ARN 命令从 AWS Management Console 或中获取集群 Amazon 资源名称 ()。DescribeClusterAPI然后,您可以使用集群ARN来构造主题、群组和交易 ID ARNs。要在授权策略中指定资源,请使用该资源ARN。

资源 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:交易身份/cluster-name/cluster-uuid/transactional-id

在、、和之后的:cluster/部分中,可以任意次数使用星号 (*) 通配符。ARN :topic/ :group/ :transactional-id/以下是如何使用星号 (*) 通配符引用多个资源的部分示例:

  • arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/*:任何名为的集群中的所有主题 MyTestCluster,无论该集群的主题如何UUID。

  • arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/*_test:集群中名称以 “_test” 结尾的所有主题,其名称为 abcd1234-0123-abcd-5678- MyTestCluster 1234abc UUID d-1。

  • arn:aws:kafka:us-east-1:0123456789012:transactional-id/MyTestCluster/*/5555abcd-1111-abcd-1234-abcd1234-1:所有交易 ID 为 5555abcd-1111-abcd-1234-abcd-1234-1 的交易,适用于您的账户中命名的集群的所有化身。 MyTestCluster 这意味着,如果您创建了一个名为 MyTestCluster的集群,然后将其删除,然后创建另一个同名的集群,则可以使用此资源ARN在两个集群上表示相同的交易 ID。但是,无法访问已删除的集群。

常见使用案例

下表中的第一列显示了一些常见用例。要授权客户端执行给定用例,请在客户端的授权策略中包含该用例所需的操作,并将 Effect 设置为 Allow

有关作为 Amazon IAM 访问控制一部分的所有操作的信息MSK,请参阅操作和资源的语义

注意

默认情况下,操作将被拒绝。您必须明确允许要授权客户端执行的每个操作。

应用场景 所需的操作
Admin

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