Fail2ban は汎用性の高いセキュリティ ツールです。主に SSH に対するブルート フォース攻撃を防ぐために使用されますが、他のサービスを保護するためにも使用できます。
脆弱性を見つけるために、インターネットをスキャンし、何千ものリクエストを Web サーバーに送信するボットがあります。この投稿は、Fail2ban でそのようなボットをブロックすることに関するものです。
Web サーバーとして Apache を使用していると仮定します。ただし、これらの手順は、nginx またはその他の Web サーバー用に簡単にカスタマイズできます。
ただし、Fail2ban は Web アプリケーション ファイアウォール (WAF) ではないため、悪意のあるリクエストが通過してもブロックできないことに注意してください。これは、fail2ban がログを監視してアクションを実行するためです。したがって、Fail2ban がアクションを実行するには、少なくとも 1 回の悪意のある試みがログに記録される必要があります。
そもそも悪いボットとは?
この投稿では、次のいずれかを行うボットのブロックに焦点を当てます:
- Web サイトでオープン プロキシを検索します
- 次のパラメータを含む GET リクエストを送信します。 SQL インジェクション ペイロードを含む
- 次のパラメータを含む GET リクエストを送信します。神経症ペイロードを含む
もちろん、他の種類の攻撃もブロックできます。ただし、この記事では上記の 3 つのケースに限定しています。
Fail2ban をインストール
Fail2ban は、ほとんどのディストリビューションのリポジトリで利用できます。
Debian / Ubuntu にインストールするには:
sudo apt-get update sudo apt-get install fail2ban
CentOS では、最初に EPEL リポジトリを使用する必要があります。次に、アクティブ化して開始する必要があります。
sudo yum -y install epel-release sudo yum -y install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
Fail2ban の基本
Fail2ban の動作メカニズムの中心には、多数の監獄があります。簡単に言えば、jail は Fail2ban に多くのログを見て、ログが変更されるたびにフィルターを適用するように指示します。フィルターの一致数が、jail で許可されている最大一致数と等しい場合、jail で指定されたアクションが実行されます。
したがって、フィルターと刑務所という 2 つのものを定義する必要があります。 jail は、Apache のログで悪意のあるリクエストを確認するように構成されています。
フィルターを定義する
フィルターは、ログに対してチェックされる Python 正規表現の集まりです。ここで、上記の基準のフィルターを定義する必要があります。
しかし、最初に Apache ログのエントリを見てみましょう:
66.249.79.189 - - [17/Jan/2017:14:10:41 +0000] "GET /robots.txt HTTP/1.1" 200 3494 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +https: //www.google.com/bot.html)"
リクエストヘッダー GET /robots.txt HTTP/1.1
に注意してください は二重引用符で囲みます。このようなルールを自分で設計する場合は、リクエスト ヘッダーのみが一致するように十分注意する必要があります。そうしないと、正当なユーザーをブロックする危険があります。
通常、SQL インジェクション ペイロードには union select(...)
の形式の文字列が含まれます。 または select concat (...)
.したがって、このパターンを次の正規表現と照合してみてください:
(?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(])
<HOST>
部分は、ログ エントリ内の IP アドレスの位置を定義し、(?i)
正規表現が大文字と小文字を区別しないことを示します。
[^"]
正規表現で一致するテキストが二重引用符で囲まれていることを確認します。これにより、正規表現がリクエスト ヘッダーのみに一致し、それ以外には一致しないことが保証されます。 (?:%%2[8C]|[,(])
union select
であることを示します または select concat
それに応じてコンマが続きます (,
) またはブラケット ((
)、直接またはパーセント コード化された形式で。
多くの場合、オープン プロキシを探しているボットは次の形式でリクエストを送信します:
101.33.59.9 - - [17/Jan/2017:14:10:41 +0000] "GET https://google.com/ HTTP/1.1" 400 3494 "-" "Mozilla" 101.33.59.9 - - [17/Jan/2017:14:10:44 +0000] "CONNECT yahoo.com:80" 400 3499 "-" "Mozilla"
次のような正規表現は、これらに簡単に一致させることができます:
(?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+)
正規表現 (?:(?:GET|POST|HEAD) https?:
最初のタイプの要件に一致しますが、正規表現 CONNECT [a-z0-9.-]+:[0-9]+
2 番目のタイプの要件を満たしています。
Shellshock をスキャンするボットは、多くの場合、次のようなリクエストを送信します:
10.11.12.13 - - [17/Jan/2016:16:00:00 +0000] "GET /cgi-bin/printenv.cgi HTTP/1.0" 200 1 "-" "() { test;};echo "Content-type: text/plain"; echo; echo; /bin/rm -rf /var/www/"
このような正規表現は、Shellshock のパターンと一致します:
<HOST> -.*"()s*{[^;"]+[^}"]+}s*;
ここで、() { <command>; }
をチェックします。 パターンと s
悪意のあるリクエストに含まれる可能性のあるスペースを考慮します。
それらを組み合わせると、フィルターを記述できるようになります。
[Definition] failregex = <HOST> -.*"()s*{[^;"]+[^}"]+}s*; (?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(]) (?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+) ignoreregex =
ignoreregex
アイテムをホワイトリストに登録できます。 failregex の場合と同じように、無視される正規表現を追加できます。
上記のフィルタを /etc/fail2ban/filter.d/badbot.local
に保存します
刑務所を定義する
フィルターを定義したので、次は刑務所を定義します。ここでは、IP アドレスが 6 分以内にそのようなリクエストを 3 回送信した場合、その IP アドレスを 6 分間ブロックします。
これをあなたのものに追加 /etc/fail2ban/jail.local
ファイル:
[badbot] enabled = true port = http,https filter = badbot logpath = /var/log/apache*/*access.log maxretry = 3 banaction = iptables-multiport findtime = 360 bantime = 360
jail を設定したら、これらの変更を有効にするために fail2ban を再起動する必要があります。ディストリビューションによっては、再起動するために次のコマンドのいずれかが必要になります:
sudo systemctl restart fail2ban sudo service fail2ban restart
fail2ban は、Web サーバーを攻撃しようとする悪意のあるボットによるすべての試みをブロックするようになりました。これらのルールを、他の Web サーバーやその他の種類の攻撃に拡張できます。