SSL の有効化

Solr は、Secure Sockets Layer 暗号化 (SSL) を使用して、クライアントとの間および SolrCloud モードのノード間で通信を暗号化できます。

このセクションでは、自己署名証明書を使用して SSL を有効にする方法について説明します。

SSL 証明書とキーの背景については、http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/ を参照してください。

SSL 用の Solr の構成

自己署名証明書とキーの生成

サーバーとクライアントの両方を認証するために使用される自己署名証明書と単一のキーを生成するには、JDK keytool コマンドを使用して、別のキーストアを作成します。このキーストアは、以下でトラストストアとしても使用されます。これらの目的に JDK に付属のキーストアを使用したり、別のトラストストアを使用したりすることもできますが、ここではそれらのオプションについては説明しません。

バイナリ Solr ディストリビューションの server/etc/ ディレクトリで以下のコマンドを実行します。JDK keytool ユーティリティが PATH にあり、opensslPATH にあることを前提としています。Windows および Solaris 用の OpenSSL バイナリについては、https://wiki.openssl.org/index.php/Binaries を参照してください。

-ext SAN=…​ keytool オプションを使用すると、ホスト名検証を必須にする場合に許可されるすべての DNS 名や IP アドレスを指定できます。

この例では、localhost127.0.0.1 に加えて、Solr ノードが実行されるマシンの LAN IP アドレス 192.168.1.3 を含めています。

$ keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret -storepass secret -validity 9999 -keystore solr-ssl.keystore.p12 -storetype PKCS12 -ext SAN=DNS:localhost,IP:192.168.1.3,IP:127.0.0.1 -dname "CN=localhost, OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country"

上記のコマンドにより、現在のディレクトリに solr-ssl.keystore.p12 という名前のキーストアファイルが作成されます。

curl で使用するための証明書とキーの PEM 形式への変換

証明書とキーの両方を含む PKCS12 形式のキーストアを、openssl コマンドを使用して PEM 形式に変換します。

$ openssl pkcs12 -in solr-ssl.keystore.p12 -out solr-ssl.pem

OS X Yosemite (10.10) で curl を使用する場合は、以下のように証明書のみの PEM 形式のバージョンを作成する必要があります。

$ openssl pkcs12 -nokeys -in solr-ssl.keystore.p12 -out solr-ssl.cacert.pem

Solr コントロールスクリプトは、SSL 関連の Java システムプロパティを JVM に渡すようにすでに設定されています。SSL 設定を有効にするには、*nix システムでは bin/solr.in.sh、Windows では bin\solr.in.cmd にある SOLR_SSL_* で始まるプロパティのセットのコメントを解除して更新します。

*nix (solr.in.sh)

Solr を本番環境に移行する に概説されている手順に従って Linux で Solr をサービスとして設定した場合は、/var/solr/solr.in.sh でこれらの変更を行います。
# Enables HTTPS. It is implicitly true if you set SOLR_SSL_KEY_STORE. Use this config
# to enable https module with custom jetty configuration.
SOLR_SSL_ENABLED=true
# Uncomment to set SSL-related system properties
# Be sure to update the paths to the correct keystore for your environment
SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.p12
SOLR_SSL_KEY_STORE_PASSWORD=secret
SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.p12
SOLR_SSL_TRUST_STORE_PASSWORD=secret
# Require clients to authenticate
SOLR_SSL_NEED_CLIENT_AUTH=false
# Enable clients to authenticate (but not require)
SOLR_SSL_WANT_CLIENT_AUTH=false
# SSL Certificates contain host/ip "peer name" information that is validated by default. Setting
# this to false can be useful to disable these checks when re-using a certificate on many hosts.
# This will also be used for the default value of whether SNI Host checking should be enabled.
SOLR_SSL_CHECK_PEER_NAME=true

Windows (solr.in.cmd)

