Amazon S3 クライアント側の暗号化 - Amazon EMR

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

Amazon S3 クライアント側の暗号化

Amazon S3 のクライアント側の暗号化を使用すると、Amazon S3 の暗号化と復号はクラスターの EMRFS クライアントで行われます。オブジェクトは Amazon S3 にアップロードされる前に暗号化され、ダウンロード後に復号化されます。指定するプロバイダーが、クライアントが使用する暗号化キーを提供します。クライアントは、 AWS KMS によって提供されるキー (CSE-KMS) か、クライアント側のルートキーを提供するカスタム Java クラス (CSE-C) を使用できます。CSE-KMS と CSE-C では、指定するプロバイダーと、復号化または暗号化されるオブジェクトのメタデータに応じて、暗号化の仕様が少し異なります。これらの差異に関する詳細は、「Amazon Simple Storage Service ユーザーガイド」の「クライアント側の暗号化を使用したデータの保護」を参照してください。

注記

Amazon S3 CSE では、Amazon S3 と交換される EMRFS データのみが暗号化されます。クラスターインスタンスボリュームのすべてのデータが暗号化されるわけではありません。さらに、Hue は EMRFS を使用しないため、Hue S3 ファイルブラウザが Amazon S3 に書き込むオブジェクトは暗号化されません。

を使用して Amazon S3 の EMRFS データの CSE-KMS を指定するには AWS CLI
  • 次のコマンドを入力して、MyKMSKeyID を、使用する KMS キーのキー ID または ARN に置き換えます。

    aws emr create-cluster --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId

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

カスタムキープロバイダーの作成時に使用する暗号化のタイプに応じて、アプリケーションは異なる 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 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; } }

を使用したカスタムマテリアルプロバイダーの指定 AWS CLI

AWS CLIを使用するには、EncryptionProviderTypeCustomProviderClass、および CustomProviderLocation の各引数を emrfs オプションに渡します。

aws emr create-cluster --instance-type m5.xlarge --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://mybucket/myfolder/provider.jar,CustomProviderClass=classname

EncryptionClientSide に設定すると、クライアント側の暗号化が有効になります。CustomProviderClassEncryptionMaterialsProvider オブジェクトの名前を表します。また、CustomProviderLocation は、ローカルまたは Amazon S3 のロケーションを示しています。この場所から Amazon EMR が CustomProviderClass をクラスター内の各ノードにコピーし、クラスパスに配置します。

SDK を使用してカスタムマテリアルプロバイダーを指定する

SDK を使用するには、プロパティ fs.s3.cse.encryptionMaterialsProvider.uri を設定し、Amazon S3 に保存するカスタム EncryptionMaterialsProvider クラスをクラスター内の各ノードにダウンロードします。これは、emrfs-site.xml ファイルで設定します。このとき、CSE を有効にして、カスタムプロバイダーの適切な場所も指定します。

例えば、 AWS SDK for Java を使用する では RunJobFlowRequest、コードは次のようになります。

<snip> Map<String,String> emrfsProperties = new HashMap<String,String>(); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider.uri","s3://mybucket/MyCustomEncryptionMaterialsProvider.jar"); emrfsProperties.put("fs.s3.cse.enabled","true"); emrfsProperties.put("fs.s3.consistent","true"); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider","full.class.name.of.EncryptionMaterialsProvider"); Configuration myEmrfsConfig = new Configuration() .withClassification("emrfs-site") .withProperties(emrfsProperties); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Custom EncryptionMaterialsProvider") .withReleaseLabel("emr-7.1.0") .withApplications(myApp) .withConfigurations(myEmrfsConfig) .withServiceRole("EMR_DefaultRole_V2") .withJobFlowRole("EMR_EC2_DefaultRole") .withLogUri("s3://myLogUri/") .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("myEc2Key") .withInstanceCount(2) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m5.xlarge") .withSlaveInstanceType("m5.xlarge") ); RunJobFlowResult result = emr.runJobFlow(request); </snip>

引数を使用するカスタム EncryptionMaterialsProvider

プロバイダーに直接引数を渡す必要がある場合があります。これを行うには、プロパティとして定義されたカスタム引数を持つ emrfs-site 設定分類を使用できます。設定例を次に示します。これは、ファイル myConfig.json として保存されます。

[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]

から create-cluster コマンドを使用すると AWS CLI、次に示すように、 --configurationsオプションを使用して ファイルを指定できます。

aws emr create-cluster --release-label emr-7.1.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://mybucket/myfolder/myprovider.jar,CustomProviderClass=classname

EMRFS S3EC V2 サポートを設定する

S3 Java SDK リリース (1.11.837 以降) では、さまざまなセキュリティ機能拡張がある暗号化クライアントバージョン 2 (S3EC V2) がサポートされます。詳細については、S3 のブログ投稿「Updates to the Amazon S3 encryption client」を参照してください。また、「 AWS SDK for Java デベロッパーガイド」のAmazon S3 暗号化クライアントの移行」を参照してください。

下位互換性を保つため、暗号化クライアント V1 は SDK で引き続き使用できます。デフォルトでは、CSE が有効になっている場合、EMRFS は S3EC V1 を使用して S3 オブジェクトを暗号化および復号します。

S3EC V2 で暗号化された S3 オブジェクトは、リリースバージョンが emr-5.31.0 より前 (emr-5.30.1 以前、emr-6.1.0 以前) の EMR クラスターでは、EMRFS によって復号化できません。

例 S3EC V2 を使用するように EMRFS を設定する

S3EC V2 を使用するように EMRFS を設定するには、次の設定を追加します。

{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }

Amazon S3 クライアント側暗号化の emrfs-site.xml プロパティ

プロパティ デフォルト値 説明
fs.s3.cse.enabled false

true に設定すると、Amazon S3 に保存された EMRFS オブジェクトはクライアント側の暗号化を使用して暗号化されます。

fs.s3.cse.encryptionV2.enabled false

true に設定すると、EMRFS は S3 暗号化クライアントバージョン 2 を使用して S3 上のオブジェクトの暗号化と復号化を行います。EMR バージョン 5.31.0 以降で使用できます。

fs.s3.cse.encryptionMaterialsProvider.uri N/A カスタム暗号化マテリアルを使用するときに適用されます。EncryptionMaterialsProvider を指定する JAR が保存されている Amazon S3 URI を意味します。この URI を指定すると、Amazon EMR により JAR がクラスター内のすべてのノードに自動的にダウンロードされます。
fs.s3.cse.encryptionMaterialsProvider N/A

クライアント側の暗号化で使用される EncryptionMaterialsProvider のクラスパス。CSE-KMS を使用する場合は、com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider を指定します。

fs.s3.cse.materialsDescription.enabled false

に設定するとtrue、 は暗号化されたオブジェクトの materialsDescription に、オブジェクトの Amazon S3 URI と を入力します JobFlowId。カスタム暗号化マテリアルを使用するときは true に設定します。

fs.s3.cse.kms.keyId N/A

CSE-KMS を使用するときに適用されます。暗号化に使用される KMS キーの 、 KeyIdARN、またはエイリアスの値。

fs.s3.cse.cryptoStorageMode ObjectMetadata

Amazon S3 ストレージモード。デフォルトでは、暗号化情報の説明はオブジェクトメタデータに保存されます。インストラクションファイルに説明を保存することもできます。有効な値は ObjectMetadata と ですInstructionFile。詳細については、「 AWS SDK for Java および Amazon S3 によるクライアント側のデータ暗号化」を参照してください。