使用 Amazon 建立資料加密的金鑰和憑證 EMR - Amazon EMR

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

使用 Amazon 建立資料加密的金鑰和憑證 EMR

使用安全組態指定加密選項之前,決定您想要使用的金鑰和加密成品提供者。例如,您可以使用 AWS KMS 或您建立的自訂提供者。接著,如本區段所述,建立金鑰或金鑰提供者。

提供用於加密靜態資料的金鑰

您可以在 Amazon 中使用 AWS Key Management Service (AWS KMS) 或自訂金鑰提供者進行靜態資料加密EMR。當您使用 時 AWS KMS,儲存和使用加密金鑰會收取費用。如需詳細資訊,請參閱 AWS KMS 定價

本主題提供與 Amazon 搭配使用之KMS金鑰的金鑰政策詳細資訊EMR,以及撰寫 Amazon S3 加密自訂金鑰提供者類別的指導方針和程式碼範例。如需有關建立金鑰的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的建立金鑰

使用 AWS KMS keys 進行加密

AWS KMS 加密金鑰必須在與您的 Amazon EMR叢集執行個體和與 搭配使用的 Amazon S3 儲存貯體相同的區域中建立EMRFS。如果您指定的金鑰位於與您用來設定叢集的金鑰不同的帳戶中,您必須使用其 來指定金鑰ARN。

Amazon EC2執行個體設定檔的角色必須具有使用您指定KMS金鑰的許可。Amazon 中執行個體設定檔的預設角色EMR為 EMR_EC2_DefaultRole。如果您為執行個體設定檔使用不同的角色,或為 Amazon S3 EMRFS的請求使用IAM角色,請確定每個角色都適當地新增為主要使用者。這給予角色使用 KMS金鑰的許可。如需詳細資訊,請參閱AWS Key Management Service 開發人員指南中的使用金鑰政策,以及為 Amazon S3 的EMRFS請求設定IAM角色

您可以使用 AWS Management Console 將執行個體設定檔或EC2執行個體設定檔新增至指定KMS金鑰的金鑰使用者清單,或使用 AWS CLI 或 AWS SDK連接適當的金鑰政策。

請注意,Amazon 僅EMR支援對稱KMS金鑰 。您無法使用非對稱KMS金鑰來加密 Amazon EMR叢集中的靜態資料。如需協助判斷KMS金鑰是對稱或非對稱,請參閱識別對稱和非對稱KMS金鑰

下列程序說明如何使用 新增預設 Amazon EMR執行個體設定檔,EMR_EC2_DefaultRole做為金鑰使用者 AWS Management Console。它假設您已經建立KMS金鑰。若要建立新的KMS金鑰,請參閱 AWS Key Management Service 開發人員指南 中的建立金鑰

將 Amazon 的EC2執行個體設定檔EMR新增至加密金鑰使用者清單
  1. 登入 AWS Management Console 並在 https://console.aws.amazon.com/kms 開啟 AWS Key Management Service (AWS KMS) 主控台。

  2. 若要變更 AWS 區域,請使用頁面右上角的區域選擇器。

  3. 選取要修改之KMS金鑰的別名。

  4. Key Users (金鑰使用者) 下的金鑰詳細資訊頁面上,選擇 Add (新增)

  5. Add key users (新增金鑰使用者) 對話方塊中,選取適當的角色。預設角色的名稱為 EMR_EC2_DefaultRole

  6. 選擇新增

為KMS金鑰提供額外的許可以啟用EBS加密

從 Amazon 5.24.0 EMR版開始,您可以使用安全組態選項來加密EBS根裝置和儲存磁碟區。若要啟用此類選項,您必須指定 AWS KMS 作為金鑰提供者。此外,您必須授予EMR_DefaultRole具有許可的服務角色,才能使用 AWS KMS key 您指定的 。

您可以使用 AWS Management Console 將服務角色新增至指定KMS金鑰的金鑰使用者清單,或使用 AWS CLI 或 AWS SDK連接適當的金鑰政策。

