全文検索エンジンの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 件のコメント :
コメントを投稿