GNU/Linux >> Belajar Linux >  >> Panels >> Webmin

Fail2Ban Dibalik Proxy/Load Balancer

Masalah

Anda memiliki pengguna yang ingin Anda blokir / blokir dari server web Anda menggunakan Fail2Ban tetapi server web Anda berada di belakang proxy sehingga semua lalu lintas tampaknya berasal dari IP/Antarmuka server proxy.

Idealnya Anda harus memiliki aturan pembelajaran di proxy atau penyeimbang beban tempat Anda dapat memfilter/menilai/mengambil tindakan secara otomatis, tetapi hal ini mungkin tidak selalu terjadi.

Kebanyakan orang yang menemukan masalah ini sampai pada bagian pertama dari solusi tetapi kemudian bingung ketika mereka menggunakan Fail2Ban dan masih tidak berhasil.

Untuk sisa posting ini, saya akan merujuk ke Proxy/Load Balancer hanya sebagai LB, terutama karena solusi ini dikembangkan untuk tiga server web di belakang load balancer.

Ubah LB Anda

Pastikan LB Anda diatur untuk menambahkan header http “X-Forwarded-For”.

Cara Anda mengaktifkan ini akan bergantung pada LB Anda dan berada di luar cakupan postingan ini.

Ubah Konfigurasi Apache Server Web Anda

Khususnya seputar penebangan. Kami ingin memastikan bahwa Fail2Ban dapat mengidentifikasi IP yang "benar" agar berhasil memblokirnya.

Saya biasanya menggunakan format log khusus dan menambahkan X-Forwarded-For detail di akhir dalam blok yang mudah dikenali, ini muncul di log di akhir sebagai “[XF www.xxx.yyy.zzz]”

Untuk melakukan ini, saya menggunakan arahan berikut dalam definisi vhost di Apache:

CustomLog /path/to/logs/access_log "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" \"[XF %{X-Forwarded-For}i]\""

Anda kemudian akan mulai melihat log sebagai berikut:

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]"

Jadi yang kami minati di sini adalah bahwa permintaan tersebut berasal dari IP eksternal 10.10.1.1 (ya, saya tahu itu ruang alamat pribadi tetapi untuk posting ini saya tidak akan menggunakan alamat IP "asli")

Buat Resep Filter Fail2Ban Anda

Ada tiga bagian dari ini, filter, "penjara" dan tindakan IPTable khusus.

Filter

Buat filter Anda di fail2ban/filter.d sesuai:

# 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 =

Tindakan

Buat tindakan IPTables khusus Anda di fail2ban/action.d sesuai:

# 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

Perbedaan antara ini dan DROP IPTables biasa adalah kita harus melakukan inspeksi paket di mana kita mencari X-Forwarded-For dan alamat IP yang relevan dalam paket sebelum kita menjatuhkannya. Ini biasanya berfungsi tetapi jarak tempuh Anda mungkin berbeda.

Penjara

Sekarang Anda dapat mencampur resep Anda dan menempelkannya di fail2ban/jail.local Anda berkas

[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

Jadi di sini kami akan mengizinkan 5 upaya login dalam satu menit, setelah itu Anda diblokir dari server selama 15 menit.

Muat ulang fail2ban dan selesai!


Webmin
  1. Mod_rpaf:Ekstrak real-IP dari belakang reverse proxy/load balancer

  2. Server Proksi Squid

  3. Mengonfigurasi penyeimbang beban HAproxy di Ubuntu 14.04

  1. Cara mengonfigurasi penyeimbang beban HAProxy

  2. Ubuntu One Behind A Proxy, Bagaimana Cara Membuatnya Bekerja?

  3. Bagaimana cara melakukan ping saat berada di belakang proxy?

  1. Cara Mengatur Load Balancer pada Server BMC s0.d1.small

  2. Cara Mengonfigurasi NGINX sebagai Penyeimbang Beban TCP/UDP di Linux

  3. Cara mengonfigurasi perutean Berbasis Host pada penyeimbang beban aplikasi AWS