SolrにBasic認証を設定する
Solrの管理画面やAPIへのアクセスに認証を掛けることができます。この記事ではBASIC認証を設定してみます。
SolrCloudの環境では Zookeeper の /security.json に設定ファイルを置きます。 Solrリファレンス にはユーザ:solr パスワード:SolrRocks で設定する例が載っています。
$ ./zkcli.sh -zkhost localhost:9983 -cmd put /security.json '{ "authentication":{ "blockUnknown": true, "class":"solr.BasicAuthPlugin", "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="} } }'
この後Solrの再起動でBASIC認証が有効になり、管理画面にブラウザでアクセスすると、ユーザ名とパスワードの入力を促されます。ここで solr と SolrRocks で確かにログインできます。
このままリファレンスに載っているユーザとパスワードを使い続ける訳にはいかないので、別のユーザを追加することを考えます。初めは security.json に追加の設定を記載するのかと思いましたが、パスワードをSolrが期待する形式でハッシュ化する方法が分かりませんでした。結局のところ、リファレンスに書いてある通り、APIで設定変更するしかなさそうです。
ここで、APIへのHTTPアクセスにも認証が必要となります。
新しいユーザの追加
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"solradmin":"solrpass"}}'
最初に設定した solr ユーザの削除
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"delete-user": ["solr"]}'
追加と削除の後の security.json の内容を確認
$ server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd get /security.json {"authentication":{ "blockUnknown":true, "class":"solr.BasicAuthPlugin", "credentials":{"solradmin":"AkZTG0uVSAgfzB/OC+kI1tqw9aeR8pP05tpNdcnnfN8= wRKTRwEcTX5eiCgEmCfIRXdRf9zIq2/Aef/LP6ZzdIQ="}, "":{"v":13}}}
確かに変わっています。パスワードもハッシュ化されています。
管理画面だけではなく、コマンドラインツールも認証が必要になります。
bin/post -c mycollection data.json POSTing file data4.json (application/json) to [base]/json/docs SimplePostTool: WARNING: Solr returned an error #401 (require authentication) for url: http://localhost:8983/solr/mycollection/update/json/docs SimplePostTool: FATAL: Looks like Solr is secured and would not let us in. Try with another user in '-u' parameter
オプションで指定するだけなので簡単。
bin/post -u solradmin:solrpass -c mycollection data.json
昔は認証が必要な場合は Jetty 側でなんとかしていたようですが、今は Solr 側で設定できるようになっています。Solr 8.4 からは認証が設定されていない場合にはAPI経由での設定ファイルのアップロード(というかアップロードする設定の内容)に制限が付くこともあるので、この辺の設定もきちんと押さえておきたいところです。