

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

# Amazon Kinesis Data Streams 中的数据保护
<a name="server-side-encryption"></a>

使用 AWS Key Management Service (AWS KMS) 密钥进行服务器端加密，可以对 Amazon Kinesis Data Streams 中的静态数据进行加密，从而轻松满足严格的数据管理要求。

**注意**  
如果您在 AWS 通过命令行界面或 API 进行访问时需要经过 FIPS 140-2 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅[《美国联邦信息处理标准（FIPS）第 140-2 版》](https://aws.amazon.com/compliance/fips/)。

**Topics**
+ [什么是 Kinesis Data Streams 的服务器端加密？](what-is-sse.md)
+ [费用、区域和性能注意事项](costs-performance.md)
+ [如何开始使用服务器端加密？](getting-started-with-sse.md)
+ [创建和使用用户生成的 KMS 密钥](creating-using-sse-master-keys.md)
+ [使用用户生成的 KMS 密钥的权限](permissions-user-key-KMS.md)
+ [验证 KMS 密钥权限并排查相关问题](sse-troubleshooting.md)
+ [将 Amazon Kinesis Data Streams 与接口 VPC 端点搭配使用](vpc.md)

# 什么是 Kinesis Data Streams 的服务器端加密？
<a name="what-is-sse"></a>

服务器端加密是 Amazon Kinesis Data Streams 中的一项功能，它使用 AWS KMS 您指定的客户主密钥 (CMK) 在数据处于静止状态之前自动对其进行加密。数据在写入 Kinesis 流存储层之前加密，并在从存储检索到之后进行解密。因此，在 Kinesis Data Streams 服务中对数据进行静态加密。这样，您就可以满足严格的监管要求并增强您数据的安全性。

采用服务器端加密时，您的 Kinesis 流创建器和消费端不需要管理主密钥或加密操作。您的数据在进入和离开 Kinesis Data Streams 服务时会自动加密，因此您的静态数据会被加密。 AWS KMS 提供了服务器端加密功能使用的所有主密钥。 AWS KMS 便于使用 AWS由管理的 Kinesis 的 CMK、 AWS KMS 用户指定的 CMK 或导入到服务中的主密钥。 AWS KMS 

**注意**  
服务器端加密仅在启用加密后加密传入数据。启用服务器端加密后，未加密流中预先存在的数据不会加密。

在加密您的数据流并与其他委托人共享访问权限时，您必须在密钥策略和外部账户的 IAM 策略中授予权限。 AWS KMS 有关更多信息，请参阅[允许其他账户中的用户使用 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

如果您已使用 AWS 托管 KMS 密钥为数据流启用服务器端加密，并希望通过资源策略共享访问权限，则必须切换到使用客户托管密钥 (CMK)，如下所示：

![\[Encryption settings interface with options for server-side encryption and customer-managed CMK.\]](http://docs.aws.amazon.com/zh_cn/streams/latest/dev/images/cmk2.png)


此外，您必须允许您的共享主体实体使用 KMS 跨账户共享功能来访问您的 CMK。此外还务必要对共享主体实体的 IAM policy 进行更改。有关更多信息，请参阅[允许其他账户中的用户使用 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

# 费用、区域和性能注意事项
<a name="costs-performance"></a>

应用服务器端加密时，您需要支付 AWS KMS API 使用量和密钥费用。与自定义 KMS 主密钥不同，`(Default) aws/kinesis` 客户主密钥 (CMK) 是免费提供的。但是，您仍必须支付因您产生的 Amazon Kinesis Data Streams API 使用费。

API 使用费适用于所有 CMK，包括自定义的 CMK。在 Kinesis Data Streams 轮换数据密钥时，大约每五分钟调用一次 AWS KMS 。在 30 天内，由 Kinesis 直播发起的 AWS KMS API 调用的总费用应少于几美元。此费用会随着您在数据创建者和使用者身上使用的用户凭证数量而变化，因为每个用户凭证都需要唯一的 API 调用。 AWS KMS当您使用 IAM 角色进行身份验证时，每个代入角色调用都会产生唯一的用户凭据。为了节约 KMS 成本，您可能想要缓存代入角色调用返回的用户凭据。

下面按资源介绍各项费用：

**键**
+  AWS 由（别名 `aws/kinesis` =）管理的 Kinesis 用户主密钥是免费的。
+ 用户生成的 KMS 密钥需要收取 KMS 密钥费用。有关更多信息，请参阅 [AWS Key Management Service Pricing](https://aws.amazon.com/kms/pricing/#Keys)。

API 使用费适用于所有 CMK，包括自定义的 CMK。在 Kinesis Data Streams 轮换数据密钥时，大约每 5 分钟调用一次 KMS。以 30 天为一个月，由 Kinesis 数据流启动的 KMS API 调用的总费用应该不到几美元。请注意，此费用会随着您在数据创建者和使用者上使用的用户凭证数量而变化，因为每个用户凭证都需要对 AWS KMS 进行唯一的 API 调用。当您使用 IAM 角色进行身份验证时，每个角色都 assume-role-call将生成唯一的用户证书，您可能需要缓存返回的用户证书 assume-role-call以节省 KMS 成本。

## KMS API 使用量
<a name="api-usage"></a>

对于每个加密流，当从 TIP 读取数据并在读取者和写入者之间使用单个 IAM account/user 访问密钥时，Kinesis AWS KMS 服务大约每 5 分钟调用该服务 12 次。不从 TIP 读取数据可能会导致更多的 AWS KMS 服务呼叫。生成新数据加密密钥的 API 请求需支付 AWS KMS 使用费用。有关更多信息，请参阅 [AWS Key Management Service Pricing: Usage](https://aws.amazon.com/kms/pricing/#Usage)。

## 按区域的服务器端加密的可用性
<a name="sse-regions"></a>

目前，Kinesis 数据流 AWS GovCloud 的服务器端加密功能已在 Kinesis Data Streams 支持的所有区域（包括（美国西部）和中国区域）中提供。有关 Kinesis Data Streams 支持的区域的更多信息，[https://docs.aws.amazon.com/general/latest/gr/ak请参阅](https://docs.aws.amazon.com/general/latest/gr/ak.html) .html。

## 性能注意事项
<a name="performance-considerations"></a>

由于应用加密存在服务开销，应用服务器端加密的开销会将 `PutRecord`、`PutRecords` 和 `GetRecords` 的典型延迟增加不到 100 微秒。

# 如何开始使用服务器端加密？
<a name="getting-started-with-sse"></a>

开始使用服务器端加密的最简单方法是使用 AWS 管理控制台 和 Amazon Kinesis KMS 服务密钥。`aws/kinesis`

下面的过程演示了如何为 Kinesis 流启用服务器端加密。

**为 Kinesis 流启用服务器端加密**

1. 登录 AWS 管理控制台 并打开 [Amazon Kinesis Data Streams](https://console.aws.amazon.com/kinesis/home?region=us-east-1#/streams/list) 控制台。

1. 在 AWS 管理控制台中创建或选择 Kinesis 流。

1. 选择 **Details (详细信息)** 选项卡。

1. 在 **Server-side encryption (服务器端加密)** 中，选择 **edit (编辑)**。

1. 除非您希望使用用户生成的 KMS 主密钥，否则应确保选中 **(Default) aws/kinesis ((默认) aws/kinesis)** KMS 主密钥。这是 Kinesis 服务生成的 KMS 主密钥。选择**启用**，然后选择**保存**。
**注意**  
默认的 Kinesis 服务主密钥是免费的，但是，Kinesis 对该 AWS KMS 服务进行的 API 调用需要支付 KMS 使用成本。

1. 流结束**挂起**状态。一旦该流恢复到**活动**状态并启用加密，对于所有写入该流的传入数据，都将使用您选择的 KMS 主密钥进行加密。

1. **要禁用服务器端加密，请在中的**服务器端加密**中选择**禁用** AWS 管理控制台，然后选择保存。**

# 创建和使用用户生成的 KMS 密钥
<a name="creating-using-sse-master-keys"></a>

本部分介绍如何创建和使用您自己的 KMS 密钥，而不是使用 Amazon Kinesis 管理的主密钥。

## 创建用户生成的 KMS 密钥
<a name="creating-sse-master-keys"></a>

有关创建您自己的密钥的说明，请参阅《AWS Key Management Service Developer Guide》**中的 [Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。在您为自己的账户创建密钥后，Kinesis Data Streams 服务会在 **KMS 主密钥**列表中返回这些密钥。

## 使用用户生成的 KMS 密钥
<a name="using-sse-master-keys"></a>

向您的消费者、生产者和管理员应用正确的权限后，您可以在自己的 AWS 账户或其他 AWS 账户中使用自定义 KMS 密钥。在 **中的 **KMS Master Key AWS 管理控制台列表内显示您账户中的所有 KMS 主密钥。

要使用位于另一个账户中的自定义 KMS 主密钥，您需要有使用这些密钥的权限。您还必须在 AWS 管理控制台的 ARN 输入框中指定 KMS 主密钥的 ARN。

# 使用用户生成的 KMS 密钥的权限
<a name="permissions-user-key-KMS"></a>

在将服务器端加密与用户生成的 KMS 密钥配合使用之前，必须配置 AWS KMS 密钥策略以允许对流进行加密以及对流记录进行加密和解密。有关 AWS KMS 权限的示例和更多信息，请参阅 [AWS KMS API 权限：操作和资源参考](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。

**注意**  
使用默认服务密钥进行加密不需要应用自定义 IAM 权限。

在您使用用户生成的 KMS 主密钥之前，请确保您的 Kinesis 流创建器和消费端（IAM 主体）是 KMS 主密钥政策中的用户。否则，与流相关的读写操作会失败，这可能最终导致数据丢失、处理延迟或应用程序挂起。您可以使用 IAM policy 来管理 KMS 密钥的权限。有关更多信息，请参阅在 [AWS KMS 中使用 IAM 策略](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)。

## Kinesis Data Streams 加密上下文
<a name="sse-kms-encryption-context"></a>

当 Amazon Kinesis Data Streams 代表您 AWS KMS 调用时，它会将加密上下文传递 AWS KMS 给该上下文，该上下文可用作密钥策略和授权中的授权条件。Kinesis Data Streams 在所有调用中都使用流 ARN 作为加密上下文。 AWS KMS 

```
"encryptionContext": {
    "aws:kinesis:arn": "arn:aws:kinesis:region:account-id:stream/stream-name"
}
```

您可以使用加密上下文来识别审核记录和日志中您的 KMS 密钥的使用情况。它还以纯文本形式出现在日志中，例如。 AWS CloudTrail

要将您的 KMS 密钥的使用限制为从 Kinesis Data Streams 发出的针对特定流的请求，请使用 `kms:EncryptionContext:aws:kinesis:arn` KMS 密钥策略或 IAM 策略中的条件密钥。

## 产生器权限示例
<a name="example-producer-permissions"></a>

您的 Kinesis 流创建器必须拥有 `kms:GenerateDataKey` 权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "kms:GenerateDataKey"
        ],
        "Resource": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    {
        "Effect": "Allow",
        "Action": [
            "kinesis:PutRecord",
            "kinesis:PutRecords"
        ],
        "Resource": "arn:aws:kinesis:*:123456789012:MyStream"
    }
  ]
}
```

------

## 消费端权限示例
<a name="example-consumer-permissions"></a>

您的 Kinesis 流消费端必须拥有 `kms:Decrypt` 权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "kms:Decrypt"
        ],
        "Resource": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    {
        "Effect": "Allow",
        "Action": [
            "kinesis:GetRecords",
            "kinesis:DescribeStream"
        ],
        "Resource": "arn:aws:kinesis:*:123456789012:MyStream"
    }
  ]
}
```

------

适用于 Apache Flink 的亚马逊托管服务，并 AWS Lambda 使用角色来消费 Kinesis 直播。确保将 `kms:Decrypt` 权限添加到这些消费端使用的角色。

## 流管理员权限
<a name="stream-administrator-permissions"></a>

Kinesis 流管理员必须有权调用 `kms:List*` 和 ```kms:DescribeKey*`。

# 验证 KMS 密钥权限并排查相关问题
<a name="sse-troubleshooting"></a>

在 Kinesis 直播上启用加密后，我们建议您使用以下亚马逊 CloudWatch 指标监控`putRecord``putRecords`、和`getRecords`调用的成功情况：
+  `PutRecord.Success` 
+  `PutRecords.Success` 
+  `GetRecords.Success` 

有关更多信息，请参阅 [监控 Kinesis Data Streams](monitoring.md)。

# 将 Amazon Kinesis Data Streams 与接口 VPC 端点搭配使用
<a name="vpc"></a>

您可以使用接口 VPC 端点，以防止 Amazon VPC 和 Kinesis Data Streams 之间的流量离开亚马逊网络。接口 VPC 终端节点不需要互联网网关、NAT 设备、VPN 连接或 Direct Connect 连接。接口 VPC 终端节点由一项 AWS 技术提供支持 AWS PrivateLink，该技术允许使用弹性网络接口在 AWS 服务之间进行私密通信，并使用您的 Amazon VPC IPs 中的私有接口。有关更多信息，请参阅[亚马逊 Virtual Private Cloud](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Introduction.html) 和[接口 VPC 终端节点 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

**Topics**
+ [使用 Kinesis Data Streams 的接口 VPC 端点](#using-interface-vpc-endpoints)
+ [控制对 Kinesis Data Streams 的 VPC 端点的访问](#interface-vpc-endpoints-policies)
+ [Kinesis Data Streams 的 VPC 端点策略的可用性](#availability)

## 使用 Kinesis Data Streams 的接口 VPC 端点
<a name="using-interface-vpc-endpoints"></a>

要开始使用，您不需要更改流、产生器或用户的设置。为 Kinesis Data Streams 创建一个接口 VPC 端点，以便进出您的 Amazon VPC 资源的流量流过接口 VPC 端点。启用 FIPS 的接口 VPC 端点适用于美国区域。有关更多信息，请参阅[创建接口端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

亚马逊 Kinesis 生产者库 (KPL) 和 Kinesis 消费者库 (KCL) 使用公共终端节点或私有接口 VPC 终端节点（以使用者为准）调用 AWS 亚马逊和亚马逊 CloudWatch DynamoDB 等服务。例如，如果您的 KCL 应用程序在带有启用了 VPC 端点的 DynamoDB 接口的 VPC 中运行，则 DynamoDB 和您的 KCL 应用程序之间的调用会流经接口 VPC 端点。

## 控制对 Kinesis Data Streams 的 VPC 端点的访问
<a name="interface-vpc-endpoints-policies"></a>

借助 VPC 端点策略，您可以控制访问，方式是：将策略附加到 VPC 端点或使用附加到 IAM 用户、组或角色的策略中的额外字段，从而限制只能通过特定 VPC 端点进行访问。当与 IAM 策略共同使用以便仅授予通过指定 VPC 端点访问 Kinesis 数据流操作的权限时，这些策略可用于将对特定流的访问限制到指定 VPC 端点。

以下是用于访问 Kinesis 数据流的示例端点策略。
+ **VPC 策略示例：只读访问** – 此示例策略可以附加到 VPC 端点。（有关更多信息，请参阅[控制对 Amazon VPC 资源的访问](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_IAM.html)）。它限制仅能通过其附加的 VPC 端点列出或描述 Kinesis 数据流。

  ```
  {
    "Statement": [
      {
        "Sid": "ReadOnly",
        "Principal": "*",
        "Action": [
          "kinesis:List*",
          "kinesis:Describe*"
        ],
        "Effect": "Allow",
        "Resource": "*"
      }
    ]
  }
  ```
+ **VPC 策略示例：限制对特定 Kinesis 数据流的访问** – 此示例策略可以附加到 VPC 端点。它限制通过其附加的 VPC 端点访问特定的数据流。

  ```
  {
    "Statement": [
      {
        "Sid": "AccessToSpecificDataStream",
        "Principal": "*",
        "Action": "kinesis:*",
        "Effect": "Allow",
        "Resource": "arn:aws:kinesis:us-east-1:123456789012:stream/MyStream"
      }
    ]
  }
  ```
+ **IAM 策略示例：限制只能通过特定的 VPC 端点访问特定流** – 此示例策略可以附加到 IAM 用户、角色或组。它限制只能通过特定的 VPC 端点访问特定的 Kinesis 数据流。

------
#### [ JSON ]

****  

  ```
  {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
        {
           "Sid": "AccessFromSpecificEndpoint",
           "Action": "kinesis:*",
           "Effect": "Deny",
           "Resource": "arn:aws:kinesis:us-east-1:123456789012:stream/MyStream",
           "Condition": { "StringNotEquals" : { "aws:sourceVpce": "vpce-11aa22bb" } }
        }
     ]
  }
  ```

------

## Kinesis Data Streams 的 VPC 端点策略的可用性
<a name="availability"></a>

以下区域支持带有策略的 Kinesis Data Streams 接口 VPC 端点：
+ 欧洲地区（巴黎）
+ 欧洲地区（爱尔兰）
+ 美国东部（弗吉尼亚州北部）
+ 欧洲地区（斯德哥尔摩）
+ 美国东部（俄亥俄州）
+ 欧洲地区（法兰克福）
+ 南美洲（圣保罗）
+ 欧洲地区（伦敦）
+ 亚太地区（东京）
+ 美国西部（北加利福尼亚）
+ 亚太地区（新加坡）
+ 亚太地区（悉尼）
+ 中国（北京）
+ 中国（宁夏）
+ 亚太地区（香港）
+ 中东（巴林）
+ 中东（阿联酋）：
+ 欧洲地区（米兰）
+ 非洲（开普敦）
+ 亚太地区（孟买）
+ 亚太地区（首尔）
+ 加拿大（中部）
+ 美国西部（俄勒冈州）（usw2-az4 除外）
+ AWS GovCloud （美国东部）
+ AWS GovCloud （美国西部）
+ 亚太地区（大阪）
+ 欧洲（苏黎世）
+ 亚太地区（海得拉巴）