下列程序說明如何使用 AWS Management Console 將預設 Amazon EMR服務角色新增EMR_DefaultRole金鑰使用者 。它假設您已經建立KMS金鑰。若要建立新的KMS金鑰,請參閱 AWS Key Management Service 開發人員指南 中的建立金鑰

將 Amazon EMR服務角色新增至加密金鑰使用者清單
  1. 登入 AWS Management Console 並在 https://console.aws.amazon.com/kms 開啟 AWS Key Management Service (AWS KMS) 主控台。

  2. 若要變更 AWS 區域,請使用頁面右上角的區域選擇器。

  3. 在左側邊欄選擇客戶受管金鑰

  4. 選取要修改之KMS金鑰的別名。

  5. Key Users (金鑰使用者) 下的金鑰詳細資訊頁面上,選擇 Add (新增)

  6. 新增金鑰使用者區段中,選取適當的角色。Amazon 預設服務角色的名稱EMR為 EMR_DefaultRole

  7. 選擇新增

建立自訂金鑰提供者

使用安全組態時,您必須為本機磁碟加密和 Amazon S3 加密指定不同的提供者類別名稱。自訂金鑰提供者的需求取決於您是否使用本機磁碟加密和 Amazon S3 加密,以及 Amazon EMR發行版本。

根據您在建立自訂金鑰提供者時使用的加密類型,應用程式也必須實作不同的 EncryptionMaterialsProvider 介面。適用於 Java 1.11.0 版及更新版本的 AWS SDK中,提供這兩個介面。

您可以使用任何策略為實作提供加密材料。例如,您可以選擇提供靜態加密材料,或與更複雜的金鑰管理系統整合。

如果您使用的是 Amazon S3 加密,則必須使用自訂加密材料AES/GCM/NoPadding的加密演算法。

如果您使用本機磁碟加密,則用於自訂加密資料的加密演算法會因EMR版本而異。對於 Amazon EMR 7.0.0 及更低版本,您必須使用 AES/GCM/NoPadding。對於 Amazon EMR 7.1.0 及更高版本,您必須使用 AES

EncryptionMaterialsProvider 類別會依加密內容取得加密資料。Amazon EMR 會在執行階段填入加密內容資訊,以協助來電者決定要傳回的正確加密資料。

範例:使用自訂金鑰提供者搭配 Amazon S3 加密 EMRFS

當 Amazon 從EncryptionMaterialsProvider 類別中EMR擷取加密材料以執行加密時, EMRFS會選擇性地將 materialsDescription 引數填入兩個欄位:物件URI的 Amazon S3 和叢集 JobFlowId 的 ,EncryptionMaterialsProvider 該類別可以選擇性地傳回加密材料。

例如,供應商可能會針對不同的 Amazon S3 URI字首傳回不同的金鑰。它是最終與 Amazon S3 物件一起存放的傳回加密材料的描述,而不是由 產生EMRFS並傳遞給提供者 materialsDescription 的值。解密 Amazon S3 物件時,加密材料描述會傳遞給 EncryptionMaterialsProvider 類別,以便再次選擇性地傳回相符的金鑰以解密物件。

EncryptionMaterialsProvider 參考實作提供如下。另一個自訂提供者 EMRFSRSAEncryptionMaterialsProvider可從 取得 GitHub。

import com.amazonaws.services.s3.model.EncryptionMaterials; import com.amazonaws.services.s3.model.EncryptionMaterialsProvider; import com.amazonaws.services.s3.model.KMSEncryptionMaterials; import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configuration; import java.util.Map; /** * Provides KMSEncryptionMaterials according to Configuration */ public class MyEncryptionMaterialsProviders implements EncryptionMaterialsProvider, Configurable{ private Configuration conf; private String kmsKeyId; private EncryptionMaterials encryptionMaterials; private void init() { this.kmsKeyId = conf.get("my.kms.key.id"); this.encryptionMaterials = new KMSEncryptionMaterials(kmsKeyId); } @Override public void setConf(Configuration conf) { this.conf = conf; init(); } @Override public Configuration getConf() { return this.conf; } @Override public void refresh() { } @Override public EncryptionMaterials getEncryptionMaterials(Map<String, String> materialsDescription) { return this.encryptionMaterials; } @Override public EncryptionMaterials getEncryptionMaterials() { return this.encryptionMaterials; } }

