Fail2ban で不正アクセス防止 (apache 編)

Fail2ban を導入してから、dovecot の不正アクセス防止に効果があったので、httpd (apache) へも適用することにしました。

Fail2ban の基本的な設定としては jail.conf とフィルター設定が対になっていることがわかりました。dovecot では両方作成したのですが、apache については、インストール時に既定のjail.conf 設定とフィルター設定がいくつかあるので参考にしながら作成しました。

今回は Directory traversal 攻撃 への対策をしました。

1. jail.conf の変更

jail.conf をエディターで開いて、以下の設定を追加します。

[apache-exploit]
enabled  = true
filter   = apache-exploit
action   = iptables[name=apache-exploit, port=http, protocol=tcp]
           sendmail-whois[name=apache-exploit, dest=root, sender=fail2ban]
logpath  = /var/log/httpd/access_log
maxretry = 1

– フィルター名に apache-exploit、
– アクションには iptables で http のポート、tcp プロトコルをアクセス禁止にします。 そして、root 宛てにメールを送信します。
– スキャンするログファイルは apache のアクセスログを指定します。

2. apache-exploit.conf (フィルター) の作成

次にフィルターを作成します。フィルターとは、fail2ban にそのログからアクセスを禁止させたい失敗パターン(認証失敗など)を指定します。

/etc/fail2ban/filter.d/ の下に apache-exploit.conf 名前でファイルを作成して以下の内容で保存します。

[Definition]
failregex = ^ -.*"(GET|POST).*?.*../../../.* HTTP/.*$

ignoreregex = 

上記のフィルターで、以下のアクセスがマッチしてアクセス元のIP アドレスからのアクセスを禁止します。

1XX.XXX.XX.X - - [09/Oct/2012:09:00:35 +0900] "GET //index.php?option=com_Jgrid&controller=../../../../../../../../../../../../../../../proc/self/environ%00 HTTP/1.1" 404 294 "-" "libwww-perl/5.834"

fail2ban が不正アクセスを検出すると、以下のようなメールが送信されてきます。

~ 抜粋 ~
Hi,
 
The IP 1XX.XXX.XX.X has just been banned by Fail2Ban after
1 attempts against apache-exploit.
 
 
Here are more information about 1XX.XXX.XX.X:
~ 以下省略 ~

以上です。

CentOS5x Apache mod_rewrite の設定

当サイトの「郵便番号住所検索サービス」サンプルのURL パラメータ(“yubin/?zipcode=1234123”) を階層として (“yubin/1234123/” ) 使用できるように、 mod_rewrite を使ってURLを置き換ています。

その方法をご紹介します。

mod_rewrite のインストールと有効化

まずは、mod_rewrite がインストールされているかを確認します。

CentOS インストール時または、後から apache を yum コマンドでインストールした場合は、mod_rewriteは入っていると思います。 下記フォルダを確認して、mod_rewrite.so があればインストールされています。

# ll /etc/httpd/modules/mod_rewrite.so

次に、httpd.conf で、mod_rewrite モジュールが読み込まれているかを確認します。コメントにされている場合は、コメントを外します。

--- httpd.conf 抜粋 ---
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
...(省略)...
LoadModule rewrite_module modules/mod_rewrite.so
...(省略)...

mod_rewrite の設定

冒頭で説明したとおり、

.../yubin/getaddress/1234567/

へアクセスにきたら:

.../yubin/getaddress.php?zipcode=1234567

を実行し、ブラウザのURL表示はもとのURL(アクセスしたURL)を表示する。

これを実現するために、以下の yubin.conf を作成して、/etc/httpd/conf.d/ ディレクトリに配置します。

--- .htaccess ---
<Directory /wwwroot/samples/yubin>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^getaddress/([0-9]+)/?$ getaddress.php?zipcode=$1 [L]
</Directory>
--------------------------

RewriteEngine ディレクティブは、リライト(書き換え)エンジンを無効 (Off) または、有効化(On)にします。

RewriteCond ディレクティブは、ルールの条件を指定します。 %{REQEST_FILENAME} はサーバー変数(Server Variables) の一つで、上記の例の場合、ファイルが存在しないか、ディレクトリが存在しない場合にルールを適用するということになります。

RewriteRule はディレクティブはルールを記述します。アクセスにきた getaddress 以下の階層ディレクトリを正規表現で一致したパターンのURLに書き換え実行します。

ここで、apache を再起動します。

# service httpd restart

動作確認

http://www.northwind.mydns.jp/samples/yubin/getaddress/370/

を実行すると、CSV形式で郵便データがリターンされます。

また、以下の形式でも同じ結果が得られます。

http://www.northwind.mydns.jp/samples/yubin/getaddress.php?zipcode=370