AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon EMR 如何使用 AWS KMS

当您使用 Amazon EMR 群集时,您可以将群集配置为加密静态 数据,然后将其存储到持久性存储位置。您可以在 EMR 文件系统 (EMRFS) 上、在群集节点的存储卷上,或同时在这两者上对静态数据进行加密。要加密静态数据,您可以使用 AWS KMS 中的客户主密钥 (CMK)。以下主题介绍n Amazon EMR 群集如何使用 CMK 来加密静态数据。

Amazon EMR 群集也可以加密传输中 的数据,这意味着群集会先加密数据,然后将其通过网络发送。您不能使用 CMK 加密传输中的数据。有关更多信息,请参阅 Amazon EMR 管理指南 中的传输中的数据加密

有关所有加密选项的更多信息 Amazon EMR,请参阅 Amazon EMR 管理指南 中的 加密选项

在 EMR 文件系统 (EMRFS) 上加密数据

Amazon EMR 群集使用两个分布式文件系统:

  • Hadoop 分布式文件系统 (HDFS)。HDFS 加密不会使用 AWS KMS 中的 CMK。

     

  • EMR 文件系统 (EMRFS)。EMRFS 是 HDFS 的一种实现方式,使 Amazon EMR 群集能够在 Amazon Simple Storage Service (Amazon S3) 中存储数据。EMRFS 支持四种加密选项,其中两种会使用 AWS KMS 中的 CMK。想要了解更多有关全部四个 EMRFS 加密选项的更多信息,请参阅 Amazon EMR 管理指南 中的 加密选项

使用 CMK 的两个 EMRFS 加密选项使用 Amazon S3 提供的以下加密功能:

当将 Amazon EMR 群集配置为使用 SSE-KMS 或 CSE-KMS 在 EMRFS 上加密数据时,您需要在 AWS KMS 中选择您希望 Amazon S3 或 Amazon EMR 群集使用的 CMK。借助 SSE-KMS,您可以为 Amazon S3 选择 AWS 托管 CMK(具有别名 aws/s3)或您创建的自定义 CMK。使用 CSE-KMS 时,您必须选择您创建的自定义 CMK。当您选择自定义 CMK 时,您必须确保 Amazon EMR 群集有权使用该 CMK。有关更多信息,请参阅 Amazon EMR 管理指南 中的使用 AWS KMS 客户主密钥 (CMK) 进行加密

对于 SSE-KMS 和 CSE-KMS 这两者而言,您选择的 CMK 就是信封加密工作流程中的主密钥。该数据会使用唯一数据加密密钥(即数据密钥)对数据进行加密,而这个数据密钥将使用 AWS KMS 中的 CMK 进行加密。已加密的数据及其数据密钥的加密副本将作为单个加密对象共同存储在 S3 存储桶中。有关其工作方式的更多信息,请参阅以下主题。

使用 SSE-KMS 在 EMRFS 上加密数据的过程

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

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

  2. Amazon S3 向 AWS KMS 发送 GenerateDataKey 请求,同时指定您在将群集配置为使用 SSE-KMS 时所选的 CMK 的密钥 ID。该请求包含加密上下文;有关更多信息,请参阅加密上下文

  3. AWS KMS 生成一个唯一数据加密密钥(数据密钥),然后将此数据密钥的两个副本发送到 Amazon S3。一个副本未加密 (明文),另一个副本使用 CMK 加密。

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

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

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

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

  2. Amazon S3 从 S3 对象提取加密的数据密钥,然后使用 Decrypt 请求将已加密的数据密钥发送到 AWS KMS。该请求包括一个加密上下文

  3. AWS KMS 借助加密数据密钥时使用的同一 CMK 解密该加密数据密钥,然后将已解密的(明文)数据密钥发送到 Amazon S3。

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

  5. Amazon S3 将解密数据发送到群集。

