データの暗号化に必要なキーと証明書を作成する - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

データの暗号化に必要なキーと証明書を作成する

セキュリティ設定を使用して暗号化オプションを指定する場合は、その前に、キーや暗号化アーティファクトの提供元として使用したいプロバイダーを決定します。たとえば、AWS KMS またはご自身で作成したカスタムプロバイダーを使用できます。次に、このセクションで説明する方法に沿ってキーまたはキープロバイダーを作成します。

Amazon EMR を使用した保管中のデータを暗号化するためのキーの提供

Amazon EMR での保管時のデータの暗号化に、AWS Key Management Service (AWS KMS) またはカスタムキープロバイダーを使用できます。AWS KMS を使用するときは、ストレージと暗号化キーの使用に対して料金が適用されます。詳細については、「AWS KMS 料金表」を参照してください。

このトピックでは、Amazon EMR で使用する KMS キーのキーポリシーの詳細と、Amazon S3 暗号化のカスタムキープロバイダークラスを作成するためのガイドラインおよびコードサンプルを示します。キーの作成の詳細については、「AWS Key Management Service デベロッパーガイド」の「キーの作成」を参照してください。

を使用するAWS KMS keysの暗号化

AWS KMS 暗号化キーは、Amazon EMR クラスターインスタンス、および EMRFS で使用する Amazon S3 バケットと同じリージョンに作成する必要があります。指定するキーが、クラスターの設定に使用するアカウントとは異なるアカウントにある場合は、その 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指定した KMS キーのキーユーザーのリストにインスタンスプロファイルまたは EC2 インスタンスプロファイルを追加するには、AWS CLIまたはAWSSDK を使用して、適切なキーポリシーをアタッチします。

Amazon EMR は、対称 KMS キーのみをサポートします。非対称 KMS キーを使用して、Amazon EMR クラスター内の保管中のデータを暗号化することはできません。KMS キーが対称か非対称かを判別するには、「対称および非対称 KMS キーを識別する」を参照してください。

以下の手順では、AWS Management Console を使用して、キーユーザーとしてデフォルトの EMR インスタンスプロファイル EMR_EC2_DefaultRole を追加する方法について説明します。既に KMS キーが作成されていることを前提としています。新規の KMS キーを作成するには、を参照してください。キーの作成AWS Key Management Serviceデベロッパーガイド

