Amazon Web Services ブログ

Amazon EMR で TLS カスタム証明書プロバイダーを使用して転送中のデータを暗号化する

多くの企業は、クラウド セキュリティのポリシーを厳格に規制しています。機密データが処理される Amazon EMR の場合、これらのポリシーはより厳しくなる可能性があります。

EMR で提供されているセキュリティ構成を使用すると、Amazon S3 およびローカルの Amazon EBS ボリュームに保存されているデータの暗号化を設定できます。また、転送中のデータの暗号化用に Transport Layer Security (TLS) 証明書を設定することもできます。

転送時の暗号化を有効にした場合、EMR は次のコンポーネントをデフォルトでサポートします。

  • Hadoop MapReduce 暗号化シャッフル。
  • プライバシー」に設定されている セキュア Hadoop RPC および SASL の使用。これは、保管時のデータの暗号化を有効にしたときに、EMR 内でアクティブになります。
  • プライバシー」に設定されている セキュア Hadoop RPC および SASL の使用。これは、セキュリティ構成内で保存済みのデータの暗号化が有効な場合に、EMR 内でアクティブになります。
  • SSL/TLS を使用した、Presto のノード間の内部通信。これは、EMR バージョン 5.6.0 以降にのみ当てはまります。
  • TLS を使用する Tez Shuffle Handler。
  • Apache Spark 間の内部 RPC 通信
  • Spark 履歴サーバーおよび Spark の Secure Sockets Layer (SSL) 構成を使用して暗号化された HTTPS 対応ファイル サーバーなどの、ユーザー インターフェイスを使用する HTTP プロトコル通信。

EMR 転送時の暗号化の詳細については、「暗号化オプション」を参照してください。

セキュリティ構成により、TLS 証明書を指定するための以下のオプションが提供されます。

  1. すべての証明書を含む S3 バケット内の .zip ファイルへのパスとして
  2. Java クラスとしてのカスタム証明書プロバイダーを通して

ほとんどの場合、企業のセキュリティ ポリシーでは、証明書プライベート キーを含むいかなる種類の機密データも S3 バケットに保存することが禁じられています。そのため、EMR 上で転送中のデータをセキュリティ保護する、残された唯一のオプションは、カスタム証明書プロバイダーを構成することです。

この記事では、構成プロセスについて説明しながら、TLS カスタム証明書プロバイダーを使用して EMR 上で転送中のデータをセキュリティ保護する方法を示します。

必要な知識

このソリューションの内容を理解するため、次のことを知っておくか、精通しておいてください。

ソリューションの概要

カスタム証明書プロバイダーは、TLSArtifactsProvider インターフェイスを実装し、コンパイルして JAR ファイルにする Java クラスです。TLSArtifactsProvider インターフェイスは、AWS SDK for Java バージョン 1.11 以降で使用できます。

TLSArtifactsProvider インターフェイスは、証明書を引数に取る TLSArtifacs メソッドを提供します。

このソリューションを機能させるには、Java コードでもアクセス可能な、証明書を保管するための安全な場所が必要です。

この例では、AWS Key Management Service (AWS KMS) キーを使用した暗号化をサポートするパラメータ ストアを使用します。

もう 1 つの方法は、暗号化された証明書を Amazon DynamoDB に保存することです。

次の図および手順は、Java の観点からの構成プロセスを示しています。

 

  1. ブートストラップ時に、EMR は S3 バケットから Java JAR ファイルをダウンロードして各ノードで実行します。
  2. Java は Lambda 関数を呼び出して、特定のパラメータ キーの値を要求します。
  3. Lambda は、パラメータ ストアを呼び出して値を取得します。Systems Manager により返される値は、暗号化されたままです。
  4. Lambda は、暗号化された値を Java に返します。
  5. Java は、AWS KMS API 呼び出しを使用して値の復号化を行います。
  6. 復号化された値は、適切なフォーマットの証明書に変換されます。
  7. すべての証明書でこのプロセスが繰り返されます。
  8. 証明書は、TLSArtifactsProvider インターフェイスを介して EMR に返されます。

