

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

# 使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问
<a name="controlling-access"></a>

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 消费端](developing-consumers-with-kcl.md)。

有关 IAM 的更多信息，请参阅以下文档：
+ [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/)
+ [IAM 入门](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started.html)
+ [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)

有关 IAM 和 AmazonDynamoDB 的更多信息，请参阅《Amazon DynamoDB 开发人员指南》**中的[使用 IAM 控制对 Amazon DynamoDB 资源的访问](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html)。

有关 IAM 和 Amazon 的更多信息 CloudWatch，请参阅*亚马逊用户指南中的控制 CloudWatch 用户*[对您 AWS 账户的访问权限](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/UsingIAM.html)。

**Topics**
+ [策略语法](#policy-syntax)
+ [Kinesis Data Streams 的操作](#kinesis-using-iam-actions)
+ [Kinesis Data Streams 的亚马逊资源名称 (ARNs)](#kinesis-using-iam-arn-format)
+ [Kinesis Data Streams 的示例策略](#kinesis-using-iam-examples)
+ [与其他账户共享您的数据流](#sharing-data-streams)
+ [将 AWS Lambda 函数配置为使用另一个账户从 Kinesis Data Streams 读取](#sharing-data-streams-example)
+ [使用基于资源的策略共享访问权限](resource-based-policy-examples.md)

## 策略语法
<a name="policy-syntax"></a>

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

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

组成语句的各个元素如下：
+ **Effect：**此 *effect* 可以是 `Allow` 或 `Deny`。在默认情况下，IAM 用户没有使用资源和 API 操作的许可，因此，所有请求均会被拒绝。显式允许将覆盖默认规则。显式拒绝将覆盖任何允许。
+ **Action**：*action* 是对其授予或拒绝权限的特定 API 操作。
+ **Resource**：受操作影响的资源。要在语句中指定资源，您需要使用其 Amazon 资源名称（ARN）。
+ **条件**：条件是可选的。它们可以用于控制策略生效的时间。

在创建和管理 IAM policy 时，您可能希望使用 [IAM Policy 生成器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-generator)和 [IAM Policy Simulator](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html)。

## Kinesis Data Streams 的操作
<a name="kinesis-using-iam-actions"></a>

在 IAM 策略语句中，您可以从支持 IAM 的任何服务中指定任何 API 操作。对于 Kinesis Data Streams，请使用以下前缀为 API 操作命名：`kinesis:`。例如：`kinesis:CreateStream`、`kinesis:ListStreams` 和 `kinesis:DescribeStreamSummary`。

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

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

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

```
"Action": "kinesis:Get*"
```

要指定所有 Kinesis Data Streams 操作，请使用 \$1 通配符，如下所示：

```
"Action": "kinesis:*"
```

有关 Kinesis Data Streams API 操作的完整列表，请参阅 [Amazon Kinesis API Reference](https://docs.aws.amazon.com/kinesis/latest/APIReference/)。

## Kinesis Data Streams 的亚马逊资源名称 (ARNs)
<a name="kinesis-using-iam-arn-format"></a>

每个 IAM 政策声明都适用于您使用其指定的资源 ARNs。

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

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

例如：

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

## Kinesis Data Streams 的示例策略
<a name="kinesis-using-iam-examples"></a>

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

------
#### [ Example 1: Allow users to get data from a stream ]

**Example**  
 此策略允许用户或组对特定流执行 `DescribeStreamSummary`、`GetShardIterator` 和 `GetRecords` 操作，对任何流执行 `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 ]

**Example**  
此策略允许用户或组对账户的任一流使用 `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 ]

**Example**  
此策略允许用户或组对指定流使用任何 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 ]

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

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

------

## 与其他账户共享您的数据流
<a name="sharing-data-streams"></a>

**注意**  
 Kinesis Producer Library 目前不支持在写入数据流时指定流 ARN。如果您想写入跨账户数据流，请使用 AWS SDK。

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

请注意，要与已注册的使用者（例如[增强型扇出功能](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html)）共享访问权限，则数据流 ARN 和使用者 ARN 都需要配置策略。

### 启用跨账户访问
<a name="sharing-data-streams-enabling"></a>

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

有关将基于资源的策略用于跨账户存取的更多信息，请参阅 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

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

可以共享的 Kinesis Data Streams 操作：


| Action | 访问级别 | 
| --- | --- | 
| [DescribeStreamConsumer](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStreamConsumer.html) | 使用者 | 
| [DescribeStreamSummary](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStreamSummary.html) | 数据流 | 
| [GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html) | 数据流 | 
| [GetShardIterator](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html) | 数据流 | 
| [ListShards](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListShards.html) | 数据流 | 
| [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html) | 数据流 | 
| [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html) | 数据流 | 
| [SubscribeToShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_SubscribeToShard.html) | 使用者 | 

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

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

### Kinesis Data Streams 基于资源的策略示例
<a name="kinesis-stream-sharing-iam-examples"></a>

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

**注意**  
`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 ]

**Example**    
****  

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

**Example**    
****  

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

**Example**  
数据流策略语句：    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "__default_sharedthroughput_read_policy_ID",
    "Statement": [
        {
            "Sid": "consumerreadstatement",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333: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::111122223333:role/role-name"
            },
            "Action": [
                "kinesis:DescribeStreamConsumer",
                "kinesis:SubscribeToShard"
            ],
            "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC/consumer/consumerDEF:1674696300"
        }
    ]
}
```
为确保遵守最低权限原则，操作或主体字段不支持通配符（\$1）。

------

### 以编程方式管理数据流策略
<a name="sharing-data-streams-managing-policy"></a>

除此之外 AWS 管理控制台，Kinesis Data Streams 还有三个 API 用于管理您的数据流策略：
+ [PutResourcePolicy](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutResourcePolicy.html)
+ [GetResourcePolicy](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetResourcePolicy.html)
+ [DeleteResourcePolicy](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DeleteResourcePolicy.html)

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

### 策略限制
<a name="sharing-data-streams-validating"></a>

Kinesis Data Streams 资源策略有以下限制：
+ 不支持通配符 (\$1)，以防通过直接附加到数据流或注册消费端的资源策略授予广泛访问权限。此外，还要仔细检查以下策略，来确认它们不会授予广泛访问权限：
  + 附加到关联 AWS 委托人（例如，IAM 角色）的基于身份的策略
  + 附加到关联资源的基于 AWS 资源的策略（例如 AWS Key Management Service KMS 密钥）
+ AWS 校长不支持服务校长，以防止副校长可能[感到困惑](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。
+ 不支持联合身份验证主体。
+ 不支持规范 IDs 用户。
+ 策略大小不能超过 20KB。

### 共享对加密数据的访问权限
<a name="sharing-access-to-encrypted-data-1"></a>

如果您已使用 AWS 托管 KMS 密钥为数据流启用服务器端加密，并希望通过资源策略共享访问权限，则必须切换到使用客户托管密钥 (CMK)。有关更多信息，请参阅 [什么是 Kinesis Data Streams 的服务器端加密？](what-is-sse.md)。此外，您必须允许您的共享主体实体使用 KMS 跨账户共享功能来访问您的 CMK。此外还务必要对共享主体实体的 IAM policy 进行更改。有关更多信息，请参阅[允许其他账户中的用户使用 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

## 将 AWS Lambda 函数配置为使用另一个账户从 Kinesis Data Streams 读取
<a name="sharing-data-streams-example"></a>

有关如何配置 Lambda 函数以在其他账户中读取 Kinesis Data Streams 中的数据的示例，请参阅 [使用跨账户 AWS Lambda 功能共享访问权限](resource-based-policy-examples.md#Resource-based-policy-examples-lambda)。

# 使用基于资源的策略共享访问权限
<a name="resource-based-policy-examples"></a>

**注意**  
更新现有基于资源的策略意味着替换现有策略，因此新策略中务必要包含所有必要的信息。

## 使用跨账户 AWS Lambda 功能共享访问权限
<a name="Resource-based-policy-examples-lambda"></a>

**Lambda 运算符**

1. 前往 [IAM 控制台](https://console.aws.amazon.com/iam/)创建一个 IAM 角色，该角色将用作您的 AWS Lambda 函数的 [Lambda 执行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。添加具有所需的 Kinesis Data Streams 和 Lambda 调用权限的托管 IAM 策略 `AWSLambdaKinesisExecutionRole`。此策略还将授予对您可能有权访问的所有潜在 Kinesis Data Streams 资源的访问权限。

1. 在[AWS Lambda 控制台](https://console.aws.amazon.com/lambda/home)中，创建一个 AWS Lambda 函数[来处理 Kinesis Data Streams 数据流中的记录](https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html)，并在设置执行角色的过程中，选择您在上一步中创建的角色。

1. 向 Kinesis Data Streams 资源所有者提供执行角色，以用来配置资源策略。

1. 完成 Lambda 函数设置。

**Kinesis Data Streams 资源所有者**

1. 获取将调用该 Lambda 函数的跨账户 Lambda 执行角色。

1. 在 Amazon Kinesis Data Streams 控制台上，选择该数据流。选择**数据流共享**选项卡，然后选择**创建共享策略**按钮以启动直观的策略编辑器。要共享数据流中的注册使用者，请选择该使用者，然后选择**创建共享策略**。您也可以直接编写 JSON 策略。

1. 将跨账户 Lambda 执行角色指定为主体，并指定您要共享访问权限的具体 Kinesis Data Streams 操作。务必要包括 `kinesis:DescribeStream` 操作。有关 Kinesis Data Streams 资源策略示例的更多信息，请参阅 [Kinesis Data Streams 基于资源的策略示例](controlling-access.md#kinesis-stream-sharing-iam-examples)。

1. 选择**创建策略**或使用将策略附加[PutResourcePolicy](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutResourcePolicy.html)到您的资源。

## 与跨账户 KCL 消费端共享访问权限
<a name="Resource-based-policy-examples-kcl-consumers"></a>
+ 如果您使用的是 KCL 1.x，请务必使用 KCL 1.15.0 或更高版本。
+ 如果您使用的是 KCL 2.x，请务必使用 KCL 2.5.3 或更高版本。

**KCL 运算符**

1. 向资源所有者提供将运行 KCL 应用程序的 IAM 用户或 IAM 角色。

1. 要求资源所有者提供数据流或使用者 ARN。

1. KCL 配置中务必要指定所提供的流 ARN。
   + 对于 KCL 1.x：使用[KinesisClientLibConfiguration](https://github.com/awslabs/amazon-kinesis-client/blob/v1.x/src/main/java/com/amazonaws/services/kinesis/clientlibrary/lib/worker/KinesisClientLibConfiguration.java#L738-L821)构造函数并提供流 ARN。
   + 对于 KCL 2.x：你可以只提供直播 ARN 或向 Kinesis 客户端库提供直播 [StreamTracker](https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/processor/StreamTracker.java)ARN。[ConfigsBuilder](https://github.com/awslabs/amazon-kinesis-client/blob/master/amazon-kinesis-client/src/main/java/software/amazon/kinesis/common/ConfigsBuilder.java#L155-L176)对于 StreamTracker，请提供库生成的 DynamoDB 租赁表中的流 ARN 和创建 Epoch。如果您想从共享注册消费者（如增强型扇出）那里读取数据，请使用 StreamTracker 并提供消费者 ARN。

**Kinesis Data Streams 资源所有者**

1. 获取将运行 KCL 应用程序的跨账户 IAM 用户或 IAM 角色。

1. 在 Amazon Kinesis Data Streams 控制台上，选择该数据流。选择**数据流共享**选项卡，然后选择**创建共享策略**按钮以启动直观的策略编辑器。要共享数据流中的注册使用者，请选择该使用者，然后选择**创建共享策略**。您也可以直接编写 JSON 策略。

1. 将跨账户 KCL 应用程序的 IAM 用户或 IAM 角色指定为主体，并指定您要共享访问权限的具体 Kinesis Data Streams 操作。有关 Kinesis Data Streams 资源策略示例的更多信息，请参阅 [Kinesis Data Streams 基于资源的策略示例](controlling-access.md#kinesis-stream-sharing-iam-examples)。

1. 选择**创建策略**或使用将策略附加[PutResourcePolicy](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutResourcePolicy.html)到您的资源。

## 共享对加密数据的访问权限
<a name="sharing-access-to-encrypted-data"></a>

如果您已使用 AWS 托管 KMS 密钥为数据流启用服务器端加密，并希望通过资源策略共享访问权限，则必须切换到使用客户托管密钥 (CMK)。有关更多信息，请参阅 [什么是 Kinesis Data Streams 的服务器端加密？](what-is-sse.md)。此外，您必须允许您的共享主体实体使用 KMS 跨账户共享功能来访问您的 CMK。此外还务必要对共享主体实体的 IAM policy 进行更改。有关更多信息，请参阅[允许其他账户中的用户使用 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。