Apache SolrのDigest認証とポート変更、アクセスログを記録する

全文検索エンジンの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を限定する等の方法があるでしょう。
詳しくはこちらのブログが参考になります。

セキュリティのためのApache Solrアクセス制限あれこれ|A Day In The Boy’s Life

0 件のコメント :

PAGE TOP