本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon EMR 上的 HDFS 中的透明加密
透明加密是通过使用 HDFS 加密区域(您定义的 HDFS 路径)实现的。每个加密区域都有其自己的密钥 (存储在使用 hdfs-site
配置分类指定的密钥服务器中)。
从 Amazon EMR 发行版 4.8.0 开始,您可以使用 Amazon EMR 安全配置更轻松地为集群配置数据加密设置。安全配置提供用于为 Amazon S3 中 Amazon Elastic Block Store(Amazon EBS)存储卷和 EMRFS 数据中的传输中的数据和静态数据增强安全性的设置。有关更多信息,请参阅《Amazon EMR 管理指南》中的加密传输中的数据和静态数据。
亚马逊 EMR 默认使用 Hadoop KMS;但是,您可以使用其他 KMS 来实现 API 操作。 KeyProvider HDFS 加密区域中的每个文件都有其自己唯一的数据加密密钥(通过加密区域密钥加密)。当数据写入加密区域时,HDFS 数据会被加密 end-to-end(静态和传输中),因为加密和解密活动只发生在客户端。
您无法在加密区域之间移动文件,也无法将文件从加密区域移至未加密路径。
NameNode 和 HDFS 客户端通过 API 操作与 Hadoop KMS(或您配置的备用 KMS)进行交互。 KeyProvider KMS 负责将加密密钥存储在后备密钥存储中。此外,Amazon EMR 包含 JCE 无限制强度策略,以便您能够创建具有所需长度的密钥。
有关更多信息,请参阅 Hadoop 文档中的 HDFS 中的透明加密
注意
在 Amazon EMR 中,对于 Hadoop KMS,默认不启用通过 HTTPS 的 KMS。有关如何启用通过 HTTPS 的 KMS 的更多信息,请参阅 Hadoop KMS 文档
配置 HDFS 透明加密
您可通过创建密钥并添加加密区域在 Amazon EMR 中配置透明加密。有几种方式可以实现:
-
在创建集群时使用 Amazon EMR 配置 API 操作
-
使用 Hadoop JAR 步骤与 command-runner.jar
-
登录到 Hadoop 集群的主节点并使用
hadoop key
和hdfs crypto
命令行客户端 -
将 REST 用 APIs 于 Hadoop KMS 和 HDFS
有关 REST 的更多信息 APIs,请参阅 Hadoop KMS 和 HDFS 的相应文档。
使用 CLI 在创建集群时创建加密区域及其密钥
配置 API 操作中的 hdfs-encryption-zones
分类允许您在创建集群时指定密钥名称和加密区。Amazon EMR 在您的集群的 Hadoop KMS 中创建此密钥并配置加密区域。
-
使用以下命令创建集群。
aws emr create-cluster --release-label
emr-7.7.0
--instance-type m5.xlarge --instance-count 2 \ --applications Name=App1
Name=App2
--configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json注意
为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。
myConfig.json
:[ { "Classification": "hdfs-encryption-zones", "Properties": { "/myHDFSPath1": "path1_key", "/myHDFSPath2": "path2_key" } } ]
在主节点上手动创建加密区域及其密钥
-
使用高于 4.1.0 的 Amazon EMR 发行版启动您的集群。
-
使用 SSH 连接到集群的主节点。
-
在 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 要求您的密钥名称为小写。如果您使用的密钥包含大写字符,则您的集群将在启动过程中失败。
-
在 HDFS 中创建加密区域路径。
$ hadoop fs -mkdir /myHDFSPath2
-
使用您创建的密钥使 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 KMS,请使用 hadoop-kms-site分类来更改设置。要进行配置 ACLs,您可以使用分类 kms-acls。
有关更多信息,请参阅 Hadoop KMS 文档
注意
在 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-site | kms-site.xml |
hadoop-kms-acls | kms-acls.xml |
hadoop-kms-env | kms-env.sh |
hadoop-kms-log4j | kms-log4j.properties |
使用 CLI 设置 Hadoop KM ACLs S
-
使用以下命令 ACLs 使用 Hadoop KMS 创建集群:
aws emr create-cluster --release-label
emr-7.7.0
--instance-type m5.xlarge --instance-count 2 \ --applications Name=App1
Name=App2
--configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/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-7.7.0
--instance-type m5.xlarge --instance-count 2 \ --applications Name=App1
Name=App2
--configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json注意
为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。
myConfig.json
:[ { "Classification": "hadoop-kms-site", "Properties": { "hadoop.kms.cache.enable": "false" } } ]
使用 CLI 在 kms-env.sh
脚本中设置环境变量
-
通过
kms-env.sh
配置更改hadoop-kms-env
中的设置。使用以下命令通过 Hadoop KMS 创建集群:aws emr create-cluster --release-label
emr-7.7.0
--instance-type m5.xlarge --instance-count 2 \ --applications Name=App1
Name=App2
--configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/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 文档
具有多个主节点 的 EMR 集群上的 HDFS 透明加密
Apache Ranger
Apache Ranger KMS 将其根密钥和加密区域(EZ)密钥存储在 Amazon RDS 中,用于具有多个主节点的 Amazon EMR 集群。要在具有多个主节点的 Amazon EMR 集群上的 HDFS 中启用透明加密,必须提供以下配置。
-
Amazon RDS 或您自己的 MySQL 服务器连接 URL,用于存储 Ranger KMS 根密钥和 EZ 密钥
-
MySQL 的用户名和密码
-
Ranger KMS 根密钥的密码
-
用来与 MySQL 服务器建立 SSL 连接的证书颁发机构(CA)PEM 文件。您可以 AWS 区域 从下载适用于 Amazon RDS 的证书捆绑包中下载适用于您的证书包。
您可以使用 ranger-kms-dbks-site
分类和 ranger-kms-db-ca
分类提供这些配置,如以下示例所示。
[{ "Classification": "ranger-kms-dbks-site", "Properties": { "ranger.ks.jpa.jdbc.url": "
jdbc:log4jdbc:mysql://mysql-host-url.xx-xxx-1.xxx.amazonaws.com:3306/rangerkms
", "ranger.ks.jpa.jdbc.user": "mysql-user-name
", "ranger.ks.jpa.jdbc.password": "mysql-password
", "ranger.db.encrypt.key.password": "password-for-encrypting-a-master-key
" } }, { "Classification": "ranger-kms-db-ca", "Properties": { "ranger.kms.trust.ca.file.s3.url": "<S3-path-of-downloaded-pem-file>" } } ]]
以下是 Apache Ranger KMS 的配置对象分类。
分类 | 描述 |
---|---|
ranger-kms-dbks-site | 更改 Ranger KMS 的 dbks-site.xml 文件中的值。 |
ranger-kms-site | 更改 Ranger K ranger-kms-site MS 的.xml 文件中的值。 |
ranger-kms-env | 更改 Ranger KMS 环境中的值。 |
ranger-kms-log4j | 更改 Ranger KMS 的 kms-log4j.properties 文件中的值。 |
ranger-kms-db-ca | 更改 S3 上用于与 Ranger KMS 进行 MySQL SSL 连接的 CA 文件的值。 |
注意事项
-
强烈建议您加密 Amazon RDS 实例以提高安全性。有关更多信息,请参阅加密 Amazon RDS 资源概览。
-
强烈建议您为每个具有多个主节点的 Amazon EMR 集群使用单独的 MySQL 数据库以提高安全性。
-
要在具有多个主节点的 Amazon EMR 集群上的 HDFS 中配置透明加密,必须在创建集群时指定
hdfs-encryption-zones
分类。否则,Ranger KMS 将不会配置或启动。具有多个主节点的 Amazon EMR 集群上不支持在运行的集群上重新配置hdfs-encryption-zones
分类或任何 Hadoop KMS 配置分类。 -
您从下载 Amazon RDS 的证书捆绑包下载的 PEM 证书捆绑包将多个证书分组到一个文件中。Amazon EMR 7.3.0 及更高版本支持使用配置
ranger.kms.trust.ca.file.s3.url
从 PEM 文件导入多个证书。