暗号化キーユーザーのリストに Amazon EMR の EC2 インスタンスプロファイルを追加するには

  1. AWS Management Console にサインインし、AWS Key Management Service (AWS KMS) コンソール (https://console.aws.amazon.com/kms) を開きます。

  2. AWS リージョン を変更するには、ページの右上隅にあるリージョンセレクターを使用します。

  3. 変更する KMS キーのエイリアスを選択します。

  4. [Key Users] のキーの詳細ページで、[Add] を選択します。

  5. [Add key users] ダイアログボックスで、適切なロールを選択します。デフォルトロールの名前は EMR_EC2_DefaultRole です。

  6. [Add] (追加) を選択します。

KMS キーに追加のアクセス許可を提供して EBS 暗号化を有効にする

Amazon EMR バージョン 5.24.0 から、セキュリティ設定オプションを使用して EBS ルートデバイスとストレージボリュームを暗号化できます。このようなオプションを有効にするには、AWS KMS をキープロバイダーとして指定する必要があります。さらに、EMR サービスロールを付与する必要があります。EMR_DefaultRoleを使用するアクセス許可を持つAWS KMS keyあなたが指定することを指定します。

♪AWS Management Console指定した KMS キーのキーユーザーのリストに EMR サービスロールを追加するには、AWS CLIまたはAWSSDK を使用して、適切なキーポリシーをアタッチします。

以下の手順では、AWS Management Console を使用して、キーユーザーとしてデフォルトの EMR サービスロール EMR_DefaultRole を追加する方法について説明します。既に KMS キーが作成されていることを前提としています。新規の KMS キーを作成するには、を参照してください。キーの作成AWS Key Management Serviceデベロッパーガイド

暗号化キーユーザーのリストに EMR サービスロールを追加するには

  1. AWS Management Console にサインインし、AWS Key Management Service (AWS KMS) コンソール (https://console.aws.amazon.com/kms) を開きます。

  2. AWS リージョン を変更するには、ページの右上隅にあるリージョンセレクターを使用します。

  3. 左サイドバーで [Customer managed keys] (カスタマー管理型のキー) を選択します。

  4. 変更する KMS キーのエイリアスを選択します。

  5. [Key Users] のキーの詳細ページで、[Add] を選択します。

  6. [Add key users] ダイアログボックスで、適切なロールを選択します。デフォルトの EMR サービスロールの名前は EMR_DefaultRole です。

  7. [Add] (追加) を選択します。

カスタムキープロバイダーの作成

セキュリティ設定を使用する場合は、ローカルディスク暗号化と Amazon S3 暗号化用に異なるプロバイダークラス名を指定する必要があります。

カスタムキープロバイダを作成するときに、アプリケーションは、AWS SDK for Java バージョン 1.11.0 以降で使用できる EncryptionMaterialsProvider インターフェイスを実装することが想定されています。実装では、任意の戦略を使用して暗号化マテリアルを提供できます。例えば、静的暗号化マテリアルを提供することも、より複雑な鍵管理システムと統合することも選択できます。

カスタム暗号化マテリアルに使用される暗号化アルゴリズムは、AES/GCM/NoPadding であることが必要です。

- EncryptionMaterialsProvider クラスは、暗号化コンテキストによって暗号化マテリアルを取得します。Amazon EMR は、呼び出し元が返す正しい暗号化マテリアルを判別しやすいように、実行時に暗号化コンテキスト情報を設定します。

例: EMRFS での Amazon S3 の暗号化にカスタムキープロバイダーを使用する

Amazon EMR が EncryptionMaterialsProvider クラスから暗号化マテリアルをフェッチして暗号化を実行するとき、EMRFS はオプションで materialsDescription 引数に 2 つのフィールド (オブジェクトの Amazon S3 URI と) を設定します。 JobFlowId クラスタの。EncryptionMaterialsProvider クラスが使用して、暗号化マテリアルを選択的に返すことができます。

たとえば、プロバイダは Amazon S3 URI プレフィックスごとに異なるキーを返すことができます。最終的に Amazon S3 オブジェクトに保存されるのは、EMRFS によって生成され、プロバイダに渡される materialsDescription 値ではなく、返された暗号化マテリアルの記述です。Amazon S3 オブジェクトの復号化中に、暗号化マテリアルの記述が EncryptionMaterialsProvider クラスに渡されるため、オブジェクトを複合するために一致するキーを再度選択的に返すことができます。

An 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 EMR リリースバージョン 4.8.0 以降では、下記の 2 つのオプションのいずれかにより、セキュリティ設定を使用して転送中のデータを暗号化するのに必要なアーティファクトを指定できます。

  • 手動で PEM 証明書を作成し、zip ファイルに含め、Amazon S3 から zip ファイルを参照できます。

  • Java クラスとしてカスタム証明書プロバイダーを実装できます。Amazon S3 でアプリケーションの JAR ファイルを指定し、アプリケーションで宣言したプロバイダーの完全なクラス名を提供します。このクラスには、 バージョン 1.11.0 から利用可能な TLSArtifactsProviderAWS SDK for Java インターフェイスを実装する必要があります。

Amazon EMR はクラスターの各ノードに自動的にアーティファクトをダウンロードし、その後、それらのアーティファクトを使用してオープンソースの伝送中の暗号化機能を実装します。使用できるオプションの詳細については、転送中の暗号化を参照してください。

PEM 証明書の使用

zip ファイルを指定して転送中のデータを暗号化する場合、セキュリティ設定は、zip ファイル内の PEM ファイルに下記の名前が正確に付されていることを要求します。

伝送中の暗号化証明書
ファイル名 必須/オプション 詳細
privateKey.pem 必須 プライベートキー
certificateChain.pem 必須 証明書チェーン
trustedCertificates.pem 任意 提供された証明書が、Java のデフォルトの信頼されたルート証明機関 (CA) によって証明されていない場合、または Java のデフォルトの信頼されたルート CA にリンクできる中間 CA によって署名されていない場合は必須です。Java のデフォルトの信頼されたルート CA は、jre/lib/security/cacerts にあります。

プライベートキー PEM ファイルは、クラスターインスタンスが存在する Amazon VPC ドメインへのアクセスを有効にするワイルドカード証明書として設定するようにします。たとえば、クラスターが us-east-1 (N. Virginia) に存在する場合、証明書件名定義で CN=*.ec2.internal を指定して、クラスターへのアクセスが可能になるよう、証明書設定で共通の名前を指定することができます。クラスターが us-west-2 (オレゴン) に存在する場合、CN=*.us-west-2.compute.internal を指定できます。

暗号化アーティファクト内の提供された PEM ファイルのドメインの CN にワイルドカード文字が含まれていない場合は、hadoop.ssl.hostname.verifier の値を ALLOW_ALL に変更する必要があります。これを行うには、クラスターに設定を送信するときに core-site 分類を使用するか、core-site.xml ファイルでこの値を追加します。デフォルトのホスト名検証でワイルドカードなしのホスト名が受け入れられず、エラーになるため、この変更が必要です。Amazon VPC 内の EMR クラスター設定の詳細については、「Select an Amazon VPC subnet for the cluster」を参照してください。

次の例は、OpenSSL を使用して、1024-bit RSA プライベートキーの自己署名 X.509 証明書を生成する方法を示しています。キーにより、共通名として *.us-west-2.compute.internal ドメイン名で指定された us-west-2 (オレゴン) リージョンにある発行者の Amazon EMR クラスターインスタンスへのアクセスが可能になります。

国 (C)、州 (S) およびロケール (L) といった他のオプション項目も指定されます。自己署名証明書が生成されるため、例の 2 番目のコマンドでは、certificateChain.pem ファイルを trustedCertificates.pem ファイルにコピーします。3 番目のコマンドでは、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