Amazon EMR における HDFS での透過的暗号化 - Amazon EMR

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

Amazon EMR における HDFS での透過的暗号化

透過性暗号化は、お客様が定義する HDFS パスである HDFS 暗号化ゾーンを通じて実装されます。各暗号化ゾーンには独自のキーがあり、hdfs-site 設定分類を使用して指定されたキーサーバーに保存されます。

Amazon EMR リリースバージョン 4.8.0 から、Amazon EMR セキュリティ設定を使用して、クラスターのデータ暗号化設定をより簡単に行うことができます。セキュリティ設定は、Amazon Elastic Block Store (Amazon EBS) ストレージボリュームおよび Amazon S3 の EMRFS データで伝送時のデータと保管時のデータに対するセキュリティを有効にするオプションを提供します。詳細については、「Amazon EMR 管理ガイド」の「データを伝送中と保管時に暗号化」を参照してください。

Amazon EMR はデフォルトで Hadoop KMS を使用しますが、 KeyProvider API オペレーションを実装する別の KMS を使用できます。HDFS 暗号化ゾーンの各ファイルには、独自のデータ暗号化キーがあり、これは暗号化ゾーンキーで暗号化されます。暗号化および復号アクティビティはクライアントでのみ発生するため、HDFS データは暗号化ゾーンに書き込まれると end-to-end (保管中および転送中の) 暗号化されます。

暗号化ゾーン間でファイルを移動したり、暗号化ゾーンから暗号化されていないパスにファイルを移動することはできません。

NameNode および HDFS クライアントは、 KeyProvider API オペレーションを通じて Hadoop KMS (または設定した代替 KMS) とやり取りします。KMS はバッキングキーストアで暗号化キーを保存します。また、Amazon EMR には JCE 無制限強度のポリシーが含まれているため、必要な長さでキーを作成できます。

詳細については、Hadoop のドキュメントの「Transparent encryption in HDFS (HDFS での透過的暗号化)」を参照してください。

注記

Amazon EMR では、Hadoop KMS における HTTPS 経由の KMS はデフォルトで有効になりません。HTTPS 経由の KMS を有効にする方法については、Hadoop KMS のドキュメントを参照してください

HDFS 透過的暗号化を設定する

キーを作成し、暗号化ゾーンを追加することで、Amazon EMR で透過的暗号化を設定できます。これはいくつかの方法で行うことができます。

  • クラスターの作成時に Amazon EMR 設定 API オペレーションを使用する

  • command-runner.jar で Hadoop JAR のステップを使用する

  • Hadoop クラスターのマスターノードにログインして、hadoop keyhdfs crypto コマンドラインクライアントを使用する

  • Hadoop KMS と HDFS で REST API を使用する

REST API の詳細については、Hadoop KMS と HDFS の各ドキュメントを参照してください。

CLI を使用してクラスター作成時に暗号化ゾーンとそのキーを作成するには

設定 API オペレーションの hdfs-encryption-zones 分類により、クラスターの作成時にキー名と暗号化ゾーンを指定できます。Amazon EMR はクラスターの Hadoop KMS でこのキーを作成し、暗号化ゾーンを設定します。

  • 次のコマンドを使用してクラスターを作成します。

    aws emr create-cluster --release-label emr-7.1.0 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    注記

    読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

    myConfig.json:

    [ { "Classification": "hdfs-encryption-zones", "Properties": { "/myHDFSPath1": "path1_key", "/myHDFSPath2": "path2_key" } } ]
マスターノードで手動で暗号化ゾーンおよびそのキーを作成するには
  1. Amazon EMR リリース 4.1.0 以降を使用してクラスターを起動します。

  2. SSH を使用してクラスターのマスターノードに接続します。

  3. Hadoop KMS 内でキーを作成します。

    $ hadoop key create path2_key path2_key has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=256, description='null', attributes=null}. KMSClientProvider[http://ip-x-x-x-x.ec2.internal:16000/kms/v1/] has been updated.
    重要

    Hadoop KMS では、キー名が小文字である必要があります。大文字が含まれているキーを使用すると、起動中にクラスターが失敗します。

  4. HDFS で暗号化ゾーンのパスを作成します。

    $ hadoop fs -mkdir /myHDFSPath2
  5. 作成したキーを使用して HDFS パスを暗号化ゾーンにします。

    $ hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2 Added encryption zone /myHDFSPath2
を使用して暗号化ゾーンとそのキーを手動で作成するには AWS CLI
  • 次のコマンドで KMS キーおよび暗号化ゾーンを作成するステップを追加します。

    aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=CUSTOM_JAR,Name="Create First Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path1_key\""] \ Type=CUSTOM_JAR,Name="Create First Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create First Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path1_key -path /myHDFSPath1\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop KMS Key",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop key create path2_key\""] \ Type=CUSTOM_JAR,Name="Create Second Hadoop HDFS Path",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hadoop fs -mkdir /myHDFSPath2\""] \ Type=CUSTOM_JAR,Name="Create Second Encryption Zone",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[/bin/bash,-c,"\"hdfs crypto -createZone -keyName path2_key -path /myHDFSPath2\""]
    注記

    読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

