データの暗号化に必要なキーと証明書を作成する - 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 または AWS SDK を使用して適切なキーポリシーをアタッチできます。

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

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

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

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

次の手順では、 を使用して、デフォルトの Amazon EMR サービスロールをキーユーザー EMR_DefaultRoleとして AWS Management Console 追加する方法について説明します。既に 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. 左サイドバーで [Customer managed keys] (カスタマー管理型のキー) を選択します。

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

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

  6. 「キーユーザーの追加」セクションで、適切なロールを選択します。Amazon EMR のデフォルトのサービスロールの名前は ですEMR_DefaultRole

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

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

セキュリティ設定を使用する場合は、ローカルディスク暗号化と Amazon S3 暗号化用に異なるプロバイダークラス名を指定する必要があります。カスタムキープロバイダーの要件は、ローカルディスク暗号化と Amazon S3 暗号化のどちらを使用するか、および Amazon EMR リリースバージョンによって異なります。

カスタムキープロバイダーの作成時に使用する暗号化のタイプに応じて、アプリケーションは異なる EncryptionMaterialsProvider インターフェイスも実装する必要があります。どちらのインターフェイスも AWS SDK for Java バージョン 1.11.0 以降で使用できます。

実装用の暗号化マテリアルを提供するには、任意の戦略を使用できます。例えば、静的暗号化マテリアルを提供するか、より複雑なキー管理システムと統合するかを選択できます。

Amazon S3 暗号化を使用している場合は、カスタム暗号化マテリアルに暗号化アルゴリズム AES/GCM/NoPadding を使用する必要があります。

ローカルディスク暗号化を使用している場合、カスタム暗号化マテリアルに使用する暗号化アルゴリズムは EMR リリースによって異なります。Amazon EMR 7.0.0 以前では、AES/GCM/NoPadding を使用する必要があります。Amazon EMR 7.1.0 以降では、AES を使用する必要があります。

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

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

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

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

EncryptionMaterialsProvider リファレンス実装を以下に示します。別のカスタムプロバイダーである EMRFSRSA EncryptionMaterialsプロバイダー は、 から入手できます 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 ファイルを指定し、アプリケーションで宣言したプロバイダーの完全なクラス名を提供します。クラスは、 AWS SDK for Java バージョン 1.11.0 以降で利用可能な TLSArtifactsProvider インターフェイスを実装する必要があります。

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