Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Amazon EMR 上的 HDFS 中的透明加密

透明加密是通过使用 HDFS 加密区域 (您定义的 HDFS 路径) 实现的。每个加密区域都有其自己的密钥 (存储在使用 hdfs-site 配置分类指定的密钥服务器中)。

从 Amazon EMR 发布版本 4.8.0 开始,您可以使用 Amazon EMR 安全配置更轻松地为集群配置数据加密设置。安全配置提供用于为 Amazon Elastic Block Store (Amazon EBS) 存储卷中的传输中的数据和静态数据以及 Amazon S3 中的 EMRFS 数据增强安全性的设置。有关更多信息,请参阅 Amazon EMR 管理指南 中的加密传输中的数据和静态数据

默认情况下,Amazon EMR 使用 Hadoop KMS;不过您可以使用其他实现 KeyProvider API 操作的 KMS。HDFS 加密区域中的每个文件都有其自己唯一的数据加密密钥 (通过加密区域密钥加密)。当 HDFS 数据写入加密区域时,将对数据进行端到端加密 (静态和传输中)。因为加密和解密活动仅在客户端中进行。

您无法在加密区域之间移动文件,也无法将文件从加密区域移至未加密路径。

NameNode 和 HDFS 客户端通过 KeyProvider API 操作与 Hadoop KMS (或您配置的替代 KMS) 交互。KMS 负责将加密密钥存储在后备密钥存储中。此外,Amazon EMR 包含 JCE 无限制强度策略,以便您能够创建具有所需长度的密钥。

有关更多信息,请参阅 Hadoop 文档中的 HDFS 中的透明加密

注意

在 Amazon EMR 中,对于 Hadoop KMS,默认不启用通过 HTTPS 的 KMS。有关如何启用通过 HTTPS 的 KMS 的更多信息,请参阅 Hadoop KMS 文档

配置 HDFS 透明加密

您可通过创建密钥并添加加密区域来配置透明加密。有几种方式可以实现:

  • 在创建集群时使用 Amazon EMR 配置 API 操作

  • 使用 Hadoop JAR 步骤与 command-runner.jar

  • 登录到 Hadoop 集群的主节点并使用 hadoop keyhdfs crypto 命令行客户端

  • 对 Hadoop KMS 和 HDFS 使用 REST API

有关 REST API 的更多信息,请参阅 Hadoop KMS 和 HDFS 各自的文档。

使用 CLI 在创建集群时创建加密区域及其密钥

配置 API 操作中的 hdfs-encryption-zones 分类允许您在创建集群时指定密钥名称和加密区域。Amazon EMR 在您的集群的 Hadoop KMS 中创建此密钥并配置加密区域。

  • 使用以下命令创建集群:

    aws emr create-cluster --release-label emr-5.14.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hdfs-encryption-zones", "Properties": { "/myHDFSPath1": "path1_key", "/myHDFSPath2": "path2_key" } } ]

在主节点上手动创建加密区域及其密钥

  1. 使用高于 4.1.0 的 Amazon EMR 版本启动您的集群。

  2. 使用 SSH 连接到集群的主节点。

  3. 在 Hadoop KMS 中创建密钥:

    $ hadoop key create path2_key path2_key has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=256, description='null', attributes=null}. KMSClientProvider[http://ip-x-x-x-x.ec2.internal:16000/kms/v1/] has been updated.

    重要

    Hadoop KMS 要求您的密钥名称为小写。如果您使用的密钥包含大写字符,则您的集群将在启动过程中失败。

  4. 在 HDFS 中创建加密区域路径:

    $ hadoop fs -mkdir /myHDFSPath2
  5. 使用您创建的密钥使 HDFS 路径成为加密区域:

    $ hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2 Added encryption zone /myHDFSPath2

使用 AWS CLI 手动创建加密区域及其密钥

  • 使用以下命令添加手动创建 KMS 密钥和加密区域的步骤:

    aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=CUSTOM_JAR,Name="Create First Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path1_key\""] \ Type=CUSTOM_JAR,Name="Create First Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create First Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path1_key -path /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path2_key\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath2\""] \ Type=CUSTOM_JAR,Name="Create Second Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2\""]

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

