理屈はCentOS等のLinux環境でも多分同じになるかと思います。事例の一つとして参考にしてください。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 7.5 (wheezy)
Release: 7.5
Codename: wheezy
$ apache2 -version
Server version: Apache/2.2.22 (Debian)
Server built: Jan 31 2014 18:55:37
ヤボ用で、監視ソフトZabbixのAPIを試していたとき、HTTP 403でアクセスが失敗するケースが頻発しました。
そのとき、サーバ(Apache2)側で以下のようなエラーが出ていました。
[Tue May 20 10:59:01 2014] [error] [client XXX.XXX.XXX.XXX] client denied by server configuration: /usr/share/zabbix/api_jsonrpc.php
このメッセージ自体は、設定ミスで表示されることが多いようです。調べると大方そちらが出ます。典型的な事例では allow from all
に相当する設定が抜けていて、アクセスを一律で遮断されるケースです。
ただ、今回は「たまに」発生するため、事情が異なるようでした。DEBUG相当のログでも理由が出なかったので、謎は深まります。
もうすこし調べたところ、どうもApacheにインストールされているDOSモジュール、具体的にはmod_evasiveの問題であることが分かってきました。
- 今回、同一バージョンのZabbixサーバを2台対象にしていたが、片方だけおかしい -> 単なるバグ・設定不良とは思われない
- Chromeから同サーバへアクセスしているタブを閉じると改善される -> 同時アクセス数が多いと問題になっている様子
- 問題の起きているサーバでプロセス数等を今回のレベルで制約する設定はされていない
- mod-security は入れていないが、……知らないモジュール
mod-evasive
が入っていた。 -
a2dismod mod-evasive
前後で問題が改善される -> つまりこれか
さて原因が分かれば設定を変更するだけです。
以降、mod-evasiveのトリビア
調べた限りではメールを送る設定も作れるようなので、ついでなので実際のDOSアタック時にメールしてもらう設定も追加することにしました。
こちらを参考にします: http://www.yourhowto.net/installing-mod_security-and-mod_evasive-on-debian/
mod-evasive自体は設定ファイルがありませんでした。なので、下記のファイルを作ります。
<IfModule mod_evasive20.c>
...(色々)...
DOSEmailNotify watashino@meado.example.com
DOSWhitelist 127.0.0.1
DOSWhiteList XXX.XXX.XXX.XXX
</IfModule>
a2enmod
が行うようにsymlinkをmods-enabledに入れるのも忘れないこと。
(このあたりはCentOS等では全く違う構造になるはずなので注意です)
なおDOSWhiteList
はコンマ区切りではなくて別行にて指定みたいです。
あともう一点。調査不足を前提に書くと、標準のmod-evasiveは/bin/mail
の存在を仮定しているのですが、これが私の環境にはありませんでした。代わりに /usr/bin/mail
ならあるので、そちらを使うように変更するのですが、これがソースコードレベル以外受け付けないらしいので、ちょっと面倒。
今回はローカル環境についてはパッケージを再ビルドしました。ビルド方法は省略します。
ついでに/bin/mail
がない部分についてはバグ報告しました。バグではないのかもしれませんが……