使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问 - Amazon Kinesis Data Streams

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

使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问

AWS Identity and Access Management (IAM) 使您能够执行以下操作:

  • 在您的 AWS 账户下创建用户和群组

  • 为您 AWS 账户下的每位用户分配唯一的安全证书

  • 控制每个用户使用 AWS 资源执行任务的权限

  • 允许其他 AWS 账户中的用户共享您的 AWS 资源

  • 为您的 AWS 账户创建角色并定义可以担任这些角色的用户或服务

  • 使用企业的现有身份授予使用 AWS 资源执行任务的权限

通过将 IAM 与 Kinesis Data Streams 配合使用,您可以控制组织中的用户能否使用特定的 Kinesis Data Streams API 操作执行任务,以及他们能否使用特定的 AWS 资源。

如果您使用 Kinesis 客户端库 (KCL) 开发应用程序,则您的策略必须包括亚马逊 DynamoDB 和亚马逊的权限; CloudWatchKCL 使用 DynamoDB 来跟踪应用程序的状态信息,并代表您向发送 KCL 指标。 CloudWatch CloudWatch有关 KCL 的更多信息,请参阅开发 KCL 1.x 消费端

有关 IAM 的更多信息,请参阅以下文档:

有关 IAM 和 AmazonDynamoDB 的更多信息,请参阅《Amazon DynamoDB 开发人员指南》中的使用 IAM 控制对 Amazon DynamoDB 资源的访问

有关 IAM 和 Amazon 的更多信息 CloudWatch,请参阅亚马逊用户指南中的控制 CloudWatch 用户对您 AWS 账户的访问权限

策略语法

IAM policy 是包含一个或多个语句的 JSON 文档。每个语句的结构如下:

{ "Statement":[{ "Effect":"effect", "Action":"action", "Resource":"arn", "Condition":{ "condition":{ "key":"value" } } } ] }

组成语句的各个元素如下:

  • Effect:effect 可以是 AllowDeny。在默认情况下,IAM 用户没有使用资源和 API 操作的许可,因此,所有请求均会被拒绝。显式允许将覆盖默认规则。显式拒绝将覆盖任何允许。

  • Actionaction 是对其授予或拒绝权限的特定 API 操作。

  • Resource:受操作影响的资源。要在语句中指定资源,您需要使用其Amazon 资源名称 (ARN)。

  • 条件:条件是可选的。它们可以用于控制策略生效的时间。

在创建和管理 IAM policy 时,您可能希望使用 IAM Policy 生成器IAM Policy Simulator

Kinesis Data Streams 的操作

在 IAM policy 语句中,您可以从支持 IAM 的任何服务中指定任何 API 操作。对于 Kinesis Data Streams,请使用以下前缀为 API 操作命名:kinesis:。例如:kinesis:CreateStreamkinesis:ListStreamskinesis:DescribeStreamSummary

要在单个语句中指定多项操作,请使用逗号将它们隔开,如下所示:

"Action": ["kinesis:action1", "kinesis:action2"]

您也可以使用通配符指定多项操作。例如,您可以指定名称以单词“Get”开头的所有操作,如下所示:

"Action": "kinesis:Get*"

要指定所有 Kinesis Data Streams 操作,请使用 * 通配符,如下所示:

"Action": "kinesis:*"

有关 Kinesis Data Streams API 操作的完整列表,请参阅 Amazon Kinesis API Reference

Kinesis Data Streams 的 Amazon 资源名称(ARN)

每个 IAM policy 语句适用于您使用资源的 ARN 指定的资源。

请对 Kinesis Data Streams 使用以下 ARN 资源格式:

arn:aws:kinesis:region:account-id:stream/stream-name

例如:

"Resource": arn:aws:kinesis:*:111122223333:stream/my-stream

Kinesis Data Streams 的示例策略

以下示例策略演示如何控制用户对您的 Kinesis Data Streams 的访问。

Example 1: Allow users to get data from a stream

此策略允许用户或组对特定流执行 DescribeStreamSummaryGetShardIteratorGetRecords 操作,对任何流执行 ListStreams 操作。此策略可应用于应该能够从特定流获取数据的用户。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesis:Get*", "kinesis:DescribeStreamSummary" ], "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] }, { "Effect": "Allow", "Action": [ "kinesis:ListStreams" ], "Resource": [ "*" ] } ] }
Example 2: Allow users to add data to any stream in the account