REM Enables HTTPS. It is implicitly true if you set SOLR_SSL_KEY_STORE. Use this config
REM to enable https module with custom jetty configuration.
set SOLR_SSL_ENABLED=true
REM Uncomment to set SSL-related system properties
REM Be sure to update the paths to the correct keystore for your environment
set SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.p12
set SOLR_SSL_KEY_STORE_PASSWORD=secret
set SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.p12
set SOLR_SSL_TRUST_STORE_PASSWORD=secret
REM Require clients to authenticate
set SOLR_SSL_NEED_CLIENT_AUTH=false
REM Enable clients to authenticate (but not require)
set SOLR_SSL_WANT_CLIENT_AUTH=false
REM SSL Certificates contain host/ip "peer name" information that is validated by default. Setting
REM this to false can be useful to disable these checks when re-using a certificate on many hosts.
REM This will also be used for the default value of whether SNI Host checking should be enabled.
set SOLR_SSL_CHECK_PEER_NAME=true
クライアント認証設定
SOLR_SSL_NEED_CLIENT_AUTH または SOLR_SSL_WANT_CLIENT_AUTH のいずれかを有効にしますが、両方を同時に有効にしないでください。これらは相互に排他的であり、Jetty は期待どおりではない可能性のあるいずれかを選択します。クライアント証明書のホスト名検証を無効にする場合は、SOLR_SSL_CLIENT_HOSTNAME_VERIFICATION を false に設定する必要があります。

Solr を起動すると、bin/solr スクリプトにこれらの設定が含まれており、システムプロパティとして JVM に渡されます。

ユーザー管理クラスターまたはシングルノードインストールで Solr を実行している場合は、ユーザー管理クラスターまたはシングルノード Solr の起動 にスキップできます。

ただし、SolrCloud を使用している場合は、Solr を起動する前に ZooKeeper を構成する必要があります。

Hadoop クレデンシャルストアを介したパスワード配布

Solr は、Hadoop クレデンシャルストアからキーストアとトラストストアのパスワードを読み取ることをサポートしています。パスワードのローテーションと配布がクレデンシャルストアによってすでに処理されている場合、このアプローチは有益です。

Hadoop クレデンシャルストアを使用していない場合は、この手順をスキップできます。

Hadoop クレデンシャルストアは、次の 2 つの手順で Solr で使用できます。

Hadoop クレデンシャルストアの提供

Hadoopクレデンシャルストアファイルを作成し、以下のエントリを実際のキーストアパスワードで定義してください。

solr.jetty.keystore.password
solr.jetty.truststore.password
javax.net.ssl.keyStorePassword
javax.net.ssl.trustStorePassword

javax.net.ssl.*設定が設定されていない場合、対応するsolr.jetty.*設定にフォールバックすることに注意してください。

Hadoopクレデンシャルストアを使用するようにSolrを設定する

Solrがキーストアパスワードにクレデンシャルストアファイルを使用するためには、3つのパラメータを設定する必要があります。

solr.ssl.credential.provider.chain

必須

デフォルト: none

クレデンシャルプロバイダチェーン。これはhadoopに設定する必要があります。

SOLR_HADOOP_CREDENTIAL_PROVIDER_PATH

必須

デフォルト: none

クレデンシャルストアファイルへのパス。

HADOOP_CREDSTORE_PASSWORD

必須

デフォルト: none

クレデンシャルストアのパスワード。

*nix (solr.in.sh)

SOLR_OPTS=" -Dsolr.ssl.credential.provider.chain=hadoop"
SOLR_HADOOP_CREDENTIAL_PROVIDER_PATH=localjceks://file/home/solr/hadoop-credential-provider.jceks
HADOOP_CREDSTORE_PASSWORD="credStorePass123"

Windows (solr.in.cmd)

set SOLR_OPTS=" -Dsolr.ssl.credential.provider.chain=hadoop"
set SOLR_HADOOP_CREDENTIAL_PROVIDER_PATH=localjceks://file/home/solr/hadoop-credential-provider.jceks
set HADOOP_CREDSTORE_PASSWORD="credStorePass123"

ZooKeeperの設定

ZooKeeperは、Solrのようなクライアントとの暗号化された通信をサポートしていません。SSLサポートが計画・開発中の関連するJIRAチケットがいくつかあります:ZOOKEEPER-235; ZOOKEEPER-236; ZOOKEEPER-1000; および ZOOKEEPER-2120.

上記のキーストアを作成した後、SolrCloudノードを起動する前に、SolrノードがSSLを介して通信するように、ZooKeeperでSolrクラスタプロパティを設定する必要があります。

このセクションでは、外部ZooKeeperを作成して起動していることを前提としています。詳細については、ZooKeeperアンサンブル構成を参照してください。

Solrノードが起動する前に、クラスタ全体のプロパティであるurlSchemehttpsに設定する必要があります。以下の例では、Solrに付属のzkcliツールを使用してこれを行います。

*nixコマンド

$ server/scripts/cloud-scripts/zkcli.sh -zkhost server1:2181,server2:2181,server3:2181 -cmd clusterprop -name urlScheme -val https

