データの暗号化に必要なキーと証明書を作成する - 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 ロールの設定」を参照してください。

を使用して、指定した KMS キーのキーユーザーのリストにインスタンスプロファイルまたは EC2 インスタンスプロファイルを追加できます。または AWS SDK を使用して適切なキーポリシーをアタッチすることもできます。AWS Management Console AWS CLI

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

以下の手順では、EMR_EC2_DefaultRoleを使用してキーユーザーとしてデフォルトの Amazon EMR インスタンスプロファイルを追加する方法について説明します。AWS Management ConsoleKMS キーが既に作成されていることを前提としています。新しい 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. [追加] を選択します。

KMS キーに権限を追加して EBS 暗号化を有効にします。

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

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

以下の手順では、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. [追加] を選択します。

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

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

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

カスタム暗号化素材に使用する暗号化アルゴリズムは AES/GCM/ でなければなりません。NoPadding

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

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

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

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

EncryptionMaterialsProvider リファレンス実装を以下に示します。EMRFSRSA という別のカスタムプロバイダーはEncryptionMaterialsProvider、から入手できます。 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 以降で使用可能な TLS ArtifactsProvider インターフェースを実装する必要があります。AWS 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 クラスター設定の詳細については、を参照してください。ネットワークを設定する

次の例は、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