此策略允许用户或组对账户的任一流使用 PutRecord 操作。此策略可应用于应该能够向账户中的所有流添加数据记录的用户。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesis:PutRecord" ], "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/*" ] } ] }
Example 3: Allow any Kinesis Data Streams action on a specific stream

此策略允许用户或组对指定流使用任何 Kinesis Data Streams 操作。此策略可应用于应该对特定流有管理控制权限的用户。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:*", "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] } ] }
Example 4: Allow any Kinesis Data Streams action on any stream

此策略允许用户或组对账户中的任何流使用任何 Kinesis Data Streams 操作。由于此策略会授予对您的所有流的完全访问权限,您应该将其限制为仅对管理员可用。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:*", "Resource": [ "arn:aws:kinesis:*:111122223333:stream/*" ] } ] }

与其他账户共享您的数据流

基于资源的策略附加到您的数据流,以向其他账户、IAM 用户或 IAM 角色授予访问权限。基于资源的策略是附加到资源(例如数据流)的 JSON 策略文档。这些策略将向指定的主体授予对该资源执行特定操作的权限,并定义这在哪些条件下适用。一个策略可以有多个语句。您必须在基于资源的策略中指定主体。委托人可以包括账户、用户、角色、联合用户或 AWS 服务。您可通过 Kinesis Data Streams 控制台、API 或 SDK 配置策略。

请注意,要与已注册的使用者(例如增强型扇出功能)共享访问权限,则数据流 ARN 和使用者 ARN 都需要配置策略。

启用跨账户存取

要启用跨账户访问,您可以将整个账户或其他账户中的 IAM 实体指定为基于资源的策略中的主体。将跨账户主体添加到基于资源的策略只是建立信任关系工作的一半而已。当委托人和资源位于不同的 AWS 账户中时,您还必须使用基于身份的策略来授予委托人访问资源的权限。但是,如果基于资源的策略向同一个账户中的主体授予访问权限,则不需要额外的基于身份的策略。

有关将基于资源的策略用于跨账户存取的更多信息,请参阅 IAM 中的跨账户资源访问

数据流管理员可以使用 AWS Identity and Access Management 策略来指定谁有权访问什么。也就是说,哪个主体可以对什么资源执行操作,以及在什么条件下执行。JSON 策略的 Action 元素描述可用于在策略中允许或拒绝访问的操作。策略操作通常与关联的 AWS API 操作同名。

可以共享的 Kinesis Data Streams 操作:

操作 访问级别
DescribeStreamConsumer 消费端
DescribeStreamSummary 数据流
GetRecords 数据流
GetShardIterator 数据流
ListShards 数据流
PutRecord 数据流
PutRecords 数据流
SubscribeToShard 消费端

以下是使用基于资源的策略向您的数据流或注册使用者授予跨账户存取权限的示例。

要执行跨账户操作,您必须指定用于数据流访问的流 ARN,以及用于注册使用者访问的使用者 ARN。

Kinesis Data Streams 基于资源的策略示例

由于需要执行的操作,共享注册的使用者既涉及数据流策略,也涉及使用者策略。

注意

Principal 的示例有效值如下:

  • {"AWS": "123456789012"}

  • IAM 用户 - {"AWS": "arn:aws:iam::123456789012:user/user-name"}

  • IAM 角色 - {"AWS":["arn:aws:iam::123456789012:role/role-name"]}

  • 多个主体(可以是账户、用户、角色的组合)– {"AWS":["123456789012", "123456789013", "arn:aws:iam::123456789012:user/user-name"]}

Example 1: Write access to the data stream
{ "Version": "2012-10-17", "Id": "__default_write_policy_ID", "Statement": [ { "Sid": "writestatement", "Effect": "Allow", "Principal": { "AWS": "Account12345" }, "Action": [ "kinesis:DescribeStreamSummary", "kinesis:ListShards", "kinesis:PutRecord", "kinesis:PutRecords" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC" } ] }
Example 2: Read access to the data stream
{ "Version": "2012-10-17", "Id": "__default_sharedthroughput_read_policy_ID", "Statement": [ { "Sid": "sharedthroughputreadstatement", "Effect": "Allow", "Principal": { "AWS": "Account12345" }, "Action": [ "kinesis:DescribeStreamSummary", "kinesis:ListShards", "kinesis:GetRecords", "kinesis:GetShardIterator" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC" } ] }
Example 3: Share enhanced fan-out read access to a registered consumer

数据流策略语句:

{ "Version": "2012-10-17", "Id": "__default_sharedthroughput_read_policy_ID", "Statement": [ { "Sid": "consumerreadstatement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Account12345:role/role-name" }, "Action": [ "kinesis:DescribeStreamSummary", "kinesis:ListShards" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC" } ] }

使用者策略语句:

{ "Version": "2012-10-17", "Id": "__default_efo_read_policy_ID", "Statement": [ { "Sid": "eforeadstatement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Account12345:role/role-name" }, "Action": [ "kinesis:DescribeStreamConsumer", "kinesis:SubscribeToShard" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC/consumer/consumerDEF:1674696300" } ] }

为确保遵守最低权限原则,操作或主体字段不支持通配符(*)。

以编程方式管理数据流策略

除此之外 AWS Management Console,Kinesis Data Streams 还有三个 API 用于管理您的数据流策略:

PutResourePolicy 用于附加或覆盖数据流或使用者策略。GetResourcePolicy 用于检查和查看指定数据流或使用者的策略。DeleteResourcePolicy 用于删除指定数据流或使用者的策略。

策略限制

Kinesis Data Streams 资源策略有以下限制:

  • 为确保遵守最低权限原则,操作或主体部分不支持通配符(*)。

  • AWS 校长不支持服务校长,以防止副校长可能感到困惑

  • 不支持联合身份验证主体。

  • 不支持规范用户 ID。

  • 策略大小不能超过 20KB。

共享对加密数据的访问权限

如果您已使用 AWS 托管 KMS 密钥为数据流启用服务器端加密,并希望通过资源策略共享访问权限,则必须切换到使用客户托管密钥 (CMK)。有关更多信息,请参阅什么是 Kinesis Data Streams 的服务器端加密?。此外,您必须允许您的共享主体实体使用 KMS 跨账户共享功能来访问您的 CMK。此外还务必要对共享主体实体的 IAM policy 进行更改。有关更多信息,请参阅允许其他账户中的用户使用 KMS 密钥

将 AWS Lambda 函数配置为使用另一个账户从 Kinesis Data Streams 读取

有关如何配置 Lambda 函数以在其他账户中读取 Kinesis Data Streams 中的数据的示例,请参阅 使用跨账户 AWS Lambda 功能共享访问权限