Amazon EMR でデータ暗号化に必要なキーと証明書を作成する
セキュリティ設定を使用して暗号化オプションを指定する場合は、その前に、キーや暗号化アーティファクトの提供元として使用したいプロバイダーを決定します。たとえば、AWS KMS またはご自身で作成したカスタムプロバイダーを使用できます。次に、このセクションで説明する方法に沿ってキーまたはキープロバイダーを作成します。
保管中のデータ暗号化用キーの提供
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 インスタンスプロファイルを追加するには
-
AWS Management Console にサインインし、AWS Key Management Service (AWS KMS) コンソール (https://console.aws.amazon.com/kms
) を開きます。 -
AWS リージョン を変更するには、ページの右上隅にあるリージョンセレクターを使用します。
-
変更する KMS キーのエイリアスを選択します。
-
[Key Users] のキーの詳細ページで、[Add] を選択します。
-
[Add key users] ダイアログボックスで、適切なロールを選択します。デフォルトロールの名前は
EMR_EC2_DefaultRole
です。 -
[追加] を選択します。
KMS キーに追加のアクセス許可を提供して EBS 暗号化を有効にする
Amazon EMR バージョン 5.24.0 から、セキュリティ設定オプションを使用して 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 サービスロールを追加するには
-
AWS Management Console にサインインし、AWS Key Management Service (AWS KMS) コンソール (https://console.aws.amazon.com/kms
) を開きます。 -
AWS リージョン を変更するには、ページの右上隅にあるリージョンセレクターを使用します。
-
左サイドバーで [Customer managed keys] (カスタマー管理型のキー) を選択します。
-
変更する KMS キーのエイリアスを選択します。
-
[Key Users] のキーの詳細ページで、[Add] を選択します。
-
[キーユーザーの追加] セクションで、適切なロールを選択します。Amazon EMR のデフォルトのサービスロールの名前は
EMR_DefaultRole
です。 -
[追加] を選択します。
カスタムキープロバイダーの作成
セキュリティ設定を使用する場合は、ローカルディスク暗号化と Amazon S3 暗号化用に異なるプロバイダークラス名を指定する必要があります。カスタムキープロバイダーの要件は、ローカルディスク暗号化と Amazon S3 暗号化のどちらを使用するか、および Amazon EMR リリースバージョンによって異なります。
カスタムキープロバイダーの作成時に使用する暗号化のタイプに応じて、アプリケーションは異なる EncryptionMaterialsProvider インターフェイスを実装する必要があります。どちらのインターフェイスも AWS SDK for Java バージョン 1.11.0 以降で使用できます。
-
Amazon S3 暗号化を実装するには、com.amazonaws.services.s3.model.EncryptionMaterialsProvider インターフェイスを使用します。
-
ローカルディスク暗号化を実装するには、com.amazonaws.services.elasticmapreduce.spi.security.EncryptionMaterialsProvider インターフェイスを使用します。
任意の戦略を使用して実装に暗号化マテリアルを提供できます。例えば、静的暗号化マテリアルを提供することも、より複雑な鍵管理システムと統合することも選択できます。
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 引数に 2 つのフィールド (オブジェクトの Amazon S3 URI とクラスターの JobFlowId) を設定します。これらを EncryptionMaterialsProvider クラスで使用して、暗号化マテリアルを選択的に返すことができます。
たとえば、プロバイダは Amazon S3 URI プレフィックスごとに異なるキーを返すことができます。最終的に Amazon S3 オブジェクトに保存されるのは、EMRFS によって生成され、プロバイダに渡される materialsDescription 値ではなく、返された暗号化マテリアルの記述です。Amazon S3 オブジェクトの復号化中に、暗号化マテリアルの記述が EncryptionMaterialsProvider クラスに渡されるため、オブジェクトを複合するために一致するキーを再度選択的に返すことができます。
参照のための EncryptionMaterialsProvider 実装を次に示します。別のカスタムプロバイダ EMRFSRSAEncryptionMaterialsProvider
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 によって署名されていない証明書の提供をお勧めします。ワイルドカード証明書を使用したり、ホスト名の検証を無効にしたりしている場合、パブリック CA を使用することは推奨しません。 |
プライベートキー PEM ファイルは、クラスターインスタンスが存在する Amazon VPC ドメインへのアクセスを有効にするワイルドカード証明書として設定するようにします。たとえば、クラスターが us-east-1 (N. Virginia) に存在する場合、証明書件名定義で CN=*.ec2.internal
を指定して、クラスターへのアクセスが可能になるよう、証明書設定で共通の名前を指定することができます。クラスターが us-west-2 (オレゴン) に存在する場合、CN=*.us-west-2.compute.internal
を指定できます。
暗号化アーティファクト内の提供された PEM ファイルのドメインの共通名にワイルドカード文字が含まれていない場合は、hadoop.ssl.hostname.verifier
の値を ALLOW_ALL
に変更する必要があります。Amazon EMR リリース 7.3.0 以降でこれを行うには、クラスターに設定を送信するときに core-site
分類を追加します。7.3.0 より前のリリースでは、設定 "hadoop.ssl.hostname.verifier": "ALLOW_ALL"
を core-site.xml
ファイルに直接追加します。この変更は、クラスター内のすべてのホストがワイルドカードを使用するので、デフォルトのホスト名検証子がワイルドカードなしでホスト名を必要とするためです。Amazon VPC 内の EMR クラスター設定の詳細については、「Amazon EMR 用の VPC でネットワークを設定する」を参照してください。
次の例は、OpenSSL
ドメイン名で指定された *.us-west-2.compute.internal
us-west-2
(オレゴン) リージョンにある発行者の Amazon EMR クラスターインスタンスへのアクセスが可能になります。
国 (C)、州 (S) およびロケール (L) といった他のオプション項目も指定されます。自己署名証明書が生成されるため、例の 2 番目のコマンドでは、certificateChain.pem
ファイルを trustedCertificates.pem
ファイルにコピーします。3 番目のコマンドでは、zip
を使って証明書を含む my-certs.zip
ファイルを作成します。
重要
この例では、概念実証デモのみです。自己署名証明書の使用は推奨されておらず、セキュリティリスクが生じる可能性があります。本番システムでは、証明書の発行で信頼できる認証機関 (CA) を使用してください。
$ openssl req -x509 -newkey rsa:2048 -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