問題
Fail2Ban を使用して Web サーバーから禁止/ブロックしたいユーザーがいますが、Web サーバーはプロキシの背後にあるため、すべてのトラフィックがプロキシ サーバーの IP/インターフェイスから来ているように見えます.
プロキシまたはロード バランサーに、自動的にフィルター処理/評価/アクションを実行できる学習ルールを設定するのが理想的ですが、常にそうであるとは限りません。
この問題に遭遇したほとんどの人は、解決策の最初の部分まで到達しますが、Fail2Ban を使用すると困惑し、それでも機能しません。
この投稿の残りの部分では、プロキシ/ロード バランサーを単に LB と呼びます。これは主に、このソリューションがロード バランサーの背後にある 3 つの Web サーバー用に開発されたためです。
LB を変更
LB が http ヘッダー「X-Forwarded-For」を追加するように設定されていることを確認してください。
これを有効にする方法は LB によって異なり、この投稿の範囲外です。
Web サーバーの Apache 構成を変更する
特にロギング関連。私たちは、Fail2Ban が「正しい」IP を識別して、それを首尾よく禁止できるようにしたいと考えています。
私は通常、カスタム ログ形式を使用し、X-Forwarded-For の詳細を識別しやすいブロックの最後に追加します。これはログの最後に “[XF www.xxx.yyy.zzz]” として表示されます。
これを行うには、Apache の vhost 定義で次のディレクティブを使用します:
CustomLog /path/to/logs/access_log "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"[XF %{X-Forwarded-For}i]\""
その後、次のようにログが表示されるようになります:
192.168.1.2 - - [29/Sep/2014:10:56:31 +0100] "POST /login.php HTTP/1.1" 200 15 "-" "curl/7.19.7 " "[XF 10.10.1.1]"
ここで注目しているのは、リクエストが外部 IP 10.10.1.1 から来ていることです (はい、それがプライベート アドレス空間であることはわかっていますが、この記事では「実際の」IP アドレスは使用しません)
Fail2Ban フィルター レシピを作成する
これには、フィルター、「jail」、およびカスタム IPTable アクションの 3 つの部分があります。
フィルター
fail2ban/filter.d でフィルタを作成します それに応じて:
# Fail2Ban configuration file # # Author: Centos.Tips # # $Revision: 1$ # [Definition] # Option: failregex # Notes.: Regexp to catch Apache brute force login attempts (using X-Forwarded-For) # Values: TEXT # failregex = POST .*/login.php.*\[XF <HOST> # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
アクション
fail2ban/action.d でカスタム IPTables アクションを作成します それに応じて:
# Fail2Ban configuration file # # Author: Centos.Tips # # [INCLUDES] before = iptables-blocktype.conf [Definition] # Option: actionstart # Notes.: command executed once at the start of Fail2Ban. # Values: CMD # actionstart = iptables -N fail2ban-<name> iptables -A fail2ban-<name> -j RETURN iptables -I <chain> -p <protocol> --dport <port> -j fail2ban-<name> # Option: actionstop # Notes.: command executed once at the end of Fail2Ban # Values: CMD # actionstop = iptables -D <chain> -p <protocol> --dport <port> -j fail2ban-<name> iptables -F fail2ban-<name> iptables -X fail2ban-<name> # Option: actioncheck # Notes.: command executed once before each actionban command # Values: CMD # actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]' # Option: actionban # Notes.: command executed when banning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: See jail.conf(5) man page # Values: CMD # actionban = iptables -I fail2ban-<name> 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP # Option: actionunban # Notes.: command executed when unbanning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: See jail.conf(5) man page # Values: CMD # actionunban = iptables -D fail2ban-<name> -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP [Init] # Default name of the chain # name = default # Option: port # Notes.: specifies port to monitor # Values: [ NUM | STRING ] Default: # port = http # Option: protocol # Notes.: internally used by config reader for interpolations. # Values: [ tcp | udp | icmp | all ] Default: tcp # protocol = tcp # Option: chain # Notes specifies the iptables chain to which the fail2ban rules should be # added # Values: STRING Default: INPUT chain = INPUT
これと通常の IPTables DROP との違いは、ドロップする前にパケット内の X-Forwarded-For と関連する IP アドレスを探すパケット インスペクションを行う必要があることです。これは通常はうまくいくはずですが、マイレージは異なる場合があります.
刑務所
これで、レシピを混ぜ合わせて fail2ban/jail.local に貼り付けることができます ファイル
[apache-proxy] enabled = true filter = apache-proxy action = iptables-proxy[name = apache-proxy, port = http, protocol = tcp] sendmail-whois[name=LoginDetect, [email protected], [email protected], sendername="Fail2Ban"] port = http logpath = /path/to/your/access_log maxretry = 5 findtime = 60 bantime = 900
ここでは、1 分間に 5 回のログイン試行を許可し、その後 15 分間サーバーからブロックされます。
fail2ban をリロードすれば完了です!