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
にあり、openssl
も PATH
にあることを前提としています。Windows および Solaris 用の OpenSSL バイナリについては、https://wiki.openssl.org/index.php/Binaries を参照してください。
-ext SAN=…
keytool
オプションを使用すると、ホスト名検証を必須にする場合に許可されるすべての DNS 名や IP アドレスを指定できます。
この例では、localhost
と 127.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
一般的な SSL 関連のシステムプロパティの設定
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ノードが起動する前に、クラスタ全体のプロパティであるurlScheme
をhttps
に設定する必要があります。以下の例では、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.cmd でZK_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_ENABLED
をfalse
に設定することで無効にできます。デフォルトでは、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が含まれていない場合は、こちらからバイナリをダウンロードできます:https://curl.se/download.html |
bin/solrを使用してSolrCloudコレクションを作成する
_default
configsetを使用して、mycollectionという名前の2つのシャード、replicationFactor = 1のコレクションを作成します
bin/solr create -c mycollection -shards 2
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();