この例では、マスターノードに認証局 (CA) により署名された証明書を、スレーブ ノードにワイルドカード自己署名証明書を使用しました。要件に応じて、すべてのノードに CA 証明書を使用することも、自己署名ワイルドカード証明書だけを使用することもできます。

転送時の暗号化の実装

このセクションでは、カスタム証明書プロバイダを使用した転送時の暗号化の実装と構成のすべての側面を説明します。

自己署名ワイルドカード証明書の作成

自己署名ワイルドカード証明書を作成するには、OpenSSL を使用できます。

openssl req -x509 -newkey rsa:4096 -keyout inter-nodes.key -out inter-nodes.crt -days 365 -subj "/C=US/ST=MA/L=Boston/O=EMR/OU=EMR/CN=*.ec2.internal" -nodes


このコマンドにより、自己署名付きの 4096 ビットの証明書が作成されます。

パラメータの説明:

-keyout – プライベート キーを格納する出力ファイル。

-out – 証明書を格納する出力ファイル。

-days – 証明書を証明する日数。

-subj – 新規リクエストのサブジェクト名。  CN は、Virtual Private Cloud (VPC) に割り当てられている DHCP で指定されているドメイン名と一致している必要があります。デフォルトは ec2.internal です。接頭辞「*」は、ワイルドカード証明書です。

-nodes – 暗号化せずに、パスワードなしで秘密鍵を作成できます。

詳細は、「req コマンド」を参照してください。

証明書のアップロード

証明書をパラメータ ストアにアップロードするには、次の AWS Command Line Interface (AWS CLI) コマンドを、プライベート キーを含めて証明書ファイルごとに実行します。

aws ssm put-parameter --name <parameter key name> --key-id < KMS key ID> --type SecureString --value file://<path to certificate file>

次に、アップロードした CA および自己署名証明書ファイルの例を示します。

aws ssm put-parameter --name /emr/certificate --value fileb://emr-ca-certificate.crt --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

aws ssm put-parameter --name /emr/private-key --value fileb://emr-ca-private-key.key --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

aws ssm put-parameter --name /emr/inter-nodes-certificate --value fileb://inter-nodes.crt --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

aws ssm put-parameter --name /emr/inter-nodes-private-key --value fileb://inter-nodes.key --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

次に、すべてのノードでワイルドカード証明書を使用しているときの、アップロード中の証明書の例を示します。

aws ssm put-parameter --name /emr/certificate --value fileb:// inter-nodes.crt --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

aws ssm put-parameter --name /emr/private-key --value fileb:// inter-nodes.key --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

aws ssm put-parameter --name /emr/inter-nodes-certificate --value fileb://inter-nodes.crt --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

aws ssm put-parameter --name /emr/inter-nodes-private-key --value fileb://inter-nodes.key --type SecureString --key-id 00000000-0000-0000-0000-000000000000 --overwrite --region us-east-1

Lambda 関数の使用

このソリューションの Lambda 関数は、Java JAR がパラメータ ストアから証明書を取得できるようにするブローカーです。

次のコマンドを使用して Lambda 関数の新規ロールを作成します。

aws iam create-role --role-name lambda-ssm-parameter-store-role --assume-role-policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": {\"Service\": \"lambda.amazonaws.com\"},\"Action\": \"sts:AssumeRole\"}]}"

次のコマンドを使用して、アクセス権をパラメータ ストアに付与します。

aws iam put-role-policy --role-name lambda-ssm-parameter-store-role --policy-name ssm --policy-document "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\",\"Action\": \"ssm:GetParameter\",\"Resource\": \"*\"}]}"

新規 Lambda 関数の作成:

新規 Lambda 関数を作成するには、AWS マネジメント コンソールを開き、[Lambda] を選択してから [関数の作成] を選択します。[関数の作成] ページで、次のスクリーンショットに示すようにフォームに入力を行います。

