新サーバーに旧サーバーでも使っていたmod_evasiveをインストールしたが、動かなかったので同じようにDoS攻撃対策のフリーソフトfail2banをインストールした。
代替ソフトとして dosdetector も考えたがリポジトリにあるのがfail2banだけだった
環境: Apache 2.4.57 (AlmaLinux9)
fail2banのインストール方法
リポジトリからインストール可能か
sudo dnf list fail2ban
インストール
sudo dnf install fail2ban
fail2banの設定方法
まず、jail.local
ファイルを作成する。Fail2banはjail.local
の設定を優先して適用するので、必要な設定を書き込む。
jail.localの作成
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
もしくは
sudo vi /etc/fail2ban/jail.local
以下のように書き込んだ
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[site1-dos]
enabled = true
port = http,https
filter = site1-dos
logpath = /var/log/httpd/site1_access_log
maxretry = 10
findtime = 1m
bantime = 10m
# バーチャルホストの場合
[site2-dos]
enabled = true
port = http,https
filter = site2-dos
logpath = /var/log/httpd/site2_access_log
maxretry = 10
findtime = 1m
bantime = 10m
つぎに/etc/fail2ban/filter.d
ディレクトリにフィルタファイル site1-dos.conf
を作成
sudo vi /etc/fail2ban/filter.d/site1-dos.conf
Apacheのアクセスログに基づいて、大量のGETまたはPOSTリクエストを送信するIPアドレスを検出するように正規表現で書き込む
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"
ファイルを作ったら再起動
sudo systemctl restart fail2ban
ステータスを確認
sudo fail2ban-client status site1-dos
banなどがあるとここでわかる
稼働中か
sudo systemctl status fail2ban
起動
sudo systemctl start fail2ban
サーバー起動時に自動的に起動
sudo systemctl enable fail2ban
名前解決ができないエラー
設定が終わり、動作確認のため以下のコマンドを実行
sudo fail2ban-regex /var/log/httpd/access_log /etc/fail2ban/filter.d/site1-dos.conf
すると名前解決ができないエラーが出る
Running tests
Use failregex filter file : site1-dos, basedir: /etc/fail2ban
Use log file : /var/log/httpd/access_log
Use encoding : UTF-8
^CTraceback (most recent call last):
File "/usr/lib/python3.9/site-packages/fail2ban/server/ipdns.py", line 97, in dnsToIp
for result in socket.getaddrinfo(dns, None, fam, 0, socket.IPPROTO_TCP):
File "/usr/lib64/python3.9/socket.py", line 954, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
During handling of the above exception, another exception occurred:
ターミナルから名前解決ができるか確認するができない
$ nslookup ec2-44-214-187-82.compute-1.amazonaws.com
-bash: nslookup: command not found
nslookup
コマンドをインストールする
sudo dnf install bind-utils
これで nslookup
コマンドを実行して、名前解決ができるようになった
再び動作テスト
sudo fail2ban-regex /var/log/httpd/access_log /etc/fail2ban/filter.d/site1-dos.conf
コマンドライン上は、問題なく動いた