亚马逊AWS官方博客

使用原生 EBS 加密和存储桶级 S3 加密选项来保护 Amazon EMR 上的数据

Original URL: https://amazonaws-china.com/cn/blogs/big-data/secure-your-data-on-amazon-emr-using-native-ebs-and-per-bucket-s3-encryption-options/
数据加密是保护数据安全的有效方案之一。通过加密数据并管理对加密密钥的访问,您可以确保只有授权的用户或应用程序可以读取您的敏感收据。医疗卫生和金融等受监管行业的客户之所以选择 Amazon EMR,一个主要原因就是它提供了安全地存储和访问数据的合规环境。本文详细演示了两种新的加密选项,以帮助您保护处理敏感数据的 EMR 集群。第一个选项是使用原生 EBS 加密来加密挂载到 EMR 集群的卷。第二个选项是 Amazon S3 加密,它允许您通过 Amazon EMR 为单个 S3 存储桶使用不同的加密模式和客户主密钥 (customer master keys, CMKs)。

1、Amazon EMR 上的本地磁盘加密

之前,您只能选择 Linux 统一密钥设置 (Linux Unified Key Setup, LUKS) 来进行静态加密。现在,您可以选择使用 LUKS 或原生 EBS 加密来加密挂载到 EMR 集群的 EBS 卷。EBS 加密具有以下优势:

  • 端到端加密 – 当您为 Amazon EMR 启用 EBS 加密时,EBS 卷上的所有数据(包括来自节点和 EBS 卷之间的应用程序和磁盘 I/O 的中间磁盘溢出)都将加密。为加密 EBS 卷创建的快照也将被加密,这些快照可以在 AWS region之间移动。
  • Amazon EMR 根卷加密 – 直接使用安全配置选项来加密 EBS 根设备,无需为根卷加密创建自定义的Linux 系统映像。详见注一
  • 轻松加密审计 当您使用 LUKS 加密时,尽管您的 EBS 卷以及任何实例存储卷都将加密,但当您使用 Amazon EC2 API 或 EC2 控制台来检查加密状态时,您仍会看到 EBS 处于“未加密”状态。这是因为 API 不会深入 EMR 集群来检查磁盘状态,您的审计师需要通过 SSH 访问集群以检查加密磁盘的合规性。但借助 EBS 加密功能,您可以通过 EC2 控制台或 EC2 API 调用来检查加密状态。
  • 透明加密 – EBS 加密对于在 Amazon EMR 上运行的任何应用程序都是透明的,无需您修改任何代码。

Amazon EBS 加密与 AWS KMS 集成,并提供加密密钥来保护数据。要实现此功能,需要在您的账户和region中使用 CMK。CMK 让您可以控制密钥的创建与管理,包括启用和禁用密钥、控制访问权限、轮换密钥以及删除密钥等。有关更多信息,请参阅客户主密钥

注一:从 Amazon EMR 版本 5.24.0 开始,当指定 AWS KMS 作为密钥提供程序时,可以使用安全配置选项来加密 EBS 根设备和存储卷。如果您使用 5.24.0 之前的 Amazon EMR 版本,则只有在使用自定义 AMI 时,才支持加密的 EBS 根设备卷。更多参考: https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-data-encryption-options.html

在 Amazon EMR 上启用 EBS 加密

要在 Amazon EMR 上启用 EBS 加密,请完成以下步骤:

  1. 在 AWS KMS 中创建您的 CMK。
    您可以通过 AWS KMS 控制台、AWS CLI 或 AWS KMS CreateKey API 完成此步骤。创建密钥的区域应与您的 EMR 集群所在区域相同。有关更多信息,请参阅创建密钥
  2. 向 Amazon EMR service role和 EC2 实例配置文件赋予使用 CMK 的权限。
    如果您使用 EMR_DefaultRole,则通过以下步骤添加策略:

    • 打开 AWS KMS 控制台。
    • 选择您的 AWS 区域。
    • 选择您创建的 CMK 的密钥 ID 或别名。
    • 在“密钥详细信息”页面的密钥用户下,选择添加
    • 选择 Amazon EMR 服务角色。默认角色的名称为 EMR_DefaultRole
    • 选择附加
    • 选择 Amazon EC2 实例配置文件。实例配置文件的默认角色名称为 EMR_EC2_DefaultRole
    • 选择附加
      如果您使用自定义策略,请将以下代码添加到服务角色,以允许 Amazon EMR 创建和使用 CMK,其中的资源为 CMK ARN:

      { 
      "Version": "2012-10-17",
      "Statement": [ 
         { 
         "Sid": "EmrDiskEncryptionPolicy",
         "Effect": "Allow",
         "Action": [ 
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:CreateGrant",
            "kms:GenerateDataKeyWithoutPlaintext",
            "kms:DescribeKey" 
            ],
         "Resource": [ 
            " arn:aws:kms:region:account-id:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx " " 
            ] 
         } 
      ] 
      } 

       

  3. 创建和配置 Amazon EMR 安全配置模板。可以通过控制台或使用 CLI 或 SDK 按以下步骤完成此操作:
    • 打开 Amazon EMR 控制台。
    • 选择安全配置
    • 本地磁盘加密下,选择启用本地磁盘静态加密
    • 对于密钥提供商类型,选择 AWS KMS
    • 对于 AWS KMS 客户主密钥,选择您的 CMK 的密钥 ARN。本文使用的密钥 ARN 为 ebsEncryption_emr_default_role
    • 选择使用 EBS 加密来加密 EBS 卷