Windowsコマンド

C:\> server\scripts\cloud-scripts\zkcli.bat -zkhost server1:2181,server2:2181,server3:2181 -cmd clusterprop -name urlScheme -val https

システムに合わせて正しいzkhost値を使用してください。ZooKeeperアンサンブルがSolrのchrootを使用するように設定している場合は、zkhost文字列にそれを含めるようにしてください。例えば、-zkhost server1:2181,server2:2181,server3:2181/solrのようになります。

既存のコレクションのクラスタプロパティを更新する

SolrCloudを使用しており、SSLを有効にする前にコレクションを作成している場合は、HTTPSを使用するようにクラスタプロパティを更新する必要があります。

既存のコレクションがない場合、またはSolrCloudを使用していない場合は、先に進んでSolrを起動できます。

クラスタプロパティの更新は、コレクションAPIのCLUSTERPROPコマンドを使用して行うことができます。次の例では、ホスト名とポートをシステムに合わせて適切に更新してください。

$ https://127.0.0.1:8983/solr/admin/collections?action=CLUSTERPROP&name=urlScheme&val=https

このコマンドは、クラスタの1つのノードでのみ実行する必要があり、変更はすべてのノードに適用されます。

このステップおよび他のすべてのステップが完了したら、Solrを起動できます。

SSL有効化後のSolrの起動

ユーザー管理クラスタまたはシングルノードSolrの起動

以下の例に示すように、Solrコントロールスクリプトを使用してSolrを起動します。必要に応じて、表示されているパラメータの値をカスタマイズし、システムで使用されているものを追加します。

*nixコマンド

$ bin/solr -p 8984

Windowsコマンド

C:\> bin\solr.cmd -p 8984

SolrCloudの起動

solr.in.sh/solr.in.cmdZK_HOSTを定義している場合は(Solrインクルードファイルの更新を参照)、以下のすべてのbin/solr/bin\solr.cmdコマンドから-z <zk host string>を省略できます。

以下の例に示すように、Solrコントロールスクリプトを使用して各Solrノードを起動します。必要に応じて、表示されているパラメータの値をカスタマイズし、システムで使用されているものを追加します。

Solrノードが実行されるすべてのDNS名またはIPアドレスを含めずにSSLキーを作成した場合は、-Dsolr.ssl.checkPeerName=falseシステムプロパティを設定して、ノード間通信のホスト名検証をスキップするようにSolrに指示できます。

\*nix

$ bin/solr -cloud -s cloud/node1 -z server1:2181,server2:2181,server3:2181 -p 8984

Windows

C:\> bin\solr.cmd -cloud -s cloud\node1 -z server1:2181,server2:2181,server3:2181

キーストア/トラストストアの自動リロード

Solrサーバー

Solrは、証明書が更新されたときに、再起動せずにキーストア/トラストストアを自動的にリロードできます。これはSSLを使用する場合はデフォルトで有効になっていますが、環境変数SOLR_SSL_RELOAD_ENABLEDfalseに設定することで無効にできます。デフォルトでは、Solrは30秒ごとにキーストアの更新をチェックしますが、この間隔は、起動時にシステムプロパティsolr.jetty.sslContext.reload.scanIntervalを新しい間隔(秒単位)で渡すことで更新できます。トラストストアファイルはアクティブに監視されないため、トラストストアに変更を適用する必要がある場合は、トラストストアを更新した後、キーストアに触れてリロードをトリガーする必要があります。

SolrJクライアント

Http2SolrClientビルダーには、変更のためにキーストアとトラストストアを監視および更新するスキャナーを初期化するためのメソッドwithKeyStoreReloadInterval(long interval, TimeUnit unit)があります。CloudHttp2SolrClientを使用している場合は、withInternalClientBuilder(Http2SolrClient.Builder internalClientBuilder)を使用して、内部HTTPクライアントにキーストアのリロード間隔を設定できます。最小リロード間隔は1秒です。設定されていない場合(または0または負の値に設定されている場合)、キーストア/トラストストアはクライアントで更新されません。

クライアントアクションの例

OS X Mavericks(10.9)のcurlは、SSLサポートが低下しています。一方向SSLを許可するための詳細および回避策については、https://curl.se/mail/archive-2013-10/0036.htmlを参照してください。OS X Yosemite(10.10)のcurlは改善されています - 双方向SSLが可能です - https://curl.se/mail/archive-2014-10/0053.htmlを参照してください。

