Sheildを使用したセキュアなElasticsearch
次に、Elasticsearchクラスタをセキュアに実行するように構成するためのステップを示します。次の各項に記載されている説明は、次の前提と要件のリストに基づいています。
セキュアなElasticsearchクラスタに関する前提
- Elasticsearchディストリビューションの2.4.6バージョンは、ディレクトリ
/opt/es/elasticsearch
にインストールされています。 - Shieldアダプタ(およびライセンス)の2.4.6バージョンは、Elasticsearch構成(次を参照)にインストールされています。
- Elasticsearchクラスタをホストするeshost1、eshost2および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)を使用)を共有します。
ノート:
- 自己署名公開証明書
- 認証局(CA)によって署名された公開証明書
ここに示されているセキュアなElasticsearchクラスタでは、自己署名証明書が使用されます。前述のように、このオプションを使用するには、Elasticsearchクラスタ内の各ノードによって固有の別名を持つ独自の証明書が提供される必要があります。また、このような各証明書は、サービスのトラストストア(例: Oracle NoSQLストア)またはElasticsearchクラスタと通信するクライアントにインストールする必要があります。
単一のCA署名証明書を取得してインストールすることは、各Elasticsearchノードから自己署名証明書をインストールすることよりも簡単ですが、自己署名証明書を使用することは、PKIの概念の観点から、より有益である場合があります。自己署名証明書の使用方法を理解すると、CA署名オプションを使用するようにデプロイメントを変更することは簡単になります。
ElasticsearchおよびShieldプラグインのインストール
2.4.6バージョンのElasticsearch、ShieldおよびShieldのライセンスは次のURLにあります。
- https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.6/elasticsearch-2.4.6.tar.gz
- https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/shield/2.4.6/shield-2.4.6.zip
- https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/license/2.4.6/license-2.4.6.zip
各Elasticsearchノード(eshost1、eshost2およびeshost3)で、ディレクトリ/opt/es
を作成し、そのディレクトリにelasticsearch-2.4.6.tar.gz
をダウンロードして、Elasticsearchソフトウェアをインストールします。たとえば、各ホストで次を実行します。
mkdir –p /opt/es/install-xfer/certs
curl
、wget
またはブラウザを使用して、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.pem
とelasticsearch-eshost1.pkey
の2つのファイルが生成されます。クラスタ構成の初期ステージでは、これらのファイルを使用してElasticsearchセキュリティが正しく構成されていることを確認できます。
ElasticsearchとShieldの構成ファイルの変更
/opt/es/elasticsearch/config/elasticsearch.yml
/opt/es/elasticsearch/config/shield/role_mapping.yml
各Elasticsearchノードで、前述のファイルを編集し、次の変更を行います。
- 次の行を
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
- 次の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ストアのデプロイおよび構成を参照してください。