EC2 的默认加密与Amazon EMR EBS 加密的区别

EC2 有一个类似的功能,叫做默认加密。借助此功能,您账户中的所有 EBS 卷都将使用您为每个region指定的单个 CMK 进行加密(没有例外)。而使用 Amazon EMR 的 EBS 加密功能,您可以为每个 EMR 集群使用不同的 KMS 密钥来保护您的 EBS 卷。您可以同时使用 Amazon EMR 提供的 EBS 加密和 EC2 提供的默认加密。

本文优先使用了 Amazon EMR 提供的 EBS 加密,使用在安全配置中选择的 CMK 来加密挂载到集群的 EBS 卷。

2、S3 加密

Amazon S3 通过Amazon EMR File System (EMRFS)对读取和写入到 S3 的对象进行加密。您可以使用服务器端加密 (SSE) 或客户端侧加密 (CSE) 模式来加密 S3 存储桶中的对象。下表总结了可在 Amazon EMR 中用于 S3 加密的不同加密模式。

加密位置 密钥存储 密钥管理
SSE-S3 S3服务器端 S3 S3
SSE-KMS S3服务器端 KMS

选择适用于 Amazon S3 的 AWS 托管 CMK,别名为 aws/s3,或者创建一个自定义 CMK。

 

CSE-KMS EMR 集群客户端侧 KMS 客户创建的自定义 CMK。
CSE-自定义 EMR 集群客户端侧 客户 客户自己的密钥提供商。

加密选择取决于具体工作负载要求。虽然 SSE-S3 是最为直接简单的选项,让您能够通过复选框选择将 S3 对象的加密完全委托给 Amazon S3,但 SSE-KMS 或 CSE-KMS 是更好的选项,因为它能够在 KMS 中使用策略来更精细地控制 CMK。借助 AWS KMS,您可以看到使用客户管理密钥 (CMK) 的时间、地点和使用者,因为 AWS CloudTrail 会记录密钥访问和密钥的 API 调用。这些日志让您具备了完全的密钥审计能力。有关更多信息,请参阅 Amazon S3 中 EMRFS 数据的静态加密

使用不同的加密模式和密钥来加密 S3 存储桶

使用 Amazon EMR 上的 S3 加密时,默认情况下所有加密模式都将使用一个 CMK 来加密 S3 中的对象。如果特定 S3 存储桶中存在高度敏感的内容,您可能需要为特定的存储桶使用不同的 CMK 或加密模式,从而单独管理这些存储桶。您可以在 Amazon EMR 使用存储桶级加密覆盖选项来实现此功能。为此,执行以下步骤:

  1. 打开 Amazon EMR 控制台。
  2. 选择安全配置
  3. S3 加密下,选择在 Amazon S3 中启用 EMRFS 数据静态加密
  4. 对于默认加密模式,选择您的加密模式。本文使用的是 SSE-KMS
  5. 对于 AWS KMS 客户主密钥,选择您的密钥。您在此处提供的密钥会加密 Amazon EMR 使用的所有 S3 存储桶。本文使用的是 ebsEncryption_emr_default_role
  6. 选择存储桶级加密覆盖。您可以为不同的存储桶设置不同的加密模式。
  7. 对于 S3 存储桶,可以添加您希望单独加密的 S3 存储桶。
  8. 对于加密模式,选择一个加密模式。
  9. 对于加密材料,输入您的 CMK。

如果您已经在 Amazon S3 中直接为 S3 存储桶启用了默认加密,则可以选择在 Amazon EMR 中的安全配置设置中跳过 S3 加密选项。这时 Amazon EMR 将存储桶中对象的加密委托给 Amazon S3,后者会使用存储桶策略中指定的加密密钥来加密对象。

3、小结

本文演示了 Amazon EMR 提供的原生 EBS 加密和 S3 加密选项,以此加密和保护您的数据。我们欢迎大家就这些优化在您真实环境中的使用提供反馈。

4、相关参考

  1. AWS KMS 之 EBS 和 S3 加密最佳实践

https://amazonaws-china.com/cn/blogs/china/ebs-s3-encryption-best-practices-for-aws-kms/

  1. New – Encrypted EBS Boot Volumes

https://amazonaws-china.com/cn/blogs/aws/new-encrypted-ebs-boot-volumes/

 


关于作者

Duncan Chan 是 Amazon EMR 的一名软件开发工程师。他热爱学习和使用大数据技术。在休闲时间,他喜欢遛狗。