

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

# 在 Amazon EMR 上 HDFS 中的透明加密
<a name="emr-encryption-tdehdfs"></a>

系統會透過 HDFS *加密區域*的運用來實作透明加密功能，加密區域即為您定義的 HDFS 路徑。每個加密區域都有自己的金鑰，該金鑰存放在使用 `hdfs-site` 組態分類指定的伺服器中。

從 Amazon EMR 發行版本 4.8.0 開始，您可以使用 Amazon EMR 安全組態設定，更輕鬆地進行叢集的資料加密設定。安全組態提供的設定，可讓 Amazon Elastic Block Store (Amazon EBS) 儲存磁碟區中的傳輸中的資料和靜態資料以及 Amazon S3 中 EMRFS 資料，獲得安全的保障。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[加密傳輸中和靜態的資料](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-data-encryption.html)。

依預設，Amazon EMR 使用 Hadoop KMS；不過，您可以使用另一個 KMS，其會實作 KeyProvider API 操作。HDFS 加密區域中的每個檔案都有專屬的*資料加密金鑰*，這是由加密區域金鑰所加密的項目。在資料寫入加密區域時，HDFS 資料會以端對端 (靜態和傳輸中) 的方式來加密，因為加密和解密活動只在發生在用戶端中。

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

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

如需詳細資訊，請參閱 Hadoop 文件中的 [HDFS 中的透明加密](http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/TransparentEncryption.html)。