HDFS 透過的暗号化の考慮事項

ベストプラクティスとして、アプリケーションがファイルを書き込む可能性がある各アプリケーション用に暗号化ゾーンを作成します。また、設定 API の hdfs-encryption-zones 分類を使用してすべての HDFS を暗号化し、ルートパス (/) を暗号化ゾーンとして指定することもできます。

Hadoop キー管理サーバー

Hadoop KMS は、Hadoop クラスター用の暗号化サービスを実装する機能を提供するキー管理サーバーであり、Amazon EMR における HDFS での透過的暗号化 のキーベンダーとして機能することができます。Amazon EMR の Hadoop KMS は、EMR クラスターの起動時に Hadoop アプリケーションを選択するときにデフォルトでインストールされ、有効になります。Hadoop KMS は、一時キャッシュの場合を除き、キー自体を保存しません。Hadoop KMS は、キープロバイダーとクライアントトラスティの間のバッキングキーストアへのプロキシとして機能します。これはキーストアではありません。Hadoop KMS 用に作成されるデフォルトのキーストアは、Java Cryptography Extension KeyStore (JCEKS) です。JCE の無制限強度のポリシーも含まれるため、必要な長さのキーを作成できます。Hadoop KMS は、HDFS など他のクライアントアプリケーションとは関係なく、キーとキーオペレーションへのアクセスを制御する一連の ACL もサポートします。Amazon EMR のデフォルトのキー長は 256 ビットです。

Hadoop KMS を設定するには、 hadoop-kms-site 分類を使用して設定を変更します。ACL を設定するには、分類の kms-acls を使用します。

詳細については、Hadoop KMS のドキュメントを参照してください。Hadoop KMS は、Hadoop HDFS 透過的暗号化で使用されます。HDFS 透過的暗号化の詳細については、Apache Hadoop のドキュメントの「HDFS 透過的暗号化」トピックを参照してください。

注記

Amazon EMR では、Hadoop KMS における HTTPS 経由の KMS はデフォルトで有効になりません。HTTPS 経由で KMS を有効にする方法については、Hadoop KMS のドキュメントを参照してください。

重要

Hadoop KMS では、キー名が小文字である必要があります。大文字が含まれているキーを使用すると、起動中にクラスターが失敗します。

Amazon EMR での Hadoop KMS の設定

Amazon EMR リリースバージョン 4.6.0 以降を使用すると、kms-http-port は 9700、kms-admin-port は 9701 になります。

Amazon EMR リリースの設定 API を使用して、クラスター作成時に Hadoop KMS を設定できます。次の設定オブジェクト分類が Hadoop KMS で使用できます。

Hadoop KMS 設定分類
分類 Filename
hadoop-kms-site kms-site.xml
hadoop-kms-acls kms-acls.xml
hadoop-kms-env kms-env.sh
hadoop-kms-log4j kms-log4j.properties
CLI を使用して Hadoop KMS の ACL を設定するには
  • Hadoop KMS と ACL でクラスターを作成するには、次のコマンドを使用します。

    aws emr create-cluster --release-label emr-7.1.0 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    注記

    読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

    myConfig.json:

    [ { "Classification": "hadoop-kms-acls", "Properties": { "hadoop.kms.blacklist.CREATE": "hdfs,foo,myBannedUser", "hadoop.kms.acl.ROLLOVER": "myAllowedUser" } } ]
CLI を使用して Hadoop KMS のキャッシュを無効にするには
  • 次のコマンドを使用し、Hadoop KMS hadoop.kms.cache.enablefalse に設定してクラスターを作成します。

    aws emr create-cluster --release-label emr-7.1.0 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    注記

    読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

    myConfig.json:

    [ { "Classification": "hadoop-kms-site", "Properties": { "hadoop.kms.cache.enable": "false" } } ]