提供使用 Amazon 加密來EMR加密傳輸中資料的憑證

使用 Amazon EMR4.8.0 版或更新版本,您有兩個選項可指定成品,以使用安全組態加密傳輸中的資料:

  • 您可以手動建立PEM憑證,將其包含在 .zip 檔案中,然後在 Amazon S3 中參考 .zip 檔案。

  • 您可以實作自訂憑證提供者為 Java 類別。您可以在 Amazon S3 中指定應用程式JAR的檔案,然後提供在應用程式中宣告的提供者完整類別名稱。類別必須實作從 1.11.0 AWS SDK for Java 版開始可用的TLSArtifactsProvider介面。

Amazon EMR會自動將成品下載至叢集中的每個節點,稍後再使用成品實作開放原始碼傳輸中加密功能。如需可用選項的詳細資訊,請參閱「傳輸中加密」。

使用PEM憑證

當您為傳輸中加密指定 .zip 檔案時,安全組態預期 .zip 檔案中的PEM檔案會完全依照如下所示命名:

傳輸中加密憑證
檔案名稱 必要/選用 詳細資訊
privateKey.pem 必要 私有金鑰
certificateChain.pem 必要 憑證鏈
trustedCertificates.pem 選用 若提供的憑證不是由 Java 預設信任的根認證機構 (CA) 所簽署,或由可連結至 Java 預設信任根 CA 的中繼 CA 所簽署,則此為必要。Java 預設受信任根CAs可在 中找到jre/lib/security/cacerts

您可能想要將私有金鑰PEM檔案設定為萬用字元憑證,以允許存取叢集執行個體所在的 Amazon VPC網域。例如,如果您的叢集位於 us-east-1 (維吉尼亞北部),您可能會選擇在憑證組態中指定常見名稱,該組態會透過在憑證主體定義中指定 CN=*.ec2.internal,來允許存取該叢集。如果您的叢集位於 us-west-2 (奧勒岡),可以指定 CN=*.us-west-2.compute.internal

如果加密成品中提供的PEM檔案在網域的 CN 中沒有萬用字元,您必須將 的值變更為 hadoop.ssl.hostname.verifier ALLOW_ALL。在將組態提交至叢集或在 core-site.xml 檔案中新增此值時,可透過 core-site 分類來完成此操作。需要進行此變更,因為預設主機名稱驗證程式不會接受沒有萬用字元的主機名稱,從而導致錯誤。如需 Amazon 中EMR叢集組態的詳細資訊VPC,請參閱 在適用於 Amazon VPC的 中設定聯網 EMR

下列範例示範如何使用 OpenSSL 產生具有 1024 位元RSA私有金鑰的自我簽署 X.509 憑證。金鑰允許存取 us-west-2(奧勒岡) 區域中發行者的 Amazon EMR叢集執行個體,如*.us-west-2.compute.internal網域名稱指定為一般名稱。

也會指定選用的其他主體項目,例如國家/地區 (C)、州 (S)、地區 (L)。由於已經產生自我簽署憑證,範例中的第二個指令會將 certificateChain.pem 檔案複製到 trustedCertificates.pem 檔案。第三個指令會使用 zip 來建立包含憑證的 my-certs.zip 檔案。

重要

此範例 proof-of-concept僅為示範。自我簽署憑證並不建議使用,且可能具有安全風險。若為生產系統,請使用信任的憑證授權機構 (CA) 發行憑證。

$ openssl req -x509 -newkey rsa:1024 -keyout privateKey.pem -out certificateChain.pem -days 365 -nodes -subj '/C=US/ST=Washington/L=Seattle/O=MyOrg/OU=MyDept/CN=*.us-west-2.compute.internal' $ cp certificateChain.pem trustedCertificates.pem $ zip -r -X my-certs.zip certificateChain.pem privateKey.pem trustedCertificates.pem