全文検索エンジンのApache Solr (Lucene)を運用する際に、Solrの管理ページやAPI(select, update等)をDigest認証で守る方法です。
SolrはWebサーバとして動作するので、どんな言語環境からでもHTTP通信するだけで利用できるのが良いところ。
反面、ローカル環境にでも置かない限り、どこからでも接続ができてしまいます。
通信内容まで暗号化するSSL+Basic認証にするのが一番堅牢だと思いますが、ひとまずログインだけでも安全にしたいという場合に。
試した環境
- Solrのバージョンは4.7.1
- CentOS 6.5
前提条件
- Solrの起動までは出来ていること
- Linuxサーバ構築等の基本的な知識はあることが望ましい
SolrはWebサーバに、JavaベースのJettyを使っていて、Apacheはよく使っているけどJettyは初めて知ったという人もいるのではないかと思います。その辺りの詳しい解説は、他のサイトに任せます。
» Jetty : wikipedia
今回手を加えるのは、このJettyの設定ファイルです。
Apacheでいう httpd.conf や .htaccess のようなものですね。
- jetty.xml
- webdefault.xml
起動するコアの /etc/ ディレクトリに入っています。
1. コアの /etc/ ディレクトリに移動
cd /var/local/solr-4.7.1/[コア名]/etc/
2. ユーザー名とパスワード、ゾーン名を決める
ここでは便宜的に以下のように記述しています。
- ユーザー名:username
- パスワード:password
- ゾーン名:admin-role
3. MD5ハッシュのパスワードファイルを生成
htdigest -c realm.properties "admin-role" username
Jettyにもパスワード生成ツールはあるみたいですが、Solr付属のJettyには見当たらなかったのでhtdigestコマンドを使ってます。ここでは、設定するパスワードの入力が求められます。
4. 生成したパスワードファイルをjetty用に書き換え
vi realm.properties
username:admin-role:password
↓
username: MD5:password, admin-role
このように書き換えます。
5. jetty.xmlの設定
vi jetty.xml
<Configure></Configure>内に以下を追加。最後の行にでも。
<Call name="addBean">
<Arg>
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">admin-role</Set>
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
<Set name="refreshInterval">0</Set>
</New>
</Arg>
</Call>
6. webdefault.xmlの設定
vi webdefault.xml
<web-app></web-app> 内に以下を追加。最後の行にでも。
<url-pattern>*</url-pattern> で、SolrのURL全てに認証をかけています。
これを設定したあとの管理画面では、ページ遷移しているうちに何度かパスワードの入力を求められるかもしれませんが、ブラウザに記憶させておけばいいでしょう。
admin-roleは先ほど決めたゾーン名にしておきましょう。
<login-config>
<realm-name>admin-role</realm-name>
<auth-method>DIGEST</auth-method>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Admin</web-resource-name>
<url-pattern>*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin-role</role-name>
</auth-constraint>
</security-constraint>
以上で完了です。
これらの設定を済ませたら、Solrを再起動しましょう。
以降、管理画面やAPIへのアクセスにはユーザー名とパスワードが求められるようになります。phpスクリプト等からのアクセスにもDigest認証の記述が必要になるので忘れないように。
Solrのポート番号を変更する
ついでに、ポート番号も変更しておくと、多少はリスクを減らせます。
以下では8080に設定しています。空いているポートをSolr用に決めて、設定しましょう。
設定後は、iptablesなどファイアーウォールのポートを空けるように。
solr.xmlのhostPortを変更。
vi /var/local/solr-4.7.1/[コア名]/solr/solr.xml
<solrcloud>
<str name="host">${host:}</str>
<int name="hostPort">${jetty.port:8080}</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
jetty.xmlのportを変更。
vi /var/local/solr-4.7.1/[コア名]/etc/jetty.xml
<Call name="addConnector">
<Arg>
<New class="org.eclipse.jetty.server.bio.SocketConnector">
<Set name="host"><SystemProperty name="jetty.host" /></Set>
<Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
<Set name="maxIdleTime">50000</Set>
<Set name="lowResourceMaxIdleTime">1500</Set>
<Set name="statsOn">false</Set>
</New>
</Arg>
</Call>
JettyでHTTPアクセスログを取る
Jettyでもアクセスログを記録するようにします。
Apacheでは /var/log/httpd/ ディレクトリ下にログを保存していますね。
Jettyのログ保存用に /var/log/ 下にディレクトリを作ります。
cd /var/log mkdir jetty
jetty.xmlにて設定します。
vi /var/local/solr-4.7.1/[コア名]/etc/jetty.xml
以下の内容を探して、コメントアウトされていたら、外します。
ログの保存先を決めて、タイムゾーンに日本時間を設定。jettyのログは日毎に保存されるようで、retainDaysで保持する日数を決めます。
ローテーションしたファイルはgzip圧縮させることは出来ないのかな?
結構な容量になるので、設定した後はしばらく監視した方が良さげ。
<Ref id="Handlers">
<Call name="addHandler">
<Arg>
<New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
<Set name="requestLog">
<New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog">
<Set name="filename">
/var/log/jetty/yyyy_mm_dd.log
</Set>
<Set name="filenameDateFormat">yyyy_MM_dd</Set>
<Set name="retainDays">90</Set>
<Set name="append">true</Set>
<Set name="extended">false</Set>
<Set name="logCookies">false</Set>
<Set name="LogTimeZone">GMT+9</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Ref>
これに加えて、selectやupdateはlocalhost(127.0.0.1)からの接続に限定したり、自身のIPが固定されているのであれば接続できるIPを限定する等の方法があるでしょう。
詳しくはこちらのブログが参考になります。


0 件のコメント :
コメントを投稿