

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

# Amazon EMR でデータ暗号化に必要なキーと証明書を作成する
<a name="emr-encryption-enable"></a>

セキュリティ設定を使用して暗号化オプションを指定する場合は、その前に、キーや暗号化アーティファクトの提供元として使用したいプロバイダーを決定します。たとえば、 AWS KMS または作成したカスタムプロバイダーを使用できます。次に、このセクションで説明する方法に沿ってキーまたはキープロバイダーを作成します。

## 保管中のデータ暗号化用キーの提供
<a name="emr-encryption-create-keys"></a>

Amazon EMR の保管時のデータ暗号化には AWS Key Management Service 、 (AWS KMS) またはカスタムキープロバイダーを使用できます。を使用する場合 AWS KMS、暗号化キーのストレージと使用には料金が適用されます。詳細については、[AWS KMS 料金表](https://aws.amazon.com/kms/pricing/)を参照してください。

このトピックでは、Amazon EMR で使用する KMS キーのキーポリシーの詳細と、Amazon S3 暗号化のカスタムキープロバイダークラスを作成するためのガイドラインおよびコードサンプルを示します。キーの作成の詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[キーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

### 暗号化 AWS KMS keys に を使用する
<a name="emr-awskms-keys"></a>

 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 デベロッパーガイド*」の「[キーポリシーの使用](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)」と、「[Amazon S3 への EMRFS リクエストの IAM ロールの設定](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)」を参照してください。

を使用して AWS マネジメントコンソール 、指定した KMS キーのキーユーザーのリストにインスタンスプロファイルまたは EC2 インスタンスプロファイルを追加するか、 AWS CLI または AWS SDK を使用して適切なキーポリシーをアタッチできます。

Amazon EMR は、[対称 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)のみをサポートします。[非対称 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)を使用して、Amazon EMR クラスター内の保管中のデータを暗号化することはできません。KMS キーが対称か非対称かを判別するには、「[対称および非対称 KMS キーを識別する](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)」を参照してください。

以下の手順では、 AWS マネジメントコンソールを使用して、デフォルトの Amazon EMR インスタンスプロファイル、`EMR_EC2_DefaultRole` を*キーユーザー*として追加する方法について説明します。既に KMS キーが作成されていることを前提としています。新しい KMS キーを作成するには、「*AWS Key Management Service デベロッパーガイド*」の「[Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

**暗号化キーユーザーのリストに Amazon EMR の EC2 インスタンスプロファイルを追加するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) で AWS Key Management Service (AWS KMS) コンソールを開きます。

1. を変更するには AWS リージョン、ページの右上隅にあるリージョンセレクターを使用します。

1. 変更する KMS キーのエイリアスを選択します。

1. [**Key Users**] のキーの詳細ページで、[**Add**] を選択します。

1. [**Add key users**] ダイアログボックスで、適切なロールを選択します。デフォルトロールの名前は `EMR_EC2_DefaultRole` です。

1. **[Add]** (追加) を選択します。

### KMS キーに追加のアクセス許可を提供して EBS 暗号化を有効にする
<a name="emr-awskms-ebs-encryption"></a>

Amazon EMR バージョン 5.24.0 から、セキュリティ設定オプションを使用して EBS ルートデバイスとストレージボリュームを暗号化できます。このようなオプションを有効にするには、 をキープロバイダー AWS KMS として指定する必要があります。さらに、 AWS KMS key 指定した を使用するアクセス許可`EMR_DefaultRole`をサービスロールに付与する必要があります。

を使用して AWS マネジメントコンソール 、指定された KMS キーのキーユーザーのリストにサービスロールを追加するか、 AWS CLI または AWS SDK を使用して適切なキーポリシーをアタッチできます。

次の手順では、 を使用してデフォルトの Amazon EMR サービスロールを*キーユーザー*`EMR_DefaultRole`として AWS マネジメントコンソール 追加する方法について説明します。既に KMS キーが作成されていることを前提としています。新しい KMS キーを作成するには、「*AWS Key Management Service デベロッパーガイド*」の「[Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

**暗号化キーユーザーのリストに Amazon EMR サービスロールを追加するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) で AWS Key Management Service (AWS KMS) コンソールを開きます。

1. を変更するには AWS リージョン、ページの右上隅にあるリージョンセレクターを使用します。

1. 左サイドバーで **[Customer managed keys]** (カスタマー管理型のキー) を選択します。

1. 変更する KMS キーのエイリアスを選択します。

1. [**Key Users**] のキーの詳細ページで、[**Add**] を選択します。

1. **[キーユーザーの追加]** セクションで、適切なロールを選択します。Amazon EMR のデフォルトのサービスロールの名前は `EMR_DefaultRole` です。

1. **[Add]** (追加) を選択します。

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

セキュリティ設定を使用する場合は、ローカルディスク暗号化と Amazon S3 暗号化用に異なるプロバイダークラス名を指定する必要があります。カスタムキープロバイダーの要件は、ローカルディスク暗号化と Amazon S3 暗号化のどちらを使用するか、および Amazon EMR リリースバージョンによって異なります。

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

## Amazon EMR 暗号化を使用して転送中のデータを暗号化するための証明書の提供
<a name="emr-encryption-certificates"></a>

Amazon EMR リリースバージョン 4.8.0 以降では、下記の 2 つのオプションのいずれかにより、セキュリティ設定を使用して転送中のデータを暗号化するのに必要なアーティファクトを指定できます。
+ 手動で PEM 証明書を作成し、zip ファイルに含め、Amazon S3 から zip ファイルを参照できます。
+ Java クラスとしてカスタム証明書プロバイダーを実装できます。Amazon S3 でアプリケーションの JAR ファイルを指定し、アプリケーションで宣言したプロバイダーの完全なクラス名を提供します。このクラスには、[ バージョン 1.11.0 から利用可能な ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/TLSArtifactsProvider.html)TLSArtifactsProvider AWS SDK for Java インターフェイスを実装する必要があります。

Amazon EMR はクラスターの各ノードに自動的にアーティファクトをダウンロードし、その後、それらのアーティファクトを使用してオープンソースの伝送中の暗号化機能を実装します。使用できるオプションの詳細については、[転送中の暗号化](emr-data-encryption-options.md#emr-encryption-intransit)を参照してください。

### PEM 証明書の使用
<a name="emr-encryption-pem-certificate"></a>

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 でネットワークを設定する](emr-plan-vpc-subnet.md)」を参照してください。

次の例は、[OpenSSL](https://www.openssl.org/) を使用して、2048-bit RSA プライベートキーの自己署名 X.509 証明書を生成する方法を示しています。キーにより、共通名として `*.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
```