AWS Key Management Service
開発者ガイド

Amazon EMR で AWS KMS を使用する方法

Amazon EMR クラスターを使用すると、永続的ストレージに保存する前に、保存データを暗号化するようにクラスターを設定できます。保存データは、EMR ファイルシステム (EMRFS) かクラスターノードのストレージボリューム、またはその両方で暗号化できます。保存データを暗号化するには、AWS KMS でカスタマーマスターキー (CMK) を使用します。以下のトピックでは、Amazon EMR クラスターで CMK を使用して保存データを暗号化する方法について説明します。

また、Amazon EMR クラスターでは、送信中のデータの暗号化も行われるため、データはクラスターで暗号化されてから、ネットワークを介して送信されます。CMK を使用して、送信中のデータを暗号化することはできません。詳細については、Amazon EMR 管理ガイドの「伝送時のデータ暗号化」を参照してください。

Amazon EMR で利用できるすべての暗号化オプションの詳細については、Amazon EMR 管理ガイドの「暗号化オプション」を参照してください。

EMR ファイルシステム (EMRFS) のデータを暗号化する

Amazon EMR クラスターでは、次の 2 種類の分散ファイルシステムを使用しています。

  • Hadoop Distributed File System (HDFS)HDFS 暗号化では、AWS KMS の CMK は使用しません。

     

  • EMR ファイルシステム (EMRFS)EMRFS は、Amazon EMR クラスターでデータを Amazon Simple Storage Service (Amazon S3) に保存できるようにする HDFS の実装です。EMRFS は、4 種類の暗号化オプションをサポートしており、そのうち 2 種類は、AWS KMS の CMK を使用します。4 種類すべての EMRFS の暗号化オプションの詳細については、Amazon EMR 管理ガイドの「暗号化オプション」を参照してください。

CMK を使用する 2 種類の EMRFS 暗号化オプションでは、以下の Amazon S3 の暗号化機能を使用しています。

Amazon EMR クラスターを設定して、SSE-KMS または CSE-KMS で EMRFS のデータを暗号化する際は、Amazon S3 または Amazon EMR クラスターで使用する AWS KMS の CMK を選択します。SSE-KMS を使用すると、エイリアス aws/s3 または作成したカスタム CMK を使用して、Amazon S3 の AWS 管理 CMK を選択できます。CSE-KMS では、作成するカスタム CMK を選択する必要があります。カスタム CMK を選択する際は、Amazon EMR クラスターにその CMK の使用権限があることを確認する必要があります。詳細については、Amazon EMR 管理ガイドの「暗号化のための AWS KMS カスタマーマスターキー(CMK) の使用」を参照してください。

SSE-KMS と CSE-KMS の両方を使用する場合は、選択した CMK は、エンベロープ暗号化ワークフローのマスターキーとなります。データは一意のデータ暗号化キー (またはデータキー) で暗号化され、このデータキーは AWS KMS の CMK で暗号化されることになります。暗号化されたデータとその暗号化されたデータキーのコピーは、1 つの暗号化オブジェクトとして S3 バケットに一緒に保存されます。この仕組みについては、次のトピックを参照してください。

SSE-KMS を用いて EMRFS のデータを暗号化するプロセス

Amazon EMR クラスターを構成して、SSE-KMS を使用する場合、暗号化プロセスは次のようになります。

  1. クラスターから Amazon S3 にデータが送信され、S3 バケットのストレージに保存されます。

  2. Amazon S3 から AWS KMS に GenerateDataKey リクエストが送信され、SSE-KMS を使用するためにクラスターを設定した際に選択した CMK のキー ID が指定されます。リクエストには暗号化コンテキストが含まれます。詳細については、「暗号化コンテキスト」を参照してください。

  3. AWS KMS で一意のデータ暗号化キー (データキー) が生成され、このデータキーの 2 つのコピーが Amazon S3 に送信されます。コピーのうち一方は、暗号化されていない形式 (プレーンテキスト) で、もう一方は CMK で暗号化されます。

  4. ステップ 1 で受け取ったデータは、Amazon S3 でプレーンテキストデータキーを使用して暗号化され、使用後はできるだけ早くメモリから削除されます。

  5. Amazon S3 では、暗号化されたデータとその暗号化されたデータキーのコピーは、1 つの暗号化オブジェクトとして S3 バケットに一緒に保存されます。