CLI を使用して kms-env.sh スクリプトで環境変数を設定するには
  • kms-env.sh 設定を通じて hadoop-kms-env で設定を変更できます。次のコマンドを使用し、Hadoop KMS でクラスターを作成します。

    aws emr create-cluster --release-label emr-7.1.0 --instance-type m5.xlarge --instance-count 2 \ --applications Name=App1 Name=App2 --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    注記

    読みやすくするために、Linux 行連続文字 (\) が含まれています。Linux コマンドでは、これらは削除することも、使用することもできます。Windows の場合、削除するか、キャレット (^) に置き換えてください。

    myConfig.json:

    [ { "Classification": "hadoop-kms-env", "Properties": { }, "Configurations": [ { "Classification": "export", "Properties": { "JAVA_LIBRARY_PATH": "/path/to/files", "KMS_SSL_KEYSTORE_FILE": "/non/Default/Path/.keystore", "KMS_SSL_KEYSTORE_PASS": "myPass" }, "Configurations": [ ] } ] } ]

Hadoop KMS の設定については、Hadoop KMS のドキュメントを参照してください。

複数のマスターノードを持つ EMR クラスターでの HDFS 透過的暗号化

Apache Ranger KMS は、HDFS での透過的暗号化のために複数のプライマリノードを持つ Amazon EMR クラスターで使用されます。

Apache Ranger KMS は、ルートキーと暗号化ゾーン (EZ) キーを複数のプライマリノードを持つ Amazon EMR クラスターの Amazon RDS に保存します。複数のプライマリノードを持つ Amazon EMR クラスターで HDFS の透過的暗号化を有効にするには、次の設定を指定する必要があります。

  • Ranger KMS のルートキーおよび EZ キーを保存するための Amazon RDS または独自の MySQL サーバー接続 URL

  • MySQL のユーザー名とパスワード

  • Ranger KMS ルートキーのパスワード

  • MySQL サーバーへの SSL 接続用の認証機関 (CA)PEM ファイル

次の例に示すように、ranger-kms-dbks-site 分類と ranger-kms-db-ca 分類を使用して、これらの設定を提供できます。

[ { "Classification": "ranger-kms-dbks-site", "Properties": { "ranger.ks.jpa.jdbc.url": "jdbc:log4jdbc:mysql://mysql-host-url.xx-xxx-1.xxx.amazonaws.com:3306/rangerkms", "ranger.ks.jpa.jdbc.user": "mysql-user-name", "ranger.ks.jpa.jdbc.password": "mysql-password", "ranger.db.encrypt.key.password": "password-for-encrypting-a-master-key" } }, { "Classification": "ranger-kms-db-ca", "Properties": { "ranger.kms.trust.ca.file.s3.url": "s3://rds-downloads/rds-ca-2019-root.pem" } } ]

以下は、Apache Ranger KMS の設定オブジェクト分類です。

Hadoop KMS 設定分類
分類 説明
ranger-kms-dbks-site Ranger KMS の dbks-site.xml ファイルの値を変更します。
ranger-kms-site Ranger KMS の ranger-kms-site.xml ファイルの値を変更します。
ranger-kms-env Ranger KMS 環境の値を変更します。
ranger-kms-log4j Ranger KMS の kms-log4j.properties ファイルの値を変更します。
ranger-kms-db-ca Ranger KMS を使用した MySQL SSL 接続用の S3 の CA ファイルの値を変更します。

考慮事項

  • セキュリティ向上のため、Amazon RDS インスタンスを暗号化することを強くお勧めします。詳細については、「Amazon RDS リソースの暗号化の概要」を参照してください。

  • セキュリティのハードルを上げるため、複数のプライマリノードを持つ各 Amazon EMR クラスターに別々の MySQL データベースを使用することを強くお勧めします。

  • 複数のプライマリノードを持つ Amazon EMR クラスターの HDFS において透過的な暗号化を設定するには、クラスターの作成時に hdfs-encryption-zones 分類を指定する必要があります。指定しない場合、Ranger KMS は設定も起動もしません。複数のプライマリノードを持つ Amazon EMR クラスターでは、hdfs-encryption-zones 分類の再設定、または実行中のクラスターでの Hadoop KMS 設定分類はサポートされていません。