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 に書き込むオブジェクトは暗号化されません。

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

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

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

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

カスタム暗号化マテリアルに使用される暗号化アルゴリズムは NoPaddingAES/GCM/ でなければなりません。

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

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

Amazon EMR EncryptionMaterialsProvider がクラスから暗号化マテリアルを取得して暗号化を実行すると、EMRFS はオプションで MaterialsDescription 引数に 2 つのフィールド (オブジェクトの Amazon S3 URI とクラスターの 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; } }

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

EncryptionClientSideCustomProviderClassクライアント側の暗号化を有効にする設定は、EncryptionMaterialsProviderオブジェクトの名前であり、Amazon EMR CustomProviderLocation CustomProviderClass がクラスター内の各ノードにコピーしてクラスパスに配置するローカルまたは Amazon S3 のロケーションです。

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

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

たとえばRunJobFlowRequest、AWS SDK for Java使用中のコードは次のようになります。

<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-5.36.1") .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" } } ]

AWS CLI から create-cluster コマンドを使用することで、--configurations オプションを使用してファイルを指定できます (以下の図を参照)。

aws emr create-cluster --release-label emr-5.36.1 --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 カスタム暗号化マテリアルを使用するときに適用されます。が格納されている JAR が格納されている Amazon S3 URI。EncryptionMaterialsProviderこの 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 キーの値KeyId、ARN、またはエイリアス。

fs.s3.cse.cryptoStorageMode ObjectMetadata

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