この復号プロセスは、次のように行われます。

  1. クラスターは、暗号化されたデータオブジェクトを S3 バケットへ要求します。

  2. Amazon S3 は、S3 オブジェクトから暗号化データを取得し、次に Decrypt リクエストで暗号化データキーを AWS KMS に送信します。リクエストには暗号化コンテキストが含まれます。

  3. AWS KMS では、暗号化に使用したものと同一の CMK を使用して暗号化データキーを復号し、その後、復号 (プレーンテキスト) データキーを Amazon S3 に送信します。

  4. Amazon S3 は、プレーンテキストデータキーを使用して暗号化データを復号し、使用後できるだけ早くそのプレーンテキストデータキーをメモリから削除します。

  5. Amazon S3 は、復号されたデータをクラスターに送信します。

CSE-KMS を用いて EMRFS のデータを暗号化するプロセス

Amazon EMR クラスターを構成して、CSE-KMS を使用する場合、暗号化プロセスは次のようになります。

  1. Amazon S3 にデータを保存する準備ができたら、クラスターは GenerateDataKey リクエストを AWS KMS に送信して、CSE-KMS を使用するためにクラスターを構成した際に選択した CMK のキー ID を指定します。リクエストには暗号化コンテキストが含まれます。詳細については、「暗号化コンテキスト」を参照してください。

  2. AWS KMS は、一意のデータ暗号化キー (データキー) を生成し、このデータキーの 2 つのコピーをクラスターに送信します。コピーのうち一方は、暗号化されていない形式 (プレーンテキスト) で、もう一方は CMK で暗号化されます。

  3. クラスターは、プレーンテキストデータキーを使用してデータを暗号化し、使用後できるだけ早くそのプレーンテキストデータキーをメモリから削除します。

  4. クラスターは、暗号化データと暗号化されたデータキーのコピーを 1 つの暗号化オブジェクトにまとめます。

  5. クライアントは、暗号化されたオブジェクトを Amazon S3 ストレージに送信します。

この復号プロセスは、次のように行われます。

  1. クラスターは、暗号化されたデータオブジェクトを S3 バケットへ要求します。

  2. Amazon S3 はその暗号化されたオブジェクトをクラスターに送信します。

  3. クラスターは、暗号化されたオブジェクトから暗号化されたデータキーを取得し、その後 Decrypt リクエストで暗号化されたデータキーを AWS KMS に送信します。リクエストには暗号化コンテキストが含まれます。

  4. AWS KMS は、暗号化に使用したものと同一の CMK を使用して暗号化データキーを復号し、その後、復号 (プレーンテキスト) データキーをクラスターに送信します。

  5. クラスターは、そのプレーンテキストデータキーを使用して、暗号化されたデータを復号し、使用後できるだけ早くプレーンテキストデータキーをメモリから削除します。

クラスターノードのストレージボリュームのデータを暗号化する

Amazon EMR クラスターとは、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのコレクションのことです。クラスター内のインスタンスはそれぞれ、クラスターノードまたはノードと呼ばれます。各ノードに対して、インスタンスストアボリュームと Amazon Elastic Block Store (Amazon EBS) ボリュームの 2 種類のストレージボリュームを設定できます。これらのノードでストレージボリュームをいずれも暗号化するには、クラスターを構成して、Linux Unified Key Setup (LUKS) を使用できます (各ノードの起動ボリュームは不可)。これは、ローカルディスクの暗号化と呼ばれます。

