Amazon EMR 如何使用 Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon EMR 如何使用 Amazon KMS

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

重要

Amazon EMR 仅支持对称 KMS 密钥。不能使用非对称 KMS 密钥来加密 Amazon EMR 集群中的静态数据。要获取确定 KMS 密钥是对称还是非对称的帮助,请参阅 识别非对称 KMS 密钥

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在为集群启用本地磁盘加密后,您可以选择使用 Amazon KMS 中的 KMS 密钥加密 LUKS 密钥。您必须选择您创建的客户托管密钥;不能使用 Amazon 托管式密钥。如果您选择客户托管密钥,您必须确保 Amazon EMR 集群有权使用该 KMS 密钥。有关更多信息,请参阅 Amazon EMR 管理指南中的将 Amazon KMS keys 用于加密

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

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

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

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

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

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

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

加密上下文

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

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

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

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

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

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

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

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

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

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