

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

# 亚马逊 EMR 的使用方式 Amazon KMS
<a name="services-emr"></a>

当您使用 [Amazon EMR](https://www.amazonaws.cn/emr/) 集群时，您可以将集群配置为*静态*加密数据，然后将其保存到持久性存储位置。您可以在 EMR 文件系统 (EMRFS) 上、在群集节点的存储卷上，或同时在这两者上对静态数据进行加密。要加密静态数据，您可以使用 Amazon KMS key。以下主题介绍 Amazon EMR 集群如何使用 KMS 密钥来加密静态数据。

**重要**  
Amazon EMR 仅支持[对称 KMS 密钥](symm-asymm-choose-key-spec.md#symmetric-cmks)。不能使用[非对称 KMS 密钥](symmetric-asymmetric.md)来加密 Amazon EMR 集群中的静态数据。要获取确定 KMS 密钥是对称还是非对称的帮助，请参阅 [识别不同的密钥类型](identify-key-types.md)。

Amazon EMR 集群也可以加密*传输中*的数据，这意味着集群会先加密数据，然后将其通过网络发送。您不能使用 KMS 密钥加密传输中的数据。有关更多信息，请参阅 *Amazon EMR 管理指南*中的[传输中的数据加密](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-data-encryption-options.html#emr-encryption-intransit)。

有关 Amazon EMR 中所有可用加密选项的更多信息，请参阅 *Amazon EMR 管理指南*中的[加密选项](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-data-encryption-options.html)。

**Topics**
+ [

## 在 EMR 文件系统 (EMRFS) 上加密数据
](#emrfs-encryption)
+ [

## 在集群节点的存储卷上加密数据
](#emr-local-disk-encryption)
+ [

## 加密上下文
](#emr-encryption-context)

## 在 EMR 文件系统 (EMRFS) 上加密数据
<a name="emrfs-encryption"></a>

Amazon EMR 集群使用两个分布式文件系统：
+ Hadoop Distributed File System（HDFS）。HDFS 加密不会使用 Amazon KMS中的 KMS 密钥。
+ EMR 文件系统 (EMRFS)。EMRFS 是一种 HDFS 实施，使 Amazon EMR 集群能够在 Amazon Simple Storage Service (Amazon S3) 中存储数据。EMRFS 支持四种加密选项，其中两种会使用 Amazon KMS中的 KMS 密钥。有关全部四种 EMRFS 加密选项的更多信息，请参阅 *Amazon EMR 管理指南*中的[加密选项](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-data-encryption-options.html)。

使用 KMS 密钥的两个 EMRFS 加密选项使用 Amazon S3 提供的以下加密功能：
+ [使用服务器端加密 Amazon Key Management Service (SSE-KMS) 保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingKMSEncryption.html)。Amazon EMR 集群会将数据发送到 Amazon S3。Amazon S3 使用 KMS 密钥加密数据，然后将其保存到 S3 存储桶。有关其工作方式的更多信息，请参阅[使用 SSE-KMS 在 EMRFS 上加密数据的过程](#emrfs-encryption-sse-kms)。
+ [使用客户端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingClientSideEncryption.html) (CSE-KMS)。Amazon EMR 中的数据通过 Amazon KMS key 进行加密，然后发送到 Amazon S3 进行存储。有关其工作方式的更多信息，请参阅[使用 CSE-KMS 在 EMRFS 上加密数据的过程](#emrfs-encryption-cse-kms)。

当您将 Amazon EMR 集群配置为使用 KMS 密钥在 EMRFS 上加密数据时，请选择您希望 Amazon S3 或 Amazon EMR 集群使用的 KMS 密钥。借助 SSE-KMS，您可以为 Amazon S3 选择 Amazon 托管式密钥 （具有别名 **aws/s3**）或您创建的对称客户托管密钥。使用客户端加密时，必须选择您创建的对称客户托管式密钥。当您选择客户托管密钥时，您必须确保 Amazon EMR 集群有权使用该 KMS 密钥。有关更多信息，请参阅 *Amazon EMR 管理指南*中的[Amazon KMS keys 用于加密](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-encryption-enable.html#emr-awskms-keys)。

对于服务器端和客户端加密这两者而言，您选择的 KMS 密钥就是[信封加密](kms-cryptography.md#enveloping)工作流程中的根密钥。数据使用唯一[的数据密钥进行加密，该密钥](data-keys.md)使用中的 KMS 密钥进行加密 Amazon KMS。已加密的数据及其数据密钥的加密副本将作为单个加密对象共同存储在 S3 存储桶中。有关其工作方式的更多信息，请参阅以下主题。

**Topics**
+ [

### 使用 SSE-KMS 在 EMRFS 上加密数据的过程
](#emrfs-encryption-sse-kms)
+ [

### 使用 CSE-KMS 在 EMRFS 上加密数据的过程
](#emrfs-encryption-cse-kms)

### 使用 SSE-KMS 在 EMRFS 上加密数据的过程
<a name="emrfs-encryption-sse-kms"></a>

当您将 Amazon EMR 集群配置为使用 SSE-KMS 时，加密过程的工作方式如下所示：

1. 集群将数据发送到 Amazon S3，以存储在 S3 存储桶中。

1. Amazon S3 向发送[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)请求 Amazon KMS，指定您在将集群配置为使用 SSE-KMS 时选择的 KMS 密钥的密钥 ID。该请求包含加密上下文；有关更多信息，请参阅[加密上下文](#emr-encryption-context)。

1. Amazon KMS 生成唯一的数据加密密钥（数据密钥），然后将该数据密钥的两个副本发送到 Amazon S3。一个副本未加密（明文），另一个副本使用 KMS 密钥加密。

1. Amazon S3 使用明文数据密钥加密它在步骤 1 中收到的数据，并在使用后尽快从内存中删除该明文数据密钥。

1. Amazon S3 将已加密的数据及数据密钥的加密副本作为单个加密对象共同存储在 S3 存储桶中。

解密过程的工作方式如下所示：

1. 群集从 S3 存储桶请求加密的数据对象。

1. Amazon S3 从 S3 对象中提取加密的数据密钥，然后通过[解密请求将加密的数据密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)钥发送到 Amazon KMS 。该请求包括一个[加密上下文](encrypt_context.md)。

1. Amazon KMS 使用用于加密数据密钥的 KMS 密钥对加密数据密钥进行解密，然后将解密（纯文本）数据密钥发送到 Amazon S3。

1. Amazon S3 使用明文数据密钥解密已加密的数据，并在使用后尽快从内存中删除该明文数据密钥。

1. Amazon S3 将解密数据发送给集群。

### 使用 CSE-KMS 在 EMRFS 上加密数据的过程
<a name="emrfs-encryption-cse-kms"></a>

当您将 Amazon EMR 集群配置为使用 CSE-KMS 时，加密过程的工作方式如下所示：

1. 当集群准备好在 Amazon S3 中存储数据时，它会向发送[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)请求 Amazon KMS，指定您在将集群配置为使用 CSE-KMS 时选择的 KMS 密钥的密钥 ID。该请求包含加密上下文；有关更多信息，请参阅[加密上下文](#emr-encryption-context)。

1. Amazon KMS 生成唯一的数据加密密钥（数据密钥），然后将该数据密钥的两个副本发送到集群。一个副本未加密（明文），另一个副本使用 KMS 密钥加密。

1. 群集使用明文数据密钥加密数据，并在使用后尽快从内存中删除该明文数据密钥。

1. 群集将已加密的数据及数据密钥的加密副本组合为单个加密对象。

1. 集群将加密的对象发送给 Amazon S3 进行存储。

解密过程的工作方式如下所示：

1. 群集从 S3 存储桶请求加密的数据对象。

1. Amazon S3 将加密的对象发送给集群。

1. 集群从加密对象中提取加密的数据密钥，然后通过[解密请求将加密的数据密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)钥发送到 Amazon KMS 。该请求包括[加密上下文](encrypt_context.md)。

1. Amazon KMS 使用用于加密数据密钥的 KMS 密钥对加密数据密钥进行解密，然后将解密（纯文本）数据密钥发送到集群。

1. 群集使用明文数据密钥解密已加密的数据，并在使用后尽快从内存中删除该明文数据密钥。

## 在集群节点的存储卷上加密数据
<a name="emr-local-disk-encryption"></a>

Amazon EMR 集群是 Amazon Elastic Compute Cloud（Amazon EC2）实例的集合。群集中的每个实例称作*群集节点*或*节点*。每个节点都可以有两类存储卷：实例存储卷和 Amazon Elastic Block Store (Amazon EBS) 卷。您可以将群集配置为使用 [Linux Unified Key Setup (LUKS)](https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md) 来加密节点上的两类存储卷 (但不包括每个节点的启动卷)。这称为*本地磁盘加密*。

在为集群启用本地磁盘加密后，您可以选择使用 Amazon KMS中的 KMS 密钥加密 LUKS 密钥。您必须选择您创建的[客户托管密钥](concepts.md#customer-mgn-key)；不能使用 [Amazon 托管式密钥](concepts.md#aws-managed-key)。如果您选择客户托管密钥，您必须确保 Amazon EMR 集群有权使用该 KMS 密钥。有关更多信息，请参阅 *Amazon EMR 管理指南*中的[Amazon KMS keys 用于加密](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-encryption-enable.html#emr-awskms-keys)。

当您使用 KMS 密钥启用本地磁盘加密时，加密过程的工作方式如下所示：

1. 当每个群集节点启动时，它会向发送[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)请求 Amazon KMS，指定您在为群集启用本地磁盘加密时选择的 KMS 密钥的密钥 ID。

1. Amazon KMS 生成唯一的数据加密密钥（数据密钥），然后将该数据密钥的两个副本发送到节点。一个副本未加密（明文），另一个副本使用 KMS 密钥加密。

1. 该节点将明文数据密钥的 base64 编码版本作为保护 LUKS 密钥的密码。节点会将加密的数据密钥副本保存在启动卷上。

1. [如果节点重新启动，则重新启动的节点会将加密的数据密钥与解密请求 Amazon KMS 一起发送到。](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)

1. Amazon KMS 使用用于加密数据密钥的 KMS 密钥对加密数据密钥进行解密，然后将解密（纯文本）数据密钥发送到节点。

1. 该节点将明文数据密钥的 base64 编码版本作为解锁 LUKS 密钥的密码。

## 加密上下文
<a name="emr-encryption-context"></a>

每项与之集成的 Amazon 服务都 Amazon KMS 可以在该服务用于 Amazon KMS 生成数据密钥或[加密或解密数据时指定加密上下文](encrypt_context.md)。加密上下文是用于检查数据完整性的其他经过身份验证的信息。 Amazon KMS 当服务为加密操作指定加密上下文时，它还必须为对应的解密操作指定同一加密上下文，否则解密会失败。加密上下文也写入 Amazon CloudTrail 日志文件，这可以帮助您了解使用特定 KMS 密钥的原因。

以下部分介绍每个使用 KMS 密钥的 Amazon EMR 加密场景中使用的加密上下文。

### 使用 SSE-KMS 的 EMRFS 加密的加密上下文
<a name="emr-encryption-context-sse-kms"></a>

借助 SSE-KMS，Amazon EMR 集群将数据发送到 Amazon S3，然后，Amazon S3 使用 KMS 密钥加密数据，然后将其存储到 S3 存储桶中。在本例中，Amazon S3 使用 S3 对象的亚马逊资源名称 (ARN) 作为其发送到的每个[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)和[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)请求的加密上下文。 Amazon KMS以下示例显示了 Amazon S3 使用的加密上下文的 JSON 表示形式。

```
{ "aws:s3:arn" : "arn:aws:s3:::S3_bucket_name/S3_object_key" }
```

### 使用 CSE-KMS 的 EMRFS 加密的加密上下文
<a name="emr-encryption-context-cse-kms"></a>

借助 CSE-KMS，Amazon EMR 集群使用 KMS 密钥加密数据，然后将其发送到 Amazon S3 进行存储。在这种情况下，集群使用 KMS 密钥的 Amazon 资源名称 (ARN) 作为其发送到的每个密钥[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)和[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)请求的加密上下文。 Amazon KMS以下示例显示了群集使用的加密上下文的 JSON 表示形式。

```
{ "kms_cmk_id" : "arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef" }
```

### 使用 LUKS 的本地磁盘加密的加密上下文
<a name="emr-encryption-context-luks"></a>

当 Amazon EMR 集群使用 LUKS 的本地磁盘加密时，群集节点不会使用它们发送到的[GenerateDataKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GenerateDataKey.html)和[解密](https://docs.amazonaws.cn/kms/latest/APIReference/API_Decrypt.html)请求来指定加密上下文。 Amazon KMS