私のWebサーバー(Apache2)は、次のようなURLを要求する悪意のあるボットによって絶えず攻撃されています。
/blog/tag/pnphpbb2//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301
//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200
/wiki/index.php/Main:Some_Wiki_Pagename//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200
/wiki/index.php//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200
/blog/2009/01/title-of-post-here//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301
毎晩のcronプロセスで、「悪意のある」URLを要求しているホストを見つけて、hosts.denyと同等のHTTPに追加したいと思います。
悪意のあるURLを定義する一連の正規表現と、ホストの拒否を簡単に実行するためのApacheプラグインがあると思います(毎晩httpdを再起動する必要はありません)。
このようなものはありますか?
http://www.modsecurity.org/ あなたが望むことをするかもしれません。
fail2ban /var/log/Apache/error_logなどのログファイルをスキャンし、正規表現(フィルターと呼ばれる)に基づいてこれらの自動スキャンを行うIPを禁止します。デフォルトでは、ファイアウォール(iptables)を更新して、問題のあるIPをブロックします。新しいアクションを書くのは非常に簡単で、.htaccessを更新するためのアクションを実装するのは非常に簡単なはずです。fail2banディストリビューションにはいくつかの例があります。
2番目に fail2ban 。ライブで動作し、一時的に禁止でき、ファイアウォールにIPアドレスを追加できるため、Apacheは時間を無駄にする必要がありません。
ipset netfilter module for iptables(大量のアドレスを処理する場合はより高速)と組み合わせるとさらに効率的になり、ブロックされる前に1つまたは2つのリクエストのみを実行できるように即座に禁止できます。
これらの人々を本当に嫌いでLinuxを実行している場合は、iptablesのtarpittingを実装することもできます(クイック検索で2.6互換のパッチは見つかりませんでした)。これにより、接続が受け入れられ、すぐにウィンドウサイズが0に設定されます(データが転送されないようになります)が、リモートエンドが接続を完全に閉じることも防止されます。つまり、接続しているアプリは3〜20の間待機する必要があります( !!)接続が終了する数分前。
これは、ポートスキャナーを停止する場合にも最適です。これは、ポートスキャナーに通常よりも桁違いに時間がかかるためです。
もう1つの可能性は、mod_rewriteを使用してURLを照合し、クライアントに403(または任意のコード)を送信することです。例:
RewriteEngine on
RewriteRule ^/.*passwd.*/ - [L,NC,G]
または楽しみのために:
RewriteEngine on
RewriteRule ^/(.*passwd.*)/ http://127.0.0.1/$1 [L,NC,R=301]
私は確かにOSSECを見ます。これらのパターンを検出し、IPアドレスをブロックできます。また、スキャン(たとえば、複数の404)を探し、違反者のIPをブロックします。
そして、はい、それはデフォルトでそれを行います。
リンク: http://www.ossec.net
Apache 2.0の場合は、mod_accessを試すことができます: http://httpd.Apache.org/docs/2.0/mod/mod_access.html
Apache 2.2では、mod_authz_Hostです: http://httpd.Apache.org/docs/2.2/mod/mod_authz_Host.html
ただし、モジュールの構成の変更を有効にするには、構成を再ロードするようにApacheに通知する必要があるようです。
編集:Modsecurityは、ログファイルをgrepして上記のいずれかを使用して静的な拒否構成を構築するのとは対照的に、必要なもののように見えます。私は今その答えに賛成するつもりです。