

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

# Amazon S3 クライアント側の暗号化
<a name="emr-emrfs-encryption-cse"></a>

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

**注記**  
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
  ```

## カスタムキープロバイダーの作成
<a name="emr-emrfs-create-cse-key"></a>

カスタムキープロバイダーの作成時に使用する暗号化のタイプに応じて、アプリケーションは異なる EncryptionMaterialsProvider インターフェイスを実装する必要があります。どちらのインターフェイスも AWS SDK for Java バージョン 1.11.0 以降で使用できます。
+ Amazon S3 暗号化を実装するには、[com.amazonaws.services.s3.model.EncryptionMaterialsProvider インターフェイス](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/EncryptionMaterialsProvider.html)を使用します。
+ ローカルディスク暗号化を実装するには、[com.amazonaws.services.elasticmapreduce.spi.security.EncryptionMaterialsProvider インターフェイス](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/EncryptionMaterialsProvider.html)を使用します。

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

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

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

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

**Example 例: 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](https://github.com/awslabs/emr-sample-apps/tree/master/emrfs-plugins/EMRFSRSAEncryptionMaterialsProvider) は 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
<a name="emr-emrfs-encryption-cse-custom-cli"></a>

 AWS CLIを使用するには、`Encryption`、`ProviderType`、`CustomProviderClass`、および `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://amzn-s3-demo-bucket/myfolder/provider.jar,CustomProviderClass=classname
```

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

## SDK を使用してカスタムマテリアルプロバイダーを指定する
<a name="emr-emrfs-encryption-cse-custom-sdk"></a>

SDK を使用するには、プロパティ `fs.s3.cse.encryptionMaterialsProvider.uri` を設定し、Amazon S3 に保存するカスタム `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://amzn-s3-demo-bucket/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.12.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
<a name="emr-emrfs-encryption-custommaterials"></a>

プロバイダーに直接引数を渡す必要がある場合があります。これを行うには、プロパティとして定義されたカスタム引数を持つ `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.12.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/myprovider.jar,CustomProviderClass=classname
```

## EMRFS S3EC V2 サポートを設定する
<a name="emr-emrfs-encryption-cse-s3v2"></a>

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

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

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

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

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

## Amazon S3 クライアント側暗号化の `emrfs-site.xml` プロパティ
<a name="emr-emrfs-cse-config"></a>


| プロパティ  | デフォルトの値 | 説明  | 
| --- | --- | --- | 
| 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` に設定すると、オブジェクトの Amazon S3 URI と JobFlowId を使用して、暗号化されたオブジェクトの materialsDescription が設定されます。カスタム暗号化マテリアルを使用するときは `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 によるクライアント側のデータ暗号化](https://aws.amazon.com/articles/client-side-data-encryption-with-the-aws-sdk-for-java-and-amazon-s3/)」を参照してください。  | 