Amazon HDFS上的 中的透明加密 EMR - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon HDFS上的 中的透明加密 EMR

透明加密是透過使用HDFS加密區域 實作,加密區域 是您定義的HDFS路徑。每個加密區域都有自己的金鑰,該金鑰存放在使用 hdfs-site 組態分類指定的伺服器中。

從 Amazon 4.8.0 EMR版開始,您可以使用 Amazon EMR安全組態來更輕鬆地設定叢集的資料加密設定。安全組態提供設定,以啟用 Amazon Elastic Block Store (Amazon EBS) 儲存磁碟區和 Amazon S3 中資料傳輸中和靜態EMRFS資料的安全性。如需詳細資訊,請參閱 Amazon EMR管理指南 中的傳輸中和靜態資料加密

根據KMS預設,Amazon EMR會使用 Hadoop;不過,您可以使用另一個 KMS來實作 KeyProvider API操作。HDFS 加密區域中的每個檔案都有自己的唯一資料加密金鑰 ,由加密區域金鑰加密。HDFS 當資料寫入加密區域時,資料會加密 end-to-end (靜態和傳輸中),因為加密和解密活動只會發生在用戶端。

您不能將檔案在加密區域之間移動或從加密區域移動至未加密的路徑。

NameNode 和 HDFS用戶端會透過 操作與 Hadoop KMS(或您KMS設定的替代) KeyProvider API互動。KMS 負責將加密金鑰儲存在後端金鑰存放區中。此外,Amazon EMR包含JCE無限制強度政策,因此您可以建立所需長度的金鑰。

如需詳細資訊,請參閱 Hadoop 文件中的透明加密HDFS

注意

在 Amazon 中EMR,依預設KMSHTTPS, 不會使用 Hadoop 啟用 KMS。如需如何KMS透過 啟用的詳細資訊HTTPS,請參閱 Hadoop KMS 文件

設定HDFS透明加密

您可以透過建立金鑰和新增加密區域EMR,在 Amazon 中設定透明加密。您可以數種方式來執行此動作:

  • 建立叢集時使用 Amazon EMR組態API操作

  • 搭配 command-runner.jar 使用 Hadoop JAR 步驟

  • 登入 Hadoop 的叢集主節點,並使用 hadoop keyhdfs crypto 命令列用戶端

  • 使用 REST APIs for Hadoop KMS和 HDFS

如需 REST 的詳細資訊APIs,請參閱 Hadoop KMS和 的個別文件HDFS。

使用 建立叢集時建立加密區域及其金鑰 CLI

組態API操作中的hdfs-encryption-zones分類可讓您在建立叢集時指定金鑰名稱和加密區域。Amazon 會在叢集KMS的 Hadoop 中EMR建立此金鑰,並設定加密區域。

  • 使用下列命令建立叢集。

    aws emr create-cluster --release-label emr-7.3.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" } } ]
若要在主節點手動建立加密區域及其金鑰
  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 透明加密的考量事項

最佳實務是為每個應用程式建立他們可以寫入檔案的加密區域。此外,您可以使用組態中的 hdfs-encryption-zones 分類HDFS來加密所有 API,並將根路徑 (/) 指定為加密區域。

Hadoop 金鑰管理伺服器

Hadoop KMS 是金鑰管理伺服器,可提供針對 Hadoop 叢集實作密碼編譯服務的功能,並可擔任 的金鑰供應商Amazon HDFS上的 中的透明加密 EMR。當您在啟動EMR叢集時選取 Hadoop 應用程式時,預設EMR會安裝並啟用 Amazon KMS中的 Hadoop。Hadoop KMS不會儲存金鑰本身,除非是暫時快取的情況。Hadoop KMS充當金鑰提供者和用戶端受託方之間對後端金鑰存放區的代理,而它不是金鑰存放區。為 Hadoop 建立的預設金鑰存放區KMS是 Java 密碼編譯延伸模組 KeyStore (JCEKS)。也包含JCE無限制強度政策,因此您可以建立具有所需長度的金鑰。Hadoop KMS也支援一系列ACLs控制金鑰和金鑰操作的存取,獨立於其他用戶端應用程式,例如 HDFS。Amazon 的預設金鑰長度EMR為 256 位元。

