私は、ホストしているドメインへの悪意のあるリクエストを検出するために fail2ban を使用していますが、1 つの例外を除いて非常にうまく機能しています。
リクエストが FQDN またはサブドメインではなく IP に送信された場合、IP 自体は仮想ホストではないため、リクエストはキャッチされ、other_vhosts_access.log に書き込まれます。
エントリ例:
somedomain.de:80 20.37.96.167 - - [2020/1/24:15:47:04 +0100] "POST //4walls/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 301 587 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/79.0.3945.88 Safari/537.36"
つまり、Apache は IP を逆引きして、最初にホスト名を書き留めるようです。
これにより、fail2ban はリクエスト元の IP ではなく、サーバーの IP を自己禁止するようになります。
somedomain.de:80 エントリを防ぐにはどうすればよいですか?
答え1
Apache は IP を逆引きして、最初にホスト名を書き留めます。
フィルターが正しく作成されている場合 (キャッチオールのないアンカー正規表現など)、ドメインと外部アドレスが正確にどこに記述されているかは問題になりません。
somedomain.de
あなたの例のログ エントリでは、 はあなたのもので、20.37.96.167
は「侵入者」のアドレスであると想定します。適切な failregex は次のようになります。
# ban everything (with code 300-599):
failregex = ^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+
アンカー部分が^\S+\s+<ADDR>
一致しsomedomain.de:80 20.37.96.167
、アンカーのためだけに begin から文字列が検索されます^
。結果の http-status
に関係なく、すべてを禁止する必要がある場合は、正規表現としてもこれで十分です。other_vhosts_access.log
fail2ban バージョン <= 0.9 の場合は、<HOST>
の代わりにを使用します<ADDR>
。
fail2ban-regex
また、次のようにして、誤検知がないか確認することもできます。
fail2ban-regex --raw -vv /path/to/log '^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+' \
| grep <your-IP-or-hostname>