UNIX的なアレ:gihyo.jp出張所

第19回知っておきたいApacheの基礎知識 その15

Apacheを使う大きな魅力のうちの1つが、さまざまなモジュールによって提供されている豊富な機能でしょう。本連載でも、Apacheに標準で付属しているモジュールを紹介してきました。

しかし、Apacheで利用することのできるモジュールは標準で付属できるものだけでなくサードパーティ製のものも利用することができます。標準モジュールだけでは実現しない機能がある……とお悩みの方は是非サードパーティ製のモジュールを試してみましょう。

今回は、知っておくと便利なサードパーティ製のモジュールを一部紹介したいと思います。

mod_securityでセキュリティ向上を

どれだけ気を配っていても、Webアプリケーションの脆弱性は出てしまうもの。となると、前段のApacheで怪しいアクセスをはじいてしまえばある程度は安全に利用することができそうですね。そういった発想から生まれたモジュールが、mod_securityです。

下記のサイトから、⁠modsecurity-Apache_2.5.9.tar.gz」というファイルをダウンロードしてください(2009年7月11日時点最新バージョン⁠⁠。

mod_securityのインストール

それではインストールしてみましょう。一部必要なライブラリがありますので、インストールしてから実施します。debian/centosそれぞれに表記してありますので、お使いのディストリビューションごとに選択してください。

ライブラリのインストール(debian)
$ sudo apt-get install libpcre3-dev
$ sudo apt-get install libxml2-dev
ライブラリのインストール(centos)
$ sudo yum install libxml2-devel

さて、必要なライブラリのインストールが完了したら今度はmod_securityのインストールへ移りましょう。なお、${APACHE_SRC_DIR}はApacheのソースコードが展開してあるディレクトリを意味しています。

$ tar xvfz ./modsecurity-Apache_2.5.9.tar.gz && cd ./modsecurity-Apache_2.5.9/Apache2/
$ ./configure \
 --with-httpd-src=${APACHE_SRC_DIR} \
 --with-apxs=/usr/local/Apache2/bin/apxs 
$ make && sudo make install

それではモジュールが正常にインストールできたら、確認をしてみましょう。

$ ls -l /usr/local/Apache2/modules/mod_security2.so 
-rwxr-xr-x 1 root staff 1005036 2009-06-05 16:24 /usr/local/Apache2/modules/mod_security2.so

上記のファイルが生成されていれば成功です。

また、設定ファイルのサンプルが同梱されていますのでこちらもconf以下にコピーしておきます。

$ sudo cp -ir ../rules /usr/local/Apache2/conf/
$ ls -l /usr/local/Apache2/conf/rules/*conf
-rwxr-xr-x 1 root staff 12325 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_10_config.conf
-rwxr-xr-x 1 root staff  5164 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_20_protocol_violations.conf
-rwxr-xr-x 1 root staff  3538 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_21_protocol_anomalies.conf
-rwxr-xr-x 1 root staff  2496 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_23_request_limits.conf
-rwxr-xr-x 1 root staff  6399 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_30_http_policy.conf
-rwxr-xr-x 1 root staff  2720 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_35_bad_robots.conf
-rwxr-xr-x 1 root staff 28726 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_40_generic_attacks.conf
-rwxr-xr-x 1 root staff  2463 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_45_trojans.conf
-rwxr-xr-x 1 root staff  8268 2009-06-05 16:49 /usr/local/Apache2/conf/rules/modsecurity_crs_50_outbound.conf

上記のファイルが正常にコピーされていれば完了です。

mod_securityの設定方法

それではmod_securityを設定しましょう。

mod_security自体の設定は非常に難解なのですが、それぞれのサンプルが用意されています。こちらをベースに修正していくのがよいでしょう。

まずは手っ取り早い方法として、以下の2行を追記してください。

LoadModule security2_module modules/mod_security2.so
Include conf/rules/modsecurity*conf

これで基本的なmod_securityのルールが適用されます。ただし、これでセキュリティが万全になった、というわけではありません。当然ながら、本来ならアプリケーションで実装すべき部分です。あくまで万が一の保険のときのためと考えておきましょう。

また、設定ファイルを見ていただくとわかると思いますがかなり複雑な正規表現が入っています。そのためパフォーマンスの劣化につながる可能性もありますので、利用する場所も限定して使うと良いでしょう。

mod_geoipを使ってアクセスする国判定

アクセスする国別に言語を切り替えるということを行っているサイトは多々ありますが、多くの場合がブラウザの送信してくる、AcceptLanguageがベースとなっています。

表示の切り替えに関しては問題はありませんが、どこの国からどれだけアクセスされているのかをちゃんと把握したいケースもあるでしょう。そのときに効果的なモジュールが、mod_geoipというモジュールです。

製品版もありますが、フリーで使えるバージョンも用意されていますので利用してみましょう。なお、Apache用モジュールの他に、Cライブラリと辞書が必要になりますので一緒にダウンロードしておいてください。

下記のサイトから、⁠GeoIP-1.4.6.tar.gz」⁠downlomod_geoip2_1.2.5.tar.gz」⁠GeoIP.dat.gz」の3つもファイルをダウンロードしてください(2009年7月11日時点最新バージョン⁠⁠。

mod_geoipのインストール

それではmod_geoipをインストールしましょう。まずは、Cのライブラリからインストールします。

$ tar xvfz GeoIP-1.4.6.tar.gz && cd GeoIP-1.4.6/
$ ./configure 
$ make && sudo make install

Cライブラリが正常にインストールできたら、次はApacheのモジュールのインストールにとりかかりましょう。

$ tar xvfz mod_geoip2_1.2.5.tar.gz && cd mod_geoip2_1.2.5/
$ sudo /usr/local/Apache2/bin/apxs -a -i -c ./mod_geoip.c

それではモジュールが正常にインストールされたかどうか、確認をしてみましょう。

$ ls -l /usr/local/Apache2/modules/mod_geoip.so
 -rwxr-xr-x 1 root root 38487 2009-07-12 20:45 /usr/local/Apache2/modules/mod_geoip.so

上記のファイルが生成されていれば成功です。

それでは最後にGeoIPのデータベースとなるファイルをCopyしておきましょう。

$ GeoIP.dat.gz && sudo cp -i GeoIP.dat /usr/local/Apache/conf

これで準備は完了です。

mod_geoipのセットアップ

それではmod_geoipを設定してみましょう。今回は、アクセスしてきた国をaccess_logに書き込むための設定を入れてみます。下記の設定を、httpd.confに追記してください。

NameVirtualHost *:80

LoadModule geoip_module modules/mod_geoip.so

GeoIPEnable On
GeoIPDBFile conf/GeoIP.dat
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{GEOIP_COUNTRY_CODE}e\"" geoip_log

<VirtualHost *:80>
    DocumentRoot /usr/local/Apache2/vhosts/www.example.com/htdocs
    ServerName www.example.com
    ErrorLog /usr/local/Apache2/vhosts/www.example.com/logs/error_log
    CustomLog /usr/local/Apache2/vhosts/www.example.com/logs/access_log geoip_log
</VirtualHost>

非常に簡単な設定ですね。これは、GeoIPのモジュールを有効にすることで⁠GEOIP_COUNTRY_CODE⁠という環境変数が利用できるようになったためです。あとは、LogFormatの中で環境変数をLogとして記録する設定を入れるだけで簡単にLogに記録することができます。これをアプリケーション内で利用したい場合は、環境変数を読むだけで簡単に使うことができます。

なお、プライベートIPアドレスでアクセスしている場合は判定できませんので注意してください。

サードパーティ製のモジュールの注意点

さて、今回は2つのモジュールを紹介してきました。どちらもちょっと変わったモジュールではありますが非常に便利な機能をそなえています。ただし、あくまでサードパーティ製であることは踏まえたうえで利用しましょう。

今回紹介したモジュールはどちらも開発に企業がかかわっているので、それなりに信頼はできると思います。

しかしながら、中には個人で作成して公開している人もいますので、注意が必要です。

ある程度は自分で責任をもって運用できる場合に、利用をするようにしましょう。

おすすめ記事

記事・ニュース一覧