ランタイムに Python 2.7 を選択し、Lambda 関数用に作成したロールを指定します。

新しい関数が作成されたら、[関数コード] セクションに次のコードを追加します。

import json
import boto3

ssm = boto3.client('ssm')

def lambda_handler(event, context):

    ssmResp = ssm.get_parameter(
        Name=event['ParameterName'],
        WithDecryption=False
    )

    paramValue = ssmResp['Parameter']['Value']
    return(paramValue)

タイムアウトを 1 分に変更して、関数を保存します。

タグ リソース

Java クラスが Lambda 関数を呼び出すには、関数名と、証明書が格納されるパラメータ キーの名前に関する情報を指定する必要があります。

同じ Java JAR を異なる証明書と構成で再利用するには、それらの値を Java コードに埋め込むのではなく、EMR タグを通じて Java に提供します。

この例では、次のタグを使用しました。

  • ssm:ssl:certificate – CA 署名証明書を格納する Systems Manager パラーメータ キーの名前。
  • ssm:ssl:private-key – CA 署名証明書プライベート キーを格納する Systems Manager パラメータ キーの名前。
  • ssm:ssl:inter-node-certificate – 自己署名証明書を格納する Systems Manager パラメータ キーの名前。
  • ssm:ssl:inter-node-private-key – 自己署名証明書プライベート キーを格納する Systems Manager パラメータ キーの名前。
  • tls:lambda-fn-name – Lambda 関数の名前。この例では、これは get-ssm-parameter-lambda です。

Java クラス フローの使用

このセクションでは、Java コードのみのフローについて説明します。コンパイル済みの JAR ファイルを含む完全なコードだけを GitHub からダウンロードできます。詳細は、emr-tls-security GitHub リポジトリ内の 「Java フォルダ」を参照してください。

重要

EMR の依存関係のため、他のすべてのメソッドは、AWS SDK for Java バージョン 1.10.75 に基づいて実装する必要があります。これらの依存関係には、AWS SDK for Java バージョン 1.11.170 (aws-java-sdk-emr-1.11.170.jar) からインポートする TLSArtifactsProvider インターフェイスは含まれません。

必要なすべての依存関係は、サンプル プロジェクトに含まれています。

以下は、TLSArtifactsProvider インターフェイスの実装による、Java クラスの基本構造の例です。

public class emrtls extends TLSArtifactsProvider {

            public emrtls() {

            }

            @Override

            public TLSArtifacts getTlsArtifacts() {

 

                        List<Certificate> crt = new ArrayList<Certificate>();

                        List<Certificate> crtCA = new ArrayList<Certificate>();

                        PrivateKey privkey;

           

                        //here code to retrieve certificates from secure location

                        // and assign them to local variables

                       

                        TLSArtifacts tls = new TLSArtifacts(privkey,crt,crtCA);

                        return tls;

            }

}

追加するコードは、安全な場所から証明書を取得することに関連しています。

GitHub から提供されたコード例では、次のロジックが実装されていました。各ステップで使用されたメソッドをリストにしてあります。

  1. Systems Manager パラメータ キーの名前を読み取ります。また、EMR タグから AWS Lambda 関数の名前を読み取ります (「タグ付け」セクションを参照) – readTags()
  2. Lambda 関数を呼び出してパラメータ ストアから証明書をダウンロードします – callLambda():
    • KMS API 呼び出しを使用してLambda から返された値を復号化します – decryptValue()。
    • 復号化された値をローカル変数に割り当てます。
  3. 必要に応じて、CA 署名付き証明書をローカル ディスクに保存します。詳細については、この記事の後の部分にある「その他の通信 – Hue」セクションを参照してください – createDirectoryForCerts() and writeCert()。
  4. 証明書を X509 形式に変換します – getX509FromString()。
  5. プライベート キーを適正な形式に変換します – getPrivateKey()。
  6. getTlsArtifacts() メソッドを呼び出し、引数に証明書を指定します。