HDFS 透明加密注意事项

最佳实践是为可能写入文件的每个应用程序创建一个加密区域。此外,您可使用配置 API 中的 hdfs-encryption-zones 分类加密所有 HDFS,并指定根路径 (/) 作为加密区域。

Hadoop 密钥管理服务器

Hadoop KMS 是一个密钥管理服务器,可用于为 Hadoop 集群实施加密服务,并且可充当 Amazon EMR 上的 HDFS 中的透明加密 的密钥供应商。如果您在启动 EMR 集群时选择 Hadoop 应用程序,则默认情况下将安装并启用 Amazon EMR 中的 Hadoop KMS。Hadoop KMS 不存储密钥 (临时缓存时除外)。Hadoop KMS 充当密钥提供商和客户被信任方到后备密钥存储的代理 - 它不是密钥存储。为 Hadoop KMS 创建的默认密钥存储是 Java Cryptography Extension KeyStore (JCEKS)。还包括 JCE 无限制强度策略,以便您能够创建具有所需长度的密钥。Hadoop KMS 还支持一系列 ACL,后者独立于其他客户端应用程序 (如 HDFS) 控制对密钥和密钥操作的访问。Amazon EMR 中的默认密钥长度为 256 位。

要配置 Hadoop KMS,请使用 hadoop-kms-site 分类来更改设置。要配置 ACL,请使用分类 kms-acls。

有关更多信息,请参阅 Hadoop KMS 文档。Hadoop KMS 用于 Hadoop HDFS 透明加密。要了解有关 HDFS 透明加密的更多信息,请参阅 Apache Hadoop 文档中的 HDFS 透明加密主题。

注意

在 Amazon EMR 中,对于 Hadoop KMS,默认不启用通过 HTTPS 的 KMS。要了解如何通过 HTTPS 启用 KMS,请参阅 Hadoop KMS 文档

重要

Hadoop KMS 要求您的密钥名称为小写。如果您使用的密钥包含大写字符,则您的集群将在启动过程中失败。

在 Amazon EMR 中配置 Hadoop KMS

如果使用 Amazon EMR 发布版本 4.6.0 或更高版本,kms-http-port 为 9700,kms-admin-port 为 9701。

您可使用 Amazon EMR 版本的配置 API 在创建集群时配置 Hadoop KMS。下面是对 Hadoop KMS 可用的配置对象分类:

Hadoop KMS 配置分类

分类。 文件名
hadoop-kms-site kms-site.xml
hadoop-kms-acls kms-acls.xml
hadoop-kms-env kms-env.sh
hadoop-kms-log4j kms-log4j.properties

使用 CLI 设置 Hadoop KMS ACL

  • 通过以下命令使用带 ACL 的 Hadoop KMS 创建集群:

    aws emr create-cluster --release-label emr-5.14.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hadoop-kms-acls", "Properties": { "hadoop.kms.blacklist.CREATE": "hdfs,foo,myBannedUser", "hadoop.kms.acl.ROLLOVER": "myAllowedUser" } } ]

使用 CLI 禁用 Hadoop KMS 缓存

  • 要在 Hadoop KMS hadoop.kms.cache.enable 设置为 false 的情况下创建集群,请使用以下命令:

    aws emr create-cluster --release-label emr-5.14.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hadoop-kms-site", "Properties": { "hadoop.kms.cache.enable": "false" } } ]

使用 CLI 在 kms-env.sh 脚本中设置环境变量

  • 通过 hadoop-kms-env 配置更改 kms-env.sh 中的设置。使用以下命令通过 Hadoop KMS 创建集群:

    aws emr create-cluster --release-label emr-5.14.0 --instance-type m4.large --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    myConfig.json

    [ { "Classification": "hadoop-kms-env", "Properties": { }, "Configurations": [ { "Classification": "export", "Properties": { "JAVA_LIBRARY_PATH": "/path/to/files", "KMS_SSL_KEYSTORE_FILE": "/non/Default/Path/.keystore", "KMS_SSL_KEYSTORE_PASS": "myPass" }, "Configurations": [ ] } ] } ]

有关配置 Hadoop KMS 的信息,请参阅 Hadoop KMS 文档