若要設定 Hadoop KMS,請使用 hadoop-kms-site分類來變更設定。若要設定 ACLs,您可以使用分類 kms-acls。

如需詳細資訊,請參閱 Hadoop KMS 文件 。Hadoop KMS 用於 Hadoop HDFS透明加密。若要進一步了解HDFS透明加密,請參閱 Apache Hadoop 文件中的HDFS透明加密主題。

注意

在 Amazon 中EMR,依預設KMSHTTPS, 不會使用 Hadoop 啟用 KMS。若要了解如何KMS透過 啟用 HTTPS,請參閱 Hadoop KMS 文件

重要

Hadoop KMS需要您的金鑰名稱為小寫。如果您使用的金鑰有大寫字元,在啟動叢集將會失敗。

在 Amazon KMS中設定 Hadoop EMR

使用 Amazon EMR4.6.0 版或更新版本, kms-http-port為 9700,kms-admin-port9701。

您可以使用 API Amazon EMR版本的組態,KMS在叢集建立時間設定 Hadoop。以下是可用於 Hadoop 的組態物件分類KMS:

Hadoop KMS組態分類
分類 Filename
hadoop-kms-site kms-site.xml
hadoop-kms-acls kms-acls.xml
hadoop-kms-env kms-env.sh
hadoop-kms-log4j kms-log4j.properties
KMS ACLs 使用 設定 Hadoop CLI
  • ACLs 使用下列命令使用 建立具有 Hadoop KMS的叢集:

    aws emr create-cluster --release-label emr-7.3.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" } } ]
使用 停用 Hadoop KMS快取 CLI
  • 使用下列命令false,將 Hadoop KMShadoop.kms.cache.enable設為 來建立叢集:

    aws emr create-cluster --release-label emr-7.3.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" } } ]
使用 設定kms-env.sh指令碼中的環境變數 CLI
  • 透過 kms-env.sh 組態在 hadoop-kms-env 中變更設定。KMS 使用下列命令使用 Hadoop 建立叢集:

    aws emr create-cluster --release-label emr-7.3.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 文件

HDFS 具有多個主節點的EMR叢集上的透明加密

Apache Ranger KMS 用於具有多個主要節點的 Amazon EMR叢集,以便在 中透明加密HDFS。

Apache Ranger 會將其根金鑰和加密區域 (EZ) 金鑰KMS存放在您的 Amazon 中,RDS以用於具有多個主要節點的 Amazon EMR叢集。若要在具有多個主要節點的 Amazon EMR叢集HDFS上啟用 中的透明加密,您必須提供下列組態。

  • Amazon RDS或您自己的 MySQL 伺服器連線URL,用於存放 Ranger KMS根金鑰和 EZ 金鑰

  • My 的使用者名稱和密碼SQL

  • Ranger KMS根金鑰的密碼

  • SSL 用於連線至 MySQL Server 的憑證授權單位 (CA) PEM 檔案

您可以使用 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://rds-downloads/rds-ca-2019-root.pem" } } ]

以下是 Apache Ranger 的組態物件分類KMS。

Hadoop KMS組態分類
分類 描述
ranger-kms-dbks-site 變更 Ranger 的 dbks-site.xml 檔案中的值KMS。
ranger-kms-site 變更 Ranger 的 ranger-kms-site.xml 檔案中的值KMS。
ranger-kms-env 在 Ranger KMS環境中變更值。
ranger-kms-log4j 變更 Ranger 的 kms-log4j.properties 檔案中的值KMS。
ranger-kms-db-ca 變更 S3 for MySQL 與 Ranger SSL連線上的 CA 檔案值KMS。

考量

  • 強烈建議您加密 Amazon RDS執行個體,以提高安全性。如需詳細資訊,請參閱加密 Amazon RDS 資源的概觀。

  • 強烈建議您針對具有多個主要節點的每個 Amazon EMR叢集使用單獨的 MySQL 資料庫,以實現高安全性長條。

  • 若要在具有多個主要節點的 Amazon EMR叢集HDFS上設定 中的透明加密,您必須在建立叢集時指定hdfs-encryption-zones分類。否則,KMS不會設定或啟動 Ranger。在具有多個主節點的 Amazon 叢集上,不支援在執行中的EMR叢集上重新設定hdfs-encryption-zones分類或任何 Hadoop KMS組態分類。