GNU/Linux >> Linux の 問題 >  >> Panels >> Webmin

プロキシ/ロード バランサーの背後での Fail2Ban

問題

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 をリロードすれば完了です!


Webmin
  1. Mod_rpaf:リバースプロキシ/ロードバランサーの背後から実IPを抽出します

  2. HAProxyロードバランサーを設定する方法

  3. Ubuntu14.04でのHAproxyロードバランサーの設定

  1. Squidプロキシサーバー

  2. プロキシの背後にあるUbuntuOne、それを機能させる方法は?

  3. プロキシの背後にあるときに ping を実行する方法は?

  1. s0.d1.smallBMCサーバーでロードバランサーを設定する方法

  2. LinuxでNGINXをTCP/UDPロードバランサーとして構成する方法

  3. AWSアプリケーションロードバランサーでホストベースのルーティングを設定する方法