**注意**  
在 Amazon EMR 中，依預設，並不會使用 Hadoop KMS 啟用透過 HTTPS 的 KMS。如需如何透過 HTTPS 啟用 KMS 的詳細資訊，請參閱 [Hadoop KMS 文件](http://hadoop.apache.org/docs/current/hadoop-kms/index.html)。

## 設定 HDFS 透明加密
<a name="emr-configure-HDFS-transparent-encryption"></a>

您可以透過建立金鑰並新增加密區域，來設定 Amazon EMR 中的透明加密。您可以數種方式來執行此動作：
+ 當您建立叢集時，使用 Amazon EMR 組態 API 操作
+ 使用 Hadoop JAR 步驟和 command-runner.jar
+ 登入 Hadoop 的叢集主節點，並使用 `hadoop key` 和 `hdfs 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-7.13.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 來啟動您的叢集。

1. 連接至使用 SSH 的叢集主節點。

1. 在 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 需要您的金鑰名稱為小寫。如果您使用的金鑰有大寫字元，在啟動叢集將會失敗。

1. 在 HDFS 中建立加密區域路徑。

   ```
   $ hadoop fs -mkdir /myHDFSPath2
   ```

1. 使用您建立的金鑰來讓 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 透明加密的考量
<a name="emr-HDFS-transparent-encryption-considerations"></a>

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

## Hadoop 金鑰管理伺服器
<a name="emr-hadoop-kms"></a>

[Hadoop KMS](http://hadoop.apache.org/docs/current/hadoop-kms/index.html) 是一個金鑰管理伺服器，其能讓您為 Hadoop 叢集實作加密服務，且可做為[在 Amazon EMR 上 HDFS 中的透明加密](#emr-encryption-tdehdfs)金鑰供應商。依預設，當您選取 Hadoop 應用程式，同時啟動 EMR 叢集時，Hadoop KMS 已在 Amazon EMR 中安裝且啟用。Hadoop KMS 不會存放金鑰本身 (除非進行臨時快取)。Hadoop KMS 作為金鑰供應商和用戶端信任者之間到備份金鑰存放區的 Proxy - 但不是金鑰存放區。為 Hadoop KMS 建立的預設金鑰儲存庫是 Java Cryptography Extension KeyStore (JCEKS)。JCE 無限制的強度政策也包含在內，因此您可以建立所需長度的金鑰。Hadoop KMS 還支援各種 ACL，以控制存取金鑰和其他用戶端應用程式 (如 HDFS) 的金鑰獨立操作。在 Amazon EMR 中預設金鑰長度為 256 位元。

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

如需詳細資訊，請參閱 [Hadoop KMS 文件](http://hadoop.apache.org/docs/current/hadoop-kms/index.html)。Hadoop KMS 會用於 Hadoop HDFS 透明加密。若要進一步了解 HDFS 透明加密，請參閱 Apache Hadoop 文件中的 [HDFS 透明加密](http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/TransparentEncryption.html)主題。

**注意**  
在 Amazon EMR 中，依預設，並不會使用 Hadoop KMS 啟用透過 HTTPS 的 KMS。若要進一步了解如何透過 HTTPS 啟用 KMS，請參閱 [Hadoop KMS 文件](http://hadoop.apache.org/docs/current/hadoop-kms/index.html)。

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

### 在 Amazon EMR 中設定 Hadoop KMS
<a name="emr-hadoop-kms-configure"></a>

使用 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**
+ 使用以下列命令建立含 Hadoop KMS 和 ACL 的叢集：

  ```
  aws emr create-cluster --release-label {{emr-7.13.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.13.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.13.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 文件](http://hadoop.apache.org/docs/current/hadoop-kms/index.html)。

## EMR 叢集 (含多個主節點) 上的 HDFS 透明加密
<a name="emr-hadoop-kms-multi-master"></a>

[Apache Ranger](http://hadoop.apache.org/docs/current/hadoop-kms/index.html) KMS 在具有多個主節點的 Amazon EMR 叢集中使用，以在 HDFS 中進行透明加密。

Apache Ranger KMS 將根金鑰和加密區域 (EZ) 金鑰儲存在具有多個主節點的 Amazon EMR 叢集的 Amazon RDS 中。若要在具有多個主節點的 Amazon EMR 叢集上的 HDFS 中啟用透明加密，您必須提供下列組態。
+ Amazon RDS 或您自己的 MySQL 伺服器連線 URL，用來儲存 Ranger KMS 根金鑰和 EZ 金鑰 
+ MySQL 的使用者名稱和密碼
+ Ranger KMS 根金鑰的密碼
+ 憑證授權機構 (CA) PEM 檔案，用於 SSL 連線至 MySQL 伺服器。您可以從 Amazon RDS 的 AWS 區域 下載憑證套件下載 的憑證套件。 [https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesDownload](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesDownload)

您可以使用 `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 的組態物件分類。


**Hadoop KMS 組態分類**  

| 分類 | Description | 
| --- | --- | 
| ranger-kms-dbks-site | 變更 Ranger KMS 之 dbks-site.xml 檔案中的值。 | 
| ranger-kms-site | 變更 Ranger KMS 之 ranger-kms-site.xml 檔案中的值。 | 
| ranger-kms-env | 變更 Ranger KMS 環境中的值。 | 
| ranger-kms-log4j | 變更 Ranger KMS 之 kms-log4j.properties 檔案中的值。 | 
| ranger-kms-db-ca | 變更 S3 上 CA 檔案的值，以使用 Ranger KMS 進行 MySQL SSL 連線。 | 

**考量**
+ 強烈建議您加密 Amazon RDS 執行個體以提升安全性。如需詳細資訊，請參閱[加密 Amazon RDS 資源的概觀](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html#Overview.Encryption.Overview)。
+ 強烈建議針對每個具有多個主節點的 Amazon EMR 叢集使用個別 MySQL 資料庫，以提高安全門檻。
+ 若要在具有多個主節點的 Amazon EMR 叢集上設定 HDFS 中的透明加密，您必須在建立叢集時指定 `hdfs-encryption-zones` 分類。否則，將不會設定或啟動 Ranger KMS。具有多個主節點的 Amazon EMR 叢集不支援在執行中的叢集上重新設定 `hdfs-encryption-zones` 分類或任何 Hadoop KMS 組態分類。
+ 您從 [Amazon RDS 下載憑證套件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesDownload)下載的 PEM 憑證套件會將多個憑證分組為一個檔案。Amazon EMR 7.3.0 及更高版本支援使用組態 從 PEM 檔案匯入多個憑證`ranger.kms.trust.ca.file.s3.url`。