概要
DoS/DDoS対策ができるモジュールをApacheに導入したときのメモです。
環境
- Ubuntu 20.04
- Apache 2.4系
- FWにufwを利用
さっくりとした手順
- mod_evasiveモジュールをインストールします。
- apache2実行ユーザー(www-data)がufwを利用できるように設定します。
- mod_evasiveモジュールの設定をします。
- 設定の反映を行います。
まずはサーバにターミナルログインするところから始めます。
mod_evasiveのインストール
sudo aptitude install libapache2-mod-evasive
このとき、postfixが依存関係でインストールされる場合があります。メール機能が使えない(AWS等で送信が制限されているなど)は、途中の設定で「何もしない」を選択します。
apache2実行ユーザーの権限変更
これは、www-dataがufwを実行する場合の処理です。権限昇格の危険性を承知した上で、慎重に作業を行ってください。
- sudoersファイルのバックアップ
sudo cp -pi /etc/sudoers /path/to/backup/directory/sudoers.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
- diffによるバックアップ確認
sudo diff -u /path/to/backup/directory/sudoers.$(date +%Y%m%d) /etc/sudoers
差分がないことを確認します。
- ファイル追記
echo 'www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw' | sudo tee -a /etc/sudoers
- ファイル追記確認
sudo diff -u /path/to/backup/directory/sudoers.$(date +%Y%m%d) /etc/sudoers
以下の差分を確認します。
+www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw
evasiveの設定変更
- ファイルバックアップ
sudo cp -pi /etc/apache2/mods-available/evasive.conf /path/to/backup/directory/evasive.conf.$(date +%Y%m%d)
- diffによるバックアップ確認
sudo diff -u /path/to/backup/directory/evasive.conf.$(date +%Y%m%d) /etc/apache2/mods-available/evasive.conf
差分がないことを確認します。
- 以下のファイルを教義・信仰に沿ったエディタで編集していきます。
/etc/apache2/mods-available/evasive.conf
- 編集例
DOSHashTableSize 3097
DOSPageCount 100
DOSSiteCount 100
#かなり緩く設定して、後で狭めていった方が偽陽性を防げます。
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
#DOSEmailNotify you@yourdomain.com
#メール通知を行わないため、ここを省いています
DOSSystemCommand "sudo ufw deny proto tcp from %s to any port 80,443"
# 検証時に自分のサイトがブロックされるのを防ぐため、ポートは80/443に絞っています
DOSLogDir "/var/log/mod_evasive"
DOSWhitelist 127.0.0.1
DOSWhitelist xx.xx.xx.xx
# 対象外としたいIPアドレス(自分の環境など)
参考:Apache の DoS攻撃対策モジュール mod_evasive
- 設定編集確認
sudo diff -u /path/to/backup/directory/evasive.conf.$(date +%Y%m%d) /etc/apache2/mods-available/evasive.conf
- 差分例
- #DOSHashTableSize 3097
- #DOSPageCount 2
- #DOSSiteCount 50
- #DOSPageInterval 1
- #DOSSiteInterval 1
- #DOSBlockingPeriod 10
+ DOSHashTableSize 3097
+ DOSPageCount 100
+ DOSSiteCount 100
+ DOSPageInterval 1
+ DOSSiteInterval 1
+ DOSBlockingPeriod 10
#DOSEmailNotify you@yourdomain.com
- #DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
- #DOSLogDir "/var/log/mod_evasive"
+ DOSSystemCommand "sudo ufw deny proto tcp from %s to any port 80,443"
+ DOSLogDir "/var/log/mod_evasive"
+ DOSWhitelist 127.0.0.1
+ DOSWhitelist xx.xx.xx.xx
</IfModule>
設定反映
- 構文確認
sudo apache2ctl configtest
Syntax OK
を確認します。
- apache再起動
sudo systemctl restart apache2.service
これで、不審なアクセスが大量にあったときにufwで弾く体制が整いました。