Fail2ban adalah alat keamanan serbaguna. Meskipun terutama digunakan untuk mencegah serangan brute force terhadap SSH, ini juga dapat digunakan untuk melindungi layanan lain.
Ada bot yang memindai internet dan mengirim ribuan permintaan ke server web dengan harapan menemukan kerentanan. Postingan ini tentang memblokir bot tersebut dengan Fail2ban.
Kami berasumsi bahwa Anda menggunakan Apache sebagai server web Anda. Namun, instruksi ini dapat dengan mudah disesuaikan untuk nginx atau server web lainnya.
Namun, Anda harus ingat bahwa Fail2ban bukan firewall aplikasi web (WAF) dan tidak dapat memblokir permintaan jahat jika mereka berhasil melewatinya. Ini karena fail2ban mengambil tindakan dengan memantau log; Oleh karena itu, setidaknya satu upaya jahat harus dicatat sebelum Fail2ban dapat mengambil tindakan apa pun.
Apa itu bot yang buruk?
Dalam postingan ini, kami akan fokus pada pemblokiran bot yang melakukan salah satu hal berikut:
- Menelusuri situs web untuk proxy terbuka
- Mengirim permintaan GET dengan parameter itu. berisi Payload injeksi SQL
- Mengirim permintaan GET dengan parameter itu. mengandung muatan neurosis
Tentu saja, Anda juga dapat memblokir jenis serangan lainnya. Namun, kami membatasi diri pada tiga kasus yang disebutkan di atas untuk artikel ini.
Instal Fail2ban
Fail2ban tersedia di repositori sebagian besar distribusi.
Untuk menginstalnya di Debian / Ubuntu jalankan:
sudo apt-get update sudo apt-get install fail2ban
Di bawah CentOS Anda harus terlebih dahulu menggunakan repositori EPEL; Maka Anda harus mengaktifkan dan memulainya.
sudo yum -y install epel-release sudo yum -y install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
Dasar-dasar Fail2ban
Inti dari mekanisme kerja Fail2ban adalah sejumlah penjara. Sederhananya, jail menginstruksikan Fail2ban untuk melihat sejumlah log dan menerapkan filter setiap kali log berubah. Jika jumlah kecocokan untuk filter sama dengan jumlah maksimum kecocokan yang diizinkan oleh penjara, tindakan yang ditentukan di penjara akan diambil.
Jadi, Anda perlu mendefinisikan dua hal:filter dan penjara. Penjara dikonfigurasi untuk melihat log Apache untuk permintaan berbahaya.
Tentukan filter
Filter hanyalah kumpulan ekspresi reguler Python yang diperiksa terhadap log. Di sini kita harus menentukan filter untuk kriteria yang dijelaskan di atas.
Tapi pertama-tama mari kita lihat entri di log 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)"
Perhatikan bahwa header permintaan GET /robots.txt HTTP/1.1
berada dalam tanda kutip ganda. Jika Anda merancang sendiri aturan tersebut, Anda harus cukup berhati-hati untuk memastikan bahwa hanya header permintaan yang cocok. Jika tidak, Anda berisiko memblokir pengguna yang sah.
Payload injeksi SQL umumnya berisi string dalam bentuk union select(...)
atau select concat (...)
. Jadi Anda dapat mencoba mencocokkan pola ini dengan ekspresi reguler berikut:
(?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(])
<HOST>
Bagian mendefinisikan posisi alamat IP dalam entri log, dan (?i)
menunjukkan bahwa ekspresi reguler tidak peka huruf besar/kecil.
[^"]
di regex memastikan bahwa teks yang cocok diapit dalam tanda kutip ganda. Ini memastikan bahwa ekspresi reguler hanya cocok dengan header permintaan dan tidak ada yang lain. (?:%%2[8C]|[,(])
menunjukkan bahwa union select
atau select concat
koma mengikuti yang sesuai (,
) atau tanda kurung ((
), baik secara langsung atau dalam bentuk kode persen.
Sering kali, bot yang mencari proxy terbuka mengirim permintaan dalam bentuk:
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"
Ekspresi reguler seperti berikut ini dapat dengan mudah mencocokkan ini:
(?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+)
Ekspresi reguler (?:(?:GET|POST|HEAD) https?:
cocok dengan persyaratan tipe pertama, sedangkan ekspresi reguler CONNECT [a-z0-9.-]+:[0-9]+
memenuhi persyaratan tipe kedua.
Bot yang memindai Shellshock sering mengirim permintaan seperti:
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/"
Ekspresi reguler seperti ini cocok dengan pola untuk Shellshock:
<HOST> -.*"()s*{[^;"]+[^}"]+}s*;
Di sini kami memeriksanya () { <command>; }
Pola dan s
memperhitungkan ruang akun yang mungkin disertakan dalam permintaan jahat.
Jika kita menggabungkannya, sekarang kita dapat menulis filter kita:
[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
memungkinkan Anda memasukkan item ke daftar putih. Anda dapat menambahkan regex yang diabaikan seperti yang dilakukan untuk failregex.
Simpan filter di atas di /etc/fail2ban/filter.d/badbot.local
Tentukan penjara
Sekarang setelah Anda menentukan filter, saatnya untuk menentukan jail. Di sini kami memblokir alamat IP selama enam menit jika mengirimkan tiga permintaan seperti itu dalam enam menit.
Tambahkan ini ke /etc/fail2ban/jail.local
milik Anda Berkas:
[badbot] enabled = true port = http,https filter = badbot logpath = /var/log/apache*/*access.log maxretry = 3 banaction = iptables-multiport findtime = 360 bantime = 360
Setelah Anda mengonfigurasi jail, Anda harus memulai ulang fail2ban agar perubahan ini diterapkan. Bergantung pada distribusi Anda, salah satu dari perintah ini akan diperlukan untuk memulai ulang:
sudo systemctl restart fail2ban sudo service fail2ban restart
fail2ban sekarang memblokir semua upaya bot jahat yang mencoba menyerang server web Anda. Anda dapat memperluas aturan ini ke server web Anda yang lain atau jenis serangan lain yang mungkin Anda lihat.