使用 CSE-KMS 在 EMRFS 上加密数据的过程

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

  1. 在准备好将数据存储在 Amazon S3 中后,群集向 AWS KMS 发送 GenerateDataKey 请求,同时指定您在将群集配置为使用 CSE-KMS 时所选的 CMK 的密钥 ID。该请求包含加密上下文;有关更多信息,请参阅加密上下文

  2. AWS KMS 生成一个唯一数据加密密钥(数据密钥),然后将此数据密钥的两个副本发送到群集。一个副本未加密 (明文),另一个副本使用 CMK 加密。

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

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

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

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

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

  2. Amazon S3 将加密的对象发送到群集。

  3. 集群从加密的对象提取加密的数据密钥,然后使用 Decrypt 请求将已加密的数据密钥发送到 AWS KMS。该请求包括加密上下文

  4. AWS KMS 借助加密数据密钥时使用的同一 CMK 解密该加密数据密钥,然后将已解密的(明文)数据密钥发送到群集。

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

在群集节点的存储卷上加密数据

Amazon EMR 群集是 Amazon Elastic Compute Cloud (Amazon EC2) 实例的集合。群集中的每个实例称作群集节点节点。每个节点都可以有两类存储卷:实例存储卷和 Amazon Elastic Block Store (Amazon EBS) 卷。您可以将群集配置为使用 Linux Unified Key Setup (LUKS) 来加密节点上的两类存储卷 (但不包括每个节点的启动卷)。这称为本地磁盘加密

在为群集启用本地磁盘加密后,您可以选择使用 AWS KMS 中的 CMK 加密 LUKS 主密钥。您必须选择您创建的自定义 CMK;不能使用 AWS 托管 CMK。当您选择自定义 CMK 时,您必须确保 Amazon EMR 群集有权使用该 CMK。有关更多信息,请参阅 Amazon EMR 管理指南 中的使用 AWS KMS 客户主密钥 (CMK) 进行加密

当您使用 CMK 启用本地磁盘加密时,加密过程的工作方式如下所示:

  1. 在每个群集节点启动后,它将向 AWS KMS 发送 GenerateDataKey 请求,同时指定您在为群集启用本地磁盘加密时所选的 CMK 的密钥 ID。

  2. AWS KMS 生成一个唯一数据加密密钥(数据密钥),然后将此数据密钥的两个副本发送到节点。一个副本未加密 (明文),另一个副本使用 CMK 加密。

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

  4. 如果节点重启,重启节点会使用 Decrypt 请求将已加密的数据密钥发送到 AWS KMS。

  5. AWS KMS 借助加密数据密钥时使用的同一 CMK 解密该加密数据密钥,然后将已解密的(明文)数据密钥发送到节点。

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

加密上下文

与 AWS KMS 集成的每项 AWS 服务在使用 AWS KMS 生成数据密钥或者加密或解密数据时都可以指定加密上下文。加密上下文是 AWS KMS 检查数据完整性时使用的额外的身份验证信息。当服务为加密操作指定加密上下文时,它还必须为对应的解密操作指定同一加密上下文,否则解密会失败。加密上下文也将写入 AWS CloudTrail 日志文件中,这可以帮助您了解为什么要使用给定的 CMK。

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

使用 SSE-KMS 的 EMRFS 加密的加密上下文

借助 SSE-KMS,Amazon EMR 群集将数据发送到 Amazon S3,然后,Amazon S3 使用 CMK 加密数据,然后将其存储到 S3 存储桶中。在这种情况下,Amazon S3 使用它发送到 AWS KMS 的每个 GenerateDataKeyDecrypt 请求将 S3 对象的 Amazon 资源名称 (ARN) 作为加密上下文。以下示例显示了 Amazon S3 使用的加密上下文的 JSON 表示形式。

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

使用 CSE-KMS 的 EMRFS 加密的加密上下文

借助 CSE-KMS,Amazon EMR 群集使用 CMK 加密数据,然后将其发送到 Amazon S3 进行存储。在这种情况下,群集使用它发送到 AWS KMS 的每个 GenerateDataKeyDecrypt 请求将 CMK 的 Amazon 资源名称 (ARN) 作为加密上下文。以下示例显示了群集使用的加密上下文的 JSON 表示形式。

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

使用 LUKS 的本地磁盘加密的加密上下文

当 Amazon EMR 群集使用 LUKS 进行本地磁盘加密时,群集节点不使用它们发送到 AWS KMS 的 GenerateDataKeyDecrypt 请求指定加密上下文。