

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

# Amazon EMR 如何使用 AWS KMS
<a name="services-emr"></a>

當使用 [Amazon EMR](https://aws.amazon.com/emr/) 叢集時，您可以在將資料儲存至持久性儲存位置之前，設定叢集加密*靜態*資料。您可以加密 EMR 檔案系統 (EMRFS)、叢集節點之儲存磁碟區，或兩者上的靜態資料。若要靜態加密資料，您可以使用 AWS KMS key。下列主題說明 Amazon EMR 叢集如何使用 KMS 金鑰來加密靜態資料。

**重要**  
Amazon EMR 僅支援[對稱 KMS 金鑰](symm-asymm-choose-key-spec.md#symmetric-cmks)。您無法使用[非對稱 KMS 金鑰](symmetric-asymmetric.md)來加密 Amazon EMR 叢集中的靜態資料。如需有關如何判斷 KMS 金鑰是對稱還是不對稱的說明，請參閱[識別不同的金鑰類型](identify-key-types.md)。

Amazon EMR 叢集也會加密*傳輸中*的資料，這表示叢集會在透過網路傳送資料之前進行加密。您不能使用 KMS 金鑰加密傳輸中的資料。如需詳細資訊，請參閱《*Amazon EMR 管理指南*》中的[傳輸資料加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-data-encryption-options.html#emr-encryption-intransit)。

如需 Amazon EMR 中所有可用加密選項的詳細資訊，請參閱《*Amazon EMR 管理指南*》中的[加密選項](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-data-encryption-options.html)。

**Topics**
+ [加密 EMR 檔案系統 (EMRFS) 上的資料](#emrfs-encryption)
+ [加密叢集節點之儲存磁碟區上的資料](#emr-local-disk-encryption)
+ [加密內容](#emr-encryption-context)

## 加密 EMR 檔案系統 (EMRFS) 上的資料
<a name="emrfs-encryption"></a>

Amazon EMR 叢集使用兩個分散式檔案系統：
+ Hadoop 分散式檔案系統 (HDFS)。HDFS 加密不使用 AWS KMS中的 KMS 金鑰。
+ EMR 檔案系統 (EMRFS)。EMRFS 是 HDFS 實作，可讓 Amazon EMR 叢集將資料存放在 Amazon Simple Storage Service (Amazon S3) 中。EMRFS 支援四種加密選項，其中兩種使用 AWS KMS中的 KMS 金鑰。如需所有四個 EMRFS 加密選項的詳細資訊，請參閱《*Amazon EMR 管理指南*》中的[加密選項](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-data-encryption-options.html)。

使用 KMS 金鑰的兩個 EMRFS 加密選項使用 Amazon S3 提供的以下加密功能：
+ [使用伺服器端加密搭配 AWS Key Management Service (SSE-KMS) 保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。Amazon EMR 叢集會將資料傳送至 Simple Storage Service (Amazon S3)。Simple Storage Service (Amazon S3) 使用 KMS 金鑰來加密資料，然後將其儲存至 S3 儲存貯體。如需此操作如何進行的詳細資訊，請參閱[使用 SSE-KMS 加密 EMRFS 上資料的程序](#emrfs-encryption-sse-kms)。
+ [使用用戶端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html) (CSE-KMS)。Amazon EMR 中的資料在 AWS KMS key 下加密，然後將其傳送至 Simple Storage Service (Amazon S3) 進行儲存。如需此操作如何進行的詳細資訊，請參閱[使用 CSE-KMS 加密 EMRFS 上資料的程序](#emrfs-encryption-cse-kms)。

當您設定 Amazon EMR 叢集在 EMRFS 上使用 KMS 金鑰來加密資料時，您可以選擇您想要 Simple Storage Service (Amazon S3) 或 Amazon EMR 叢集使用的 KMS 金鑰。使用 SSE-KMS，您可以選擇具有別名 **aws/s3** 的 Amazon S3 AWS 受管金鑰 ，或您建立的對稱客戶受管金鑰。使用用戶端加密時，您必須選擇您建立的對稱客戶受管金鑰。選擇客戶受管金鑰時，您必須確保 Amazon EMR 叢集具有使用 KMS 金鑰的許可。如需詳細資訊，請參閱《*Amazon EMR 管理指南*》中的[使用 AWS KMS keys 進行加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-enable.html#emr-awskms-keys)。

對於伺服器端和用戶端加密，您選擇的 KMS 金鑰是[信封加密](kms-cryptography.md#enveloping)工作流程中的根金鑰。資料會使用在 KMS 金鑰下加密的唯一[資料](data-keys.md)金鑰進行加密 AWS KMS。加密的資料及其資料金鑰的加密副本會以單一加密物件一起存放在 S3 儲存貯體中。如需其如何運作的詳細資訊，請參閱下列主題。

**Topics**
+ [使用 SSE-KMS 加密 EMRFS 上資料的程序](#emrfs-encryption-sse-kms)
+ [使用 CSE-KMS 加密 EMRFS 上資料的程序](#emrfs-encryption-cse-kms)

### 使用 SSE-KMS 加密 EMRFS 上資料的程序
<a name="emrfs-encryption-sse-kms"></a>

設定 Amazon EMR 叢集使用 SSE-KMS 時，加密程序的運作方式如下：

1. 叢集將資料傳送至 Amazon S3 以便儲存在 S3 儲存貯體中。

1. Amazon S3 將 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 請求傳送至 AWS KMS，指定您在將叢集設定為使用 SSE-KMS 時所選 KMS 金鑰的金鑰 ID。請求包含加密內容；如需詳細資訊，請參閱[加密內容](#emr-encryption-context)。

1. AWS KMS 會產生唯一的資料加密金鑰 （資料金鑰），然後將此資料金鑰的兩個副本傳送至 Amazon S3。一個複本是未加密的 (純文字)，另一個複本則透過 KMS 金鑰加密。

1. Amazon S3 使用純文字資料金鑰來加密它在步驟 1 收到的資料，然後在使用後盡快從記憶體移除純文字資料金鑰。

1. Amazon S3 將加密的資料及資料金鑰的加密複本以單一加密物件一起存放在 S3 儲存貯體中。

解密程序的運作方式如下：

1. 叢集向 S3 儲存貯體請求加密的資料物件。

1. Amazon S3 從 S3 物件擷取加密的資料金鑰，然後使用 AWS KMS [解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求將加密的資料金鑰傳送至 。此請求包含[加密內容](encrypt_context.md)。

1. AWS KMS 使用用來加密的相同 KMS 金鑰來解密加密的資料金鑰，然後將解密的 （純文字） 資料金鑰傳送至 Amazon S3。

1. Amazon S3 使用純文字資料金鑰來解密加密的資料，然後在使用後盡快從記憶體移除純文字資料金鑰。

1. Amazon S3 將解密的資料傳送給叢集。

### 使用 CSE-KMS 加密 EMRFS 上資料的程序
<a name="emrfs-encryption-cse-kms"></a>

設定 Amazon EMR 叢集使用 CSE-KMS 時，加密程序的運作方式如下：

1. 準備好將資料存放在 Amazon S3 時，叢集會傳送 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 請求至 AWS KMS，指定您在將叢集設定為使用 CSE-KMS 時所選 KMS 金鑰的金鑰 ID。請求包含加密內容；如需詳細資訊，請參閱[加密內容](#emr-encryption-context)。

1. AWS KMS 會產生唯一的資料加密金鑰 （資料金鑰），然後將此資料金鑰的兩個副本傳送至叢集。一個複本是未加密的 (純文字)，另一個複本則透過 KMS 金鑰加密。

1. 叢集使用純文字資料金鑰來加密資料，然後在使用後盡快從記憶體移除純文字資料金鑰。

1. 叢集將加密的資料及資料金鑰的加密副本合併為單一加密物件。

1. 叢集將加密的物件傳送到 Amazon S3 以便儲存。

解密程序的運作方式如下：

1. 叢集向 S3 儲存貯體請求加密的資料物件。

1. Amazon S3 傳送加密的物件給叢集。

1. 叢集會從加密的物件擷取加密的資料金鑰，然後使用 AWS KMS [解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求將加密的資料金鑰傳送至 。此請求包含[加密內容](encrypt_context.md)。

1. AWS KMS 使用用來加密的相同 KMS 金鑰來解密加密的資料金鑰，然後將解密的 （純文字） 資料金鑰傳送至叢集。

1. 叢集使用純文字資料金鑰來解密加密的資料，然後在使用後盡快從記憶體移除純文字資料金鑰。

## 加密叢集節點之儲存磁碟區上的資料
<a name="emr-local-disk-encryption"></a>

Amazon EMR 叢集是 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的集合。叢集中的每個執行個體稱為*叢集節點*或*節點*。每個節點可以有兩種類型的儲存磁碟區：執行個體存放磁碟區和 Amazon Elastic Block Store (Amazon EBS) 磁碟區。您可以設定叢集為使用 [Linux 統一金鑰設定 (LUKS)](https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md) 來加密節點上的這兩種儲存磁碟區類型 (但不包含每個節點的開機磁碟區)。這稱為*本機磁碟加密*。

當您啟用叢集的本機磁碟加密時，可以選擇使用 AWS KMS中的 KMS 金鑰來加密 LUKS 金鑰。您必須選擇您建立的[客戶受管金鑰](concepts.md#customer-mgn-key)，您無法使用 [AWS 受管金鑰](concepts.md#aws-managed-key)。如果選擇客戶受管金鑰，則您必須確保 Amazon EMR 叢集具有使用 KMS 金鑰的許可。如需詳細資訊，請參閱《*Amazon EMR 管理指南*》中的[使用 AWS KMS keys 進行加密](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-encryption-enable.html#emr-awskms-keys)。

當您啟用使用 KMS 金鑰的本機磁碟加密，加密程序的運作方式如下：

1. 當每個叢集節點啟動時，它會傳送 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 請求給 AWS KMS，指定您在為叢集啟用本機磁碟加密時選擇的 KMS 金鑰的金鑰 ID。

1. AWS KMS 會產生唯一的資料加密金鑰 （資料金鑰），然後將此資料金鑰的兩個副本傳送至節點。一個複本是未加密的 (純文字)，另一個複本則透過 KMS 金鑰加密。

1. 節點使用純文字資料金鑰的 base64 編碼版本做為保護 LUKS 金鑰的密碼。節點將資料金鑰的加密副本儲存在開機磁碟區。

1. 如果節點重新啟動，重新啟動的節點會使用 AWS KMS [解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求將加密的資料金鑰傳送至 。

1. AWS KMS 使用用來加密的相同 KMS 金鑰來解密加密的資料金鑰，然後將解密的 （純文字） 資料金鑰傳送至節點。

1. 節點使用純文字資料金鑰的 base64 編碼版本做為解鎖 LUKS 金鑰的密碼。

## 加密內容
<a name="emr-encryption-context"></a>

與 整合的每個 AWS 服務 AWS KMS 都可以在服務 AWS KMS 用來產生資料金鑰或加密或解密資料時指定加密[內容](encrypt_context.md)。加密內容是額外的驗證資訊， AWS KMS 用於檢查資料完整性。當服務指定加密操作的加密內容，它必須為相對應的解密操作指定相同的加密內容，否則解密將失敗。加密內容也會寫入 AWS CloudTrail 日誌檔案，這可協助您了解使用特定 KMS 金鑰的原因。

以下章節說明使用 KMS 金鑰之每個 Amazon EMR 加密案例所用的加密內容。

### 使用 SSE-KMS 進行 EMRFS 加密的加密內容
<a name="emr-encryption-context-sse-kms"></a>

透過 SSE-KMS，Amazon EMR 叢集會傳送資料至 Amazon S3，接著 Amazon S3 使用 KMS 金鑰加密資料，然後將其儲存到 S3 儲存貯體。在此情況下，Amazon S3 會使用 S3 物件的 Amazon Resource Name (ARN) 作為加密內容，其中包含其傳送的每個 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 請求 AWS KMS。以下範例顯示 Amazon S3 所用加密內容的 JSON 顯示方式。

```
{ "aws:s3:arn" : "arn:aws:s3:::S3_bucket_name/S3_object_key" }
```

### 使用 CSE-KMS 進行 EMRFS 加密的加密內容
<a name="emr-encryption-context-cse-kms"></a>

透過 CSE-KMS，Amazon EMR 叢集使用 KMS 金鑰加密資料，然後將其傳送到 Amazon S3 儲存貯體儲存。在此情況下，叢集會使用 KMS 金鑰的 Amazon Resource Name (ARN) 做為加密內容，其中包含其傳送的每個 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 請求 AWS KMS。以下範例顯示叢集所用加密內容的 JSON 顯示方式。

```
{ "kms_cmk_id" : "arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef" }
```

### 使用 LUKS 進行本機磁碟加密的加密內容
<a name="emr-encryption-context-luks"></a>

當 Amazon EMR 叢集使用搭配 LUKS 的本機磁碟加密時，叢集節點不會指定加密內容，其中包含其傳送至 AWS KMS的 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 請求。