クラスター向けにローカルディスクの暗号化を有効にすると、AWS KMS の CMK を使用して、LUKS マスターキーを暗号化できます。作成するカスタム CMK を選択する必要があります。AWS 管理型 CMK を使用することはできません。カスタム CMK を選択する際は、Amazon EMR クラスターにその CMK の使用権限があることを確認する必要があります。詳細については、Amazon EMR 管理ガイドの「暗号化のための AWS KMS カスタマーマスターキー(CMK) の使用」を参照してください。

CMK を使用してローカルディスクの暗号化を有効にする場合、暗号化プロセスは次のようになります。

  1. 各クラスターノードが起動すると、GenerateDataKey リクエストが AWS KMS に送信され、クラスターのローカルディスクの暗号化を有効にした際に選択した CMK のキー ID が指定されます。

  2. AWS KMS は、一意のデータ暗号化キー (データキー) を生成し、このデータキーの 2 つのコピーをノードに送信します。コピーのうち一方は、暗号化されていない形式 (プレーンテキスト) で、もう一方は CMK で暗号化されます。

  3. このノードでは、LUKS マスターキーを保護するパスワードとして、base64 コードのプレーンテキストデータキーを使用しています。ノードは、暗号化されたデータキーのコピーを起動ボリュームに保存します。

  4. ノードが再起動すると、暗号化されたデータキーは、再起動したノードより Decrypt リクエストで AWS KMS に送信されます。

  5. AWS KMS は、暗号化に使用したものと同一の CMK を使用して暗号化データキーを復号し、その後、復号 (プレーンテキスト) データキーをノードに送信します。

  6. このノードでは、LUKS マスターキーのロックを解除するパスワードとして、base64 コードのプレーンテキストデータキーを使用しています。

暗号化コンテキスト

AWS KMS を使用して、データキーを生成するか、またはデータの暗号化または復号化を行う際、AWS KMS に統合されている各 AWS サービスでは、暗号化コンテキストを指定できます。暗号化コンテキストは、データの整合性を調べるために AWS KMS で使用される追加の認証情報です。サービスにおいて、暗号化操作のために暗号化コンテキストを指定する際、復号操作と同じ暗号コンテキストを指定する必要があります。指定しない場合は復号できません。また、暗号化コンテキストは、AWS CloudTrail ログファイルにも書き込まれるため、所定の CMK キーが使用された原因を理解するのに役立ちます。

以下のセクションでは、CMK を使用する各 Amazon EMR 暗号化のシナリオで使用されている暗号化コンテキストについて説明します。

SSE-KMS を使用した EMRFS 暗号化に使用する暗号化コンテキスト

SSE-KMS を使用すると、Amazon EMR クラスターから Amazon S3 にデータが送信され、Amazon S3 で CMK を使用してそのデータを暗号化してから、S3 バケットに保存されます。この場合、Amazon S3 は、AWS KMS に送信する GenerateDataKey および Decrypt リクエストそれぞれを含む暗号化コンテキストとして、S3 オブジェクトの Amazon リソースネーム (ARN) を使用します。次の例は、Amazon S3 が使用する暗号化コンテキストの JSON 表現を示しています。

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

CSE-KMS を使用した EMRFS 暗号化の暗号化コンテキスト

CSE-KMS を使用すると、Amazon EMR クラスターで CMK を使用してデータを暗号化してから、Amazon S3 ストレージに送信されます。この場合、クラスターは、AWS KMS に送信される GenerateDataKey および Decrypt リクエストそれぞれを含む暗号化コンテキストとして、CMK の Amazon リソースネーム (ARN) を使用します。次の例では、クラスターが使用する暗号化コンテキストの JSON 表現を示します。

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

LUKS を用いたローカルディスク暗号化に使用する暗号化コンテキスト

Amazon EMR クラスターが LUKS を用いてローカルディスクの暗号化を使用する際、クラスターノードは、AWS KMS に送信される GenerateDataKey および Decrypt リクエストで暗号化コンテキストを指定しません。