コードを変更せずに、すべてのノードでワイルドカード証明書を使用できます。EMR タグの ssm:ssl:certificate/ssm:ssl:private-key および ssm:ssl:inter-node-certificate/ ssm:ssl:inter-node-private-key 内にある同じ Systems Manager パラメータ キーを参照してください。

サンプル コード内の実装されたメソッドが要件を満たしている場合は、次のセクションで説明するように、EMR セキュリティ構成で提供されている Java JAR ファイルを使用できます。それ以外の場合、いかなるコードの変更でも、Java コードをコンパイルして JAR ファイルにする必要があります。

EMR セキュリティ構成の作成

セキュリティ構成を作成する前に、コンパイル済みの Java JAR ファイルを S3 バケットにアップロードしてください。

セキュリティ構成を作成するには:

  1. Amazon EMR コンソールにログインします。
  2. [セキュリティ構成]、[作成] を選択します。
  3. 新しいセキュリティ構成の名前を入力します (例: emr-tls-ssm)。
  4. [転送時の暗号化] を選択します。
  5. [TLS 証明書プロバイダ] の [証明書プロバイダのタイプ] で、[カスタム] を選択します。
  6. [S3 オブジェクト] で、アップロードした Java JAR ファイルのパスを入力します。
  7. [証明書プロバイダ クラス] で、Java クラスの名前を入力します。サンプル コードでは、名前は「emrtls」です。
  8. 必要に応じて、At-rest 暗号化を構成します。
  9. [作成] を選択します。

インスタンス プロファイル ロールの変更

EMR 上で動作するアプリケーションは、EC2 の EMRロールが他の AWS サービスとやりとりすることを前提として、EMR ロールを使用します。

Lambda を呼び出すための Java 権限を付与して、証明書を復号化するには、EC2 インスタンス プロファイル ロールに次のポリシーを追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "TLS",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:get-ssm-parameter-lambda",
                "arn:aws:kms:us-east-1:xxxxxxxxxx:key/<your KMS key used to encrypt certificates in AWS Systems Manager"
            ]
        }
    ]
}

注意

ポリシーを作成する前に、Lambda 関数と KMS キーの正しい Amazon リソース ネーム (ARN) を使ってリソースを更新してください。

使用可能な他の構成

EMR 内で転送時の暗号化をネイティブにサポートするアプリケーションに加え、カスタム TLS 証明書プロバイダは、Presto、Hue、Zeppelin などの他のアプリケーションの通信 (HTTPS) の保護にも使用できます。

以降のセクションでは、TLS セキュリティ構成によって設定された証明書で動作する各アプリケーションの構成について説明します。

Presto

Presto では、ほとんどの構成は TLS 証明書の適用時に EMR によって行われます。

使用する証明書の種類によっては、追加する必要がある構成が 2 つあります。

  1. 単一の共通名 (ワイルドカードではない) を持つ CA 署名付き証明書がマスター ノードに設定されている場合、追加構成が必要です。
      • 証明書共通名は DNS に登録する必要があります。EMR クラスタは、その名前をマスタノードの IP アドレスに解決できなければなりません。1 つの解決策は、ブートストラップ アクションでスクリプトを実行して、EMR マスター ノードの IP アドレスおよび DNS 内の名前を登録することです。
      • Presto 構成ファイル内の Discovery URI は、証明書共通名と一致している必要があります。uri の値は、すべてのノードで変更する必要があります。これは、提供されている 2 つのスクリプトで達成できます。各スクリプトは、EMR クラスタがアクセス権を持つ S3 バケットにアップロードする必要があります。
        最初のスクリプトemr-presto-conf.sh, は、以下に示すように EMR ブートストラップ アクションで実行する必要があります。ここで、「Args」の値は証明書共通名です。

        {
          "Name": "PrestoConfiguration",
          "ScriptBootstrapAction": {
            "Path": "s3://xxxxx/emr-presto-conf.sh",
            "Args": [ "emr.mycluster.com" ]
          }
        }

        PrestoConfiguration ブートストラップ アクションは、バックグラウンド プロセスでスクリプト (presto-update-dicovery-uri.sh) をダウンロードして実行します。このスクリプトは、Presto サーバーがインストールされるのを待機して、構成ファイルを変更します。
        emr-presto-conf.sh スクリプトを Amazon S3 バケットにアップロードする前に、パスを「presto-update-dicovery-uri.sh」に変更してください。
        どちらのスクリプトも GitHub からダウンロードできます。
        https://github.com/aws-samples/emr-tls-security/tree/master/scripts

    2.マスターノードで自己署名ワイルドカード証明書を使用する場合は、Java デフォルト トラストストアに証明書を追加する必要があります。これは、次のスクリプトを実行することで実現できます。

    #!/bin/bash
    
    truststorePass=$(grep -Po "(?<=^internal-communication.https.keystore.key = ).*" /etc/presto/conf/config.properties)
    
    sudo keytool -importkeystore -srckeystore /usr/share/aws/emr/security/conf/truststore.jks -destkeystore /usr/lib/jvm/java/jre/lib/security/cacerts -deststorepass changeit -srcstorepass $truststorePass

    前のスクリプトは EMR ステップで実行できます。以下に示すのは、AWS CloudFormation スニペットです。

    "EMRPrestoTrustedStorStep": {
          "Type": "AWS::EMR::Step",
          "Properties": {
            "ActionOnFailure": "CONTINUE",
            "HadoopJarStep": {
              "Jar": "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
              "Args": [
                "s3://xxxxxx/presto-update-trusted-store.sh"
              ]
            },
            "JobFlowId": {
              "Ref": "EMRCluster"
            },
            "Name": "EMR-Setup-Presto-Trusted-Store"
          }
        }
    

    Hue

    HTTPS 経由で Hue UI へのアクセスを構成するには、証明書およびプライベート キー ファイルへのパスをhue.iniファイルで指定する必要があります。Java クラスには、ローカル ディスクへの TLS 証明書のエクスポートをサポートする createDirectoryForCerts() および writeCert() メソッドがあるため、残りの構成は hue.ini ファイル内でこれらのファイルを指し示すようにしてください。

    この構成は、EMR クラスタに次の構成を追加することで適用できます。

             [{
                "Classification": "hue-ini",
                "Configurations": [
                  {
                    "Classification": "desktop",
                    "ConfigurationProperties": {
                      	"ssl_certificate": "/etc/certs/public.crt",
                     	"ssl_private_key": "/etc/certs/private.key"
                    }
    	}]
              }]

    Hue へのHTTPS 接続のポートは同じままです。デフォルトは 8888 です。

    Zeppelin

    Hue とは異なり、Zeppelin 構成ファイルは Java キーストアの証明書を参照します。

    EMR はすでにすべての証明書を Java キーストアに追加しているため、必要な変更は zeppelin-site.xml 内の同じ Java キーストア ファイルとパスワードを参照するだけです。

    Java キーストアへのパスおよびパスワードは、Presto 構成ファイルから直接読み取ることができます。

    この構成を実現するには、EMR で次のスクリプトを実行します。

    #!/bin/bash
    sudo cp /etc/zeppelin/conf/zeppelin-site.xml.template /etc/zeppelin/conf/zeppelin-site.xml
    truststorePath=$(grep -Po "(?<=^internal-communication.https.keystore.path = ).*" /etc/presto/conf/config.properties)
    truststorePass=$(grep -Po "(?<=^internal-communication.https.keystore.key = ).*" /etc/presto/conf/config.properties)
    keystorePath=$(grep -Po "(?<=^http-server.https.keystore.path = ).*" /etc/presto/conf/config.properties)
    keystorePass=$(grep -Po "(?<=^http-server.https.keystore.key = ).*" /etc/presto/conf/config.properties)
    keymanager=$(grep -Po "(?<=^http-server.https.keymanager.password = ).*" /etc/presto/conf/config.properties)
    sudo sed -i '/<name>zeppelin.server.port<\/name>/!b;n;c<value>8890<\/value>' /etc/zeppelin/conf/zeppelin-site.xml
    sudo sed -i '/<name>zeppelin.server.ssl.port<\/name>/!b;n;c<value>7773<\/value>' /etc/zeppelin/conf/zeppelin-site.xml
    sudo sed -i '/<name>zeppelin.ssl<\/name>/!b;n;c<value>true<\/value>' /etc/zeppelin/conf/zeppelin-site.xml
    sudo sed -i '/<name>zeppelin.ssl.keystore.path<\/name>/!b;n;c<value>'"$keystorePath"'<\/value>' /etc/zeppelin/conf/zeppelin-site.xml
    sudo sed -i '/<name>zeppelin.ssl.keystore.password<\/name>/!b;n;c<value>'"$keystorePass"'<\/value>' /etc/zeppelin/conf/zeppelin-site.xml
    sudo sed -i '/<name>zeppelin.ssl.truststore.path<\/name>/!b;n;c<value>'"$truststorePath"'<\/value>' /etc/zeppelin/conf/zeppelin-site.xml
    CONTENT1="<property>\n  <name>zeppelin.ssl.truststore.password</name>\n  <value>${truststorePass}</value>\n</property>"
    sudo sed -i '/<\/configuration>/i'"$CONTENT1" /etc/zeppelin/conf/zeppelin-site.xml
    CONTENT2="<property>\n  <name>zeppelin.ssl.key.manager.password</name>\n  <value>${keymanager}</value>\n</property>"
    sudo sed -i '/<\/configuration>/i'"$CONTENT2" /etc/zeppelin/conf/zeppelin-site.xml
    sudo stop zeppelin
    sudo start zeppelin

    前のスクリプトでは、Zeppelin の HTTPS ポートを 7773 に設定されますが、これは必要に応じて変更できます。

    GitHub の例

    GitHub では、CloudFormation テンプレートのサンプルをダウンロードできます。これを使って、この記事で説明したすべてのセキュリティ機能を備えた EMR クラスターを起動できます。

    以下に、セキュリティ機能を備えた EMR クラスタの起動に必要な AWS CLI コマンドの例を示します。

    このコマンドを実行する前に、<key pair name>、<subnet id>、および <security group id> を正しい値に変更する必要があります。 

    aws emr create-cluster --configurations https://s3.amazonaws.com/tls-blog-cf/emr-configuration.json \
    
    --applications Name=Hadoop Name=Hive Name=Presto Name=Spark Name=Hue Name=Zeppelin \
    
    --instance-groups 'InstanceGroupType=MASTER,InstanceCount=1,InstanceType='m4.xlarge'' \
    
    'InstanceGroupType=CORE,InstanceCount='2',InstanceType='m4.xlarge'' \
    
    --release-label emr-5.14.0 \
    
    --service-role EMR_DefaultRole \
    
    --ec2-attributes KeyName=<key pair name>,SubnetId=<subnet id>,\
    
    EmrManagedMasterSecurityGroup=<security group id>,\
    
    AdditionalMasterSecurityGroups=<security group id>,\
    
    EmrManagedSlaveSecurityGroup=<security group id>,\
    
    InstanceProfile=EMR_EC2_DefaultRole \
    
    --name EMR-TLS-Demo \
    
    --visible-to-all-users \
    
    --security-configuration emr-tls-ssm \
    
    --steps Type=CUSTOM_JAR,Name=ZeppelinSSL,ActionOnFailure=CONTINUE,\
    
    Jar=s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar,\
    
    Args=s3://tls-blog-cf/zeppelin-ssl.sh \
    
    Type=CUSTOM_JAR,Name=PrestoSSL,ActionOnFailure=CONTINUE,\
    
    Jar=s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar,\
    
    Args=s3://tls-blog-cf/presto-update-trusted-store.sh \
    
    --tags ssm:ssl:private-key="/emr/private-key" \
    
    ssm:ssl:certificate="/emr/certificate" \
    
    ssm:ssl:inter-node-private-key="/emr/inter-nodes-private-key" \
    
    ssm:ssl:inter-node-certificate="/emr/inter-nodes-certificate" \
    
    tls:lambda-fn-name="get-ssm-parameter-lambda" \
    
    --region us-east-1

    注意

    提供されたサンプルを実行する前に、証明書をパラメータ ストアにアップロードする必要があります。

    テストを目的として、次からシェル スクリプトをダウンロードできます。

    https://github.com/aws-samples/emr-tls-security/blob/master/scripts/upload-certificates.sh

    このスクリプトは、*.ec2.internal 用に発行された自己署名証明書をパラメータストアにアップロードします。EMR クラスタを起動する VPC に関連付けられた DNS が、証明書と一致することを確認します。

    次のコマンドを使用します。

    sh upload-certificates.sh <KMS key ID> <AWS Region>

    ここで、

    KMS key ID – 証明書の暗号化に使用される KMS キーの識別子。

    AWS Region – 証明書のアップロード先のリージョン。

    検証

    TLS 証明書が正しくインストールされたかどうかを検証する方法はいくつかあります。

    Hue

    ブラウザから Hue への HTTPS 接続をテストするには、https://<EMR URL or IP>:8888 に接続します

    Zeppelin
    ブラウザから Zeppelin への HTTPS 接続をテストするには、https://<EMR URL or IP>:7773 に接続します

    このサンプルではポート 7773 が使用されています。これを変更した場合は、EMR クラスタ上で Zeppelin が稼働しているポートに接続していることを確認してください。

    これらのシナリオの両方で覚えておくべきことがあります。証明書が提供された URL と一致しない場合 (または自己署名証明書を作成した場合)、証明書が無効であるという警告メッセージがブラウザに表示されます。

    Presto

    次のいずれかの方法で、Presto をテストできます。

        1. Presto UI への HTTPS 接続
        2. Presto CLI の使用

    ブラウザから Presto UI への接続をテストするには、https://<EMR URL or IP>:8446 に接続します

    Presto CLI を使用して証明書をテストするには、次の手順に従います。

        1. EMR マスター ノードに接続 (SSH) します
        2. 次のコマンドを実行して、テスト Hive テーブルを作成します。
    hive -e "create table test1 (id int, name string); insert into test1 values (1, 'John'), (2,'Robert'), (3,'David');"
        1. 次の Presto コマンドを実行します。
    presto-cli --server https://master-node-url:8446 --schema default --catalog hive --execute 'select count(*) from test;'

    「master-node-url」は適正な値に変更してください。

    コマンドが成功したら、コマンド出力として 3 が表示されるはずです。

    結論

    Amazon EMRのセキュリティ設定では、保存済みデータだけでなく、転送中のデータも暗号化するオプションが提供されます。

    この記事では、TLS カスタム証明書プロバイダを作成し、EMR クラスタに適用して、証明書のプライベート キーを S3 バケットに格納せずに転送中のデータを保護する方法を示しました。厳格なポリシーを持つ企業にとって、これは転送中のデータを暗号化する唯一のソリューションかもしれません。

     


    その他の参考資料

    この記事が役に立った場合は、「Kerberos、Microsoft Active Directory 統合、および EMRFS 用 IAM ロールを使用してマルチテナント Amazon EMR クラスターを構築する」および「セキュリティ構成を使用して Amazon EMR 上で保存済みおよび転送中のデータを暗号化する」を参照してください。

     


    著者について

    Remek Hetman は、Amazon ウェブ サービス プロフェッショナル サービスのシニア クラウド インフラストラクチャ アーキテクトです。彼は、AWS の企業顧客と協力してインフラストラクチャ、DevOps、およびビッグ データに関する技術的なガイダンスと支援を提供し、AWS サービスを最大限に活用できるようサポートしています。仕事以外では、彼は自分の時間をアクティブに過ごし、天文学に情熱を傾けています。