次のセクションのcurlコマンドは、OS X Yosemite(10.10)のシステムcurlでは機能しません。代わりに、-Eパラメータで提供される証明書はPKCS12形式である必要があり、--cacertパラメータで提供されるファイルにはCA証明書のみが含まれている必要があり、キーは含まれていない必要があります(このファイルの作成方法については、上記を参照してください)。

$ curl -E solr-ssl.keystore.p12:secret --cacert solr-ssl.cacert.pem ...
オペレーティングシステムにcurlが含まれていない場合は、こちらからバイナリをダウンロードできます:https://curl.se/download.html

bin/solrを使用してSolrCloudコレクションを作成する

_default configsetを使用して、mycollectionという名前の2つのシャード、replicationFactor = 1のコレクションを作成します

*nixコマンド
bin/solr create -c mycollection -shards 2
Windowsコマンド
bin\solr.cmd create -c mycollection -shards 2

createアクションは、インクルードファイルで設定されたSOLR_SSL_*プロパティを、コレクションの作成に使用されるSolrJコードに渡します。

curlを使用してSolrCloudクラスタステータスを取得する

結果のクラスタステータスを取得するには(クライアント認証を有効にしていない場合は、-E solr-ssl.pem:secretオプションを削除してください)

$ curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://127.0.0.1:8984/solr/admin/collections?action=CLUSTERSTATUS&indent=on"

次のような応答が返ってくるはずです

{
  "responseHeader":{
    "status":0,
    "QTime":2041},
  "cluster":{
    "collections":{
      "mycollection":{
        "shards":{
          "shard1":{
            "range":"80000000-ffffffff",
            "state":"active",
            "replicas":{"core_node1":{
                "state":"active",
                "base_url":"https://127.0.0.1:8984/solr",
                "core":"mycollection_shard1_replica1",
                "node_name":"127.0.0.1:8984_solr",
                "leader":"true"}}},
          "shard2":{
            "range":"0-7fffffff",
            "state":"active",
            "replicas":{"core_node2":{
                "state":"active",
                "base_url":"https://127.0.0.1:7574/solr",
                "core":"mycollection_shard2_replica1",
                "node_name":"127.0.0.1:7574_solr",
                "leader":"true"}}}},
        "router":{"name":"compositeId"},
        "replicationFactor":"1"}},
    "properties":{"urlScheme":"https"}}}

post.jarを使用してドキュメントをインデックス化する

post.jarを使用して、上記のSolrCloudコレクションにいくつかのサンプルドキュメントをインデックス化します

$ cd example/exampledocs

$ java -Djavax.net.ssl.keyStorePassword=secret -Djavax.net.ssl.keyStore=../../server/etc/solr-ssl.keystore.p12 -Djavax.net.ssl.trustStore=../../server/etc/solr-ssl.keystore.p12 -Djavax.net.ssl.trustStorePassword=secret -Durl=https://127.0.0.1:8984/solr/mycollection/update -jar post.jar *.xml

curlを使用してクエリする

上記で作成したPEM形式の証明書とキー(例:example/etc/)を含むディレクトリから、curlを使用して上記で作成したSolrCloudコレクションにクエリします。クライアント認証(システムプロパティ-Djetty.ssl.clientAuth=true))を有効にしていない場合は、-E solr-ssl.pem:secretオプションを削除できます

curl -E solr-ssl.pem:secret --cacert solr-ssl.pem "https://127.0.0.1:8984/solr/mycollection/select?q=*:*"

CloudSolrClientを使用してドキュメントをインデックス化する

SolrJを使用したJavaクライアントから、ドキュメントをインデックス化します。以下のコードでは、javax.net.ssl.*システムプロパティがプログラムで設定されていますが、上記のpost.jarの例のように、Javaコマンドラインで指定することもできます

System.setProperty("javax.net.ssl.keyStore", "/path/to/solr-ssl.keystore.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "secret");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.trustStore", "/path/to/solr-ssl.keystore.p12");
System.setProperty("javax.net.ssl.trustStorePassword", "secret");
System.setProperty("javax.net.ssl.trustStoreType", "pkcs12");
String zkHost = "127.0.0.1:2181";
CloudSolrClient client = new CloudSolrClient.Builder(Collections.singletonList(zkHost),Optional.empty()).withDefaultCollection("mycollection").build();
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1234");
doc.addField("name", "A lovely summer holiday");
client.add(doc);
client.commit();