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!