Sheildを使用したセキュアなElasticsearch

次に、Elasticsearchクラスタをセキュアに実行するように構成するためのステップを示します。次の各項に記載されている説明は、次の前提と要件のリストに基づいています。

セキュアなElasticsearchクラスタに関する前提

  • Elasticsearchディストリビューションの2.4.6バージョンは、ディレクトリ/opt/es/elasticsearchにインストールされています。
  • Shieldアダプタ(およびライセンス)の2.4.6バージョンは、Elasticsearch構成(次を参照)にインストールされています。
  • Elasticsearchクラスタをホストするeshost1eshost2およびeshost3という名前の3つのノードがあり、そのそれぞれが、Oracle NoSQLストアのノードに加えて、Elasticsearchクラスタの他のノードとネットワークで接続します。
  • Elasticsearchクラスタの各ノードにnode.nameプロパティを指定する際に使用される値は、対応するElasticsearchノードのhostnameです。
  • デプロイされるクラスタの名前はescluster (cluster.name)になります。
  • クラスタ内のノード間通信に使用されるポートは、29000 (transport.tcp.port)です。
  • 全文検索問合せを送信するなどのために、HTTPSでクラスタ内のいずれかのノードと通信するとき、クラスタのクライアントが使用するポートは29100 (http.port)です。
  • わかりやすくするために、すべてのパスワードはNo_Sql_00に設定されています。
  • Elasticsearchクラスタのノードでは、それぞれ、クラスタ内の他のノードによって生成された鍵ペアの別名に対する、一意の別名を持つ公開鍵と秘密鍵のペアが生成されます。各Elasticsearchノードの公開証明書は、Oracle NoSQLストアの各ノードのトラストストアに加えて、クラスタの他のノードのトラストストアにインストールされるため、このことは必須となります。このことは、Oracle NoSQLストアとElasticsearchクラスタの間のセキュアな通信だけでなく、クラスタ自体のノード間のセキュアな通信を実現するためにも必要です。別名は一意である必要があり、それを実現するために、各別名には鍵ペアを生成するElasticsearchノードのホスト名が含められます。
  • 各ノードで生成される鍵ペアの別名は一意である必要がありますが、その鍵ペアはすべて同じ識別名(DN) (esuserに等しい共通名(CN)を使用)を共有します。

ノート:

Elasticsearchで使用されるShieldセキュリティ・プラグインは、ユーザー認証に公開キーインフラストラクチャ(PKI)を使用します。そのため、NoSQLストアのノードがElasticserchノードと通信しようとすると、Elasticsearchノードによってストア・ノードに証明書が提示され、正常に通信するには、ストア・ノードがこれを信頼する必要があります。PKI証明書の信頼性を確立するには、次の2つのオプションがあります。
  • 自己署名公開証明書
  • 認証局(CA)によって署名された公開証明書

ここに示されているセキュアなElasticsearchクラスタでは、自己署名証明書が使用されます。前述のように、このオプションを使用するには、Elasticsearchクラスタ内の各ノードによって固有の別名を持つ独自の証明書が提供される必要があります。また、このような各証明書は、サービスのトラストストア(例: Oracle NoSQLストア)またはElasticsearchクラスタと通信するクライアントにインストールする必要があります。

単一のCA署名証明書を取得してインストールすることは、各Elasticsearchノードから自己署名証明書をインストールすることよりも簡単ですが、自己署名証明書を使用することは、PKIの概念の観点から、より有益である場合があります。自己署名証明書の使用方法を理解すると、CA署名オプションを使用するようにデプロイメントを変更することは簡単になります。

ElasticsearchおよびShieldプラグインのインストール

2.4.6バージョンのElasticsearch、ShieldおよびShieldのライセンスは次のURLにあります。

各Elasticsearchノード(eshost1eshost2およびeshost3)で、ディレクトリ/opt/esを作成し、そのディレクトリにelasticsearch-2.4.6.tar.gzをダウンロードして、Elasticsearchソフトウェアをインストールします。たとえば、各ホストで次を実行します。

mkdir –p /opt/es/install-xfer/certs

curlwgetまたはブラウザを使用して、elasticsearch-2.4.6.tar.gz/opt/esにダウンロードし、次を実行します

cd /opt/es
tar xzvf elasticsearch-2.4.6.tar.gz
ln –s elasticsearch-2.4.6 elasticsearch

Shieldディストリビューションおよびその対応するライセンスを各ノードの一時ディレクトリ(例: /tmp)にダウンロードします。これらのzipファイルは、/opt/es/elasticsearchホーム・ディレクトリに配置しないでください。配置すると、インストール・エラーが発生する可能性があります。Shieldディストリビューションおよびその対応するライセンスをダウンロードしたら、次を実行してShieldをインストールします。

export JAVA_HOME=/opt/java/java8  [if necessary]

cd /opt/es
bin/plugin install –v file:///tmp/elasticsearch-shield-license-2.4.6.zip
bin/plugin install –v file:///tmp/elasticsearch-shield-2.4.6.zip

ノート:

Elasticsearchクラスタ自体のデプロイおよびShieldプラグインのインストールには、Java 8以上が必要です。したがって、Elasticsearchノードのデフォルト・バージョンのJavaがJava 8より低い場合は、Java 8以上を各ノードにインストールし、Shieldプラグインのインストールまたはクラスタのデプロイの前に、JAVA_HOME環境変数でそのインストールを指すように設定する必要があります。

また、Shieldを初めてインストールする場合は、すべてのShield機能にアクセスできる30日間の試用ライセンスがインストールされます。この例は30日間の試用ライセンスで実行できますが、引き続きShieldの全機能を使用する場合は、試用期間の終わりにサブスクリプションを購入できます。そうしない場合、有効期限が切れた後は、モニタリング機能が無効になる機能低下モードでShieldを使用できます。

Elasticsearchキーストアでの公開鍵と秘密鍵のペアの作成およびインストール

各Elasticsearchノードで、クラスタ内の索引付けされたデータに対するセキュアな問合せを実行するためにElasticsearchのクライアントが使用できる、公開鍵と秘密鍵のペアを生成します。たとえば、eshost1で次を実行します。

keytool –genkeypair 
    –alias elasticsearch-eshost1 
    –keystore /opt/es/elasticsearch/config/shield/elasticsearch.keys 
    -keyalg RSA 
    –keysize 2048 
    –validity 1712 
    –storepass No_Sql_00 
    –keypass No_Sql_00 
    -dname CN=esuser,OU=es.org,L=es.city,S=es.state,C=US 
    -ext san=dns:localhost,dns:eshost1,dns:eshost2,dns:eshost3,
            dns:kvhost1,dns:kvhost2,dns:kvhost3

このコマンドでは、別名elasticsearch-eshost1を持つ鍵ペアが生成されます。そのノードのキーストア(elasticsearch.keys)がすでに存在する場合は、そこに鍵ペアが配置されます。そうでない場合は、鍵ペアが生成される前にキーストアが作成されます。

公開証明書のエクスポートおよびトラストストアへのインストール

各Elasticsearchノードで、先ほど生成された鍵ペアから公開証明書をエクスポートします。結果の証明書ファイルをShield構成ディレクトリ外部のディレクトリ(/opt/es/install-xfer/certsなど)に格納します。これにより、クラスタ内の他のノードおよびElasticsearchのクライアント(例: Oracle NoSqlストア)への証明書の配布が容易になります。たとえば、eshost1で次を実行します。

keytool –export 
    –alias elasticsearch-eshost1 
    –keystore /opt/es/elasticsearch/config/shield/elasticsearch.keys 
    -storepass No_Sql_00 
    -file /opt/es/install-xfer/certs/elasticsearch-eshost1.crt

このコマンドは、指定された別名を持つ公開証明書をキーストアから取得し、個別の転送ディレクトリ(install-xfer/certs)にある証明書ファイル(elasticsearch-eshost1.crt)に配置します。

証明書ファイルが使用可能になったら、ノードのトラストストアに公開証明書をインポート(インストール)します。たとえば、eshost1で次を実行します。

keytool –importcert 
    –alias elasticsearch-eshost1 
    -file /opt/es/install-xfer/certs/elasticsearch-eshost1.crt 
    –keystore /opt/es/elasticsearch/config/shield/elasticsearch.trust 
    -storepass No_Sql_00 
    -keypass No_Sql_00 
    –noprompt

ノードのトラストストアがすでに存在する場合、このコマンドは、指定されたファイルからそのトラストストア(elasticsearch.trust)に公開証明書をインストールします。そうでない場合は、証明書をインポートする前にトラストストアが作成されます。

公開キーと秘密キーのOpenSSL形式(pem/key)への変換

各Elasticsearchノードで、ノードのキーストアから以前に生成された公開鍵と秘密鍵のペアをPKCS12ファイルとして取得します。たとえば、eshost1で次を実行します。

keytool –importkeystore 
    -srckeystore /opt/es/install-xfer/certs/elasticsearch.keys 
    –srcalias elasticsearch-eshost1 
    -srcstorepass No_Sql_00 
    –dstkeystore /opt/es/install-xfer/certs/elasticsearch-eshost1.p12 
    -deststoretype PKCS12 
    -deststorepass No_Sql_00 
    -destkeypass No_Sql_00

次に、取得したばかりのPKCS12ファイルから、公開証明書をPEM形式で取得します。たとえば:

openssl pkcs12 
    -in /opt/es/install-xfer/certs/elasticsearch-eshost1.p12 
    -passin pass:No_Sql_00  
    –out /opt/es/install-xfer/certs/elasticsearch-eshost1.pem  
    -nokeys

最後に、そのPKCS12ファイルから秘密キー・ファイルを取得します。たとえば:

openssl pkcs12 
    -in /opt/es/install-xfer/certs/elasticsearch-eshost1.p12 
    -passin pass:No_Sql_00 
    –out /opt/es/install-xfer/certs/elasticsearch-eshost1.pkey 
    -nocerts

前述のコマンドでは、Elasticsearchのクライアントにインストールでき、クラスタによって索引付けされたデータに対するセキュアな問合せの実行に使用できる、elasticsearch-eshost1.pemelasticsearch-eshost1.pkeyの2つのファイルが生成されます。クラスタ構成の初期ステージでは、これらのファイルを使用してElasticsearchセキュリティが正しく構成されていることを確認できます。

ElasticsearchとShieldの構成ファイルの変更

Shieldプラグインを使用したElasticsearchの構成の実行をセキュアに完了するには、各Elasticsearchノードで次のYAML構成ファイルを変更する必要があります。
  • /opt/es/elasticsearch/config/elasticsearch.yml
  • /opt/es/elasticsearch/config/shield/role_mapping.yml

各Elasticsearchノードで、前述のファイルを編集し、次の変更を行います。

  1. 次の行をelasticsearch.ymlに追加します
    shield:
      enabled: true
      authc:
        realms:
            pki1:
                type: pki
                enabled: true            
                order: 0
      transport: 
          ssl: true
          ssl.client.auth: required 
      http:
          ssl: true
          ssl.client.auth: required
      ssl:
          keystore:"current": true,
              path: /opt/es/elasticsearch/config/shield/elasticsearch.keys
              password: No Sql_00
              key_password: No_Sql_00
          truststore:
              path: /opt/es/elasticsearch/config/shield/elasticsearch.trust
              password: No Sql_00
  2. 次の3行をrole_mapping.ymlに追加します
    admin:
        - "CN=esuser,OU=es.org.unit,O=es.org,L=es.city,ST=es.state,C=US"
        - "CN=FTS,OU=nosql.org.unit,O=nosql.org,L=nosql.city,ST=nosql.state,C=US"

Elasticsearch構成およびShield構成にこれらを追加しない場合、ユーザーまたはOracle NoSQLストアがセキュアなElasticsearchクラスタと通信しようとすると、認証またはTLS/SSLの失敗に関連するエラーが発生します。

この時点では、Oracle NoSQLストアとのセキュアな通信を実現するために、さらなる操作を実行してElasticsearchクラスタを構成する必要があります。ただし、そのためには、最初にストア自体を構成してデプロイする必要があります。現在のElasticsearchセキュリティ構成が正しいことが確実である場合は、セキュアなOracle NoSQLストアのデプロイおよび構成に直接移動し、Elasticsearchクラスタとのセキュアな通信を実現するために、セキュアなOracle NoSQLストアをデプロイして構成できます。ただし、これまでの操作が正しいことを確認する場合は、次の項に示されているステップを実行します。

[オプション] Elasticsearchセキュリティが正しく構成されていることの確認

セキュアなOracle NoSQLストアのデプロイおよび構成に進む前に、実際に、現在の構成のElasticsearchクラスタに対して問合せが正常に(かつセキュアに)実行されることを確認できます。そのためには、最初にElasticsearchノードのPEM形式の公開証明書と秘密キーを、Elasticsearchへの問合せの送信元となるすべてのクライアントにインストールする必要があります。

たとえば、クライアント・ノードの名前がclhost1であるとします。そして、各Elasticsearchノードから、公開および秘密のPEMファイルをclhost1/tmpディレクトリにコピーするとします。つまり、clhost1で次を実行します。

scp <username>@eshost1:/opt/es/install-xfer/certs/elasticsearch-eshost1.pem  /tmp
scp <username>@eshost1:/opt/es/install-xfer/certs/elasticsearch-eshost1.pkey /tmp

scp <username>@eshost2:/opt/es/install-xfer/certs/elasticsearch-eshost2.pem  /tmp
scp <username>@eshost2:/opt/es/install-xfer/certs/elasticsearch-eshost2.pkey /tmp

scp <username>@eshost3:/opt/es/install-xfer/certs/elasticsearch-eshost3.pem  /tmp
scp <username>@eshost3:/opt/es/install-xfer/certs/elasticsearch-eshost3.pkey /tmp

ls /tmp

 elasticsearch-eshost1.pem
 elasticsearch-eshost1.pkey

 elasticsearch-eshost2.pem
 elasticsearch-eshost2.pkey

 elasticsearch-eshost3.pem
 elasticsearch-eshost3.pkey

次に、各Elasticsearchノードにログインして次のコマンドを実行し、セキュアなElasticsearchクラスタをデプロイします。

eshost1の場合

cd /scratch/es
export JAVA_HOME=/opt/java/java8  [if necessary]

./elasticsearch/bin/elasticsearch 
    --cluster.name escluster 
    --node.name eshost1 
    --transport.tcp.port 29000 
    --http.port 29100 
    --discovery.zen.ping.unicast.hosts eshost1:29000,eshost2:29000,eshost3:29000

eshost2の場合

cd /scratch/es
export JAVA_HOME=/opt/java/java8  [if necessary]

./elasticsearch/bin/elasticsearch 
    --cluster.name escluster 
    --node.name eshost2 
    --transport.tcp.port 29000 
    --http.port 29100 
    --discovery.zen.ping.unicast.hosts eshost1:29000,eshost2:29000,eshost3:29000

eshost3の場合

cd /scratch/es
export JAVA_HOME=/opt/java/java8  [if necessary]

./elasticsearch/bin/elasticsearch 
    --cluster.name escluster 
    --node.name eshost3 
    --transport.tcp.port 29000 
    --http.port 29100 
    --discovery.zen.ping.unicast.hosts eshost1:29000,eshost2:29000,eshost3:29000

Elasticsearchクラスタがデプロイされると、クライアント・ノードから、Elasticsearchクラスタを構成する任意のノードに問合せを送信できます。たとえば、

curl –k –E /tmp/elasticsearch-eshost1.pem 
    –-key /tmp/elasticsearch-eshost1.pkey 
    -X GET 'https://eshost1:29100/_cat/nodes'

curl –k –E /tmp/elasticsearch-eshost2.pem 
    –-key /tmp/elasticsearch-eshost2.pkey 
    -X PUT 'https://eshost2:29100/indices'

curl –k –E /tmp/elasticsearch-eshost3.pem 
    –-key /tmp/elasticsearch-eshost3.pkey 
    -X GET 'https://eshost3:29100/_cat/indices'

必ず、問合せの送信先となるノードに対応する公開証明書と秘密キーを使用してください。

Elasticsearchクラスタが正しく構成されており、セキュアな問合せを実行できることを確認したら、各ノードでElasticsearchプロセスに対してshutdown/kill [crtl-c]を実行します。

この時点で、この項のセキュアなElasticsearchクラスタとの通信を実現するために、セキュアなOracle NoSQLストアをデプロイして構成する準備が整いました。セキュアなOracle NoSQLストアのデプロイおよび構成を参照してください。