Menangkal Serangan Brute Force dengan Fail2ban

Serangan bruteforce termasuk serangan yang cukup berbahaya apalagi jika attacker dibiarkan bebas melakukan percobaan login hingga ribuan kali. Nah kali ini saya akan menulis tutorial bagaimana menangkal bruteforce menggunakan Fail2ban. Cara kerjanya, fail2ban akan "mengatur" rules di iptables dimana jika sebuah serangan bruteforce terjadi, ip dari penyerang akan diblock permanen atau hingga waktu yang ditentukan. Untuk tutorial ini saya mencoba mengamankan service pada ssh login dan juga login wordpress.

Pada tutorial ini saya menggunakan webserver nginx dengan sistem operasi Ubuntu 16.10 . Untuk sistem operasi lain mirip mirip jadi silahkan mengikuti saja.
Oke pertama kita install fail2ban.
sudo apt update
sudo apt install fail2ban
Sekarang kita konfigurasi fail2ban nya terlebih dahulu.
sudo nano /etc/fail2ban/jail.local
Ini pengaturan default saya :
[DEFAULT]
ignoreip = 127.0.0.1/8
ignorecommand =
bantime  = 23600
findtime  = 100
maxretry = 2
enabled = false
bantime menunjukkan berapa lama attacker akan dibanned. Satuannya adalah detik. Jika ingin melakukan banned permanen, isi value nya menjadi "-1" .
maxretry menunjukkan berapa kali percobaan gagal yang diijinkan. disini saya membuat rule jika dua kali gagal login maka ip akan di block.
enabled = false . Yup, disini memang defaultnya service yang dimanage oleh fail2ban hanya ssh. Dan memang lebih baik jangan diganti. Jika ingin menghidupkan service, edit saja di service yang ingin dihidupkan dengan value true.
findtime disini menunjukkan batasan waktu percobaan gagal yang dibolehkan sebelum dibanned. Dari contoh saya diatas, maksudnya jika ada percobaan gagal dua kali dalam kurun 100 detik, maka ip akan dibanned selama 23600 detik.

Untuk setingan lain silahkan sesuaikan sendiri ya, panjang soalnya. Atau kalau ada yang bingung bisa langsung tanya tanya di facebook saya yuyudhn1337 .
Oke kita lanjut ke service yang ingin dipasang fail2ban.
Disini saya akan memasang proteksi fail2ban di service login ssh. Dimana memang saat ini banyak hacker yang melakukan bruteforce pada port ssh.
[sshd]
enabled = true
port    = ssh
action = iptables-multiport[name="bannedssh", port="80,443,22,48"]
logpath = %(sshd_log)s
maxretry = 3

Disini saya menggunakan bantime, maxretry dan findtime dari default yang sudah diatur diatas. Kalau kalian ingin menggunakan value berbeda bisa ditambahkan sendiri dibawahnya. Untuk port, disini "ssh" maksudnya adalah port default yang berada di port 22. Jika kalian menggunakan port lain untuk service ssh, tinggal diganti saja. Misal kalian login ssh di port 1337, maka isikan port = 1337 .

Oke sudah paham? Disini selain melindungi login ssh saya juga ingin memproteksi login wordpress dengan fail2ban.
Pertama install fail2ban plugins di WordPress kalian.
Oke jika sudah terinstall, copy rule yang dibuat plugin ini ke direktori filter fail2ban. Disini saya menggunakan hard filter.
sudo cp /path/to/wordpress/wp-content/plugins/wp-fail2ban/filters.d/wordpress-hard.conf /etc/fail2ban/filter.d/
Sekarang kita edit lagi jail.local nya.
sudo nano /etc/fail2ban/jail.local
Lalu tambahkan di paling bawah :
[wordpress-hard]
enabled = true
port = http, https
filter = wordpress-hard
action = iptables-multiport[name="fuck-lamers", port="http,https"]
logpath = /var/log/auth.log
maxretry = 3
Nama wordpress-hard disesuaikan dengan nama filter yang ada di folder filter.d . Jadi jangan ngasal. Untuk rule lain sudah saya jelaskan diatas jadi silahkan dipahami sendiri atau disesuaikan sendiri.
Oke, sekarang sedikit tweaking di iptables nya.
Matikan dulu fail2ban .
sudo service fail2ban stop
Lalu install iptables-persistent untuk menyimpan rule yang kita buat sehingga tersimpan meski server di reboot.
sudo apt install iptables-persistent
Berhubung tidak banyak service yang saya pakai di server, saya hanya mengijinkan port ssh, mail, http, dan https yang terbuka. Ini adalah rule iptables yang saya pakai.
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 25 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 465 -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -A INPUT -j DROP

Lalu cek menggunakan perintah
sudo iptables -S
Contoh putput :
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -j DROP
Kalo dirasa sudah oke kita save konfigurasi iptables nya.
sudo dpkg-reconfigure iptables-persistent
Sekarang hidupkan lagi fail2ban nya.
sudo service fail2ban start
Cek lagi iptables nya.
sudo iptables -S
Output :
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-fuck-lamers
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -j DROP
-A f2b-fuck-lamers -j RETURN
-A f2b-sshd -j RETURN
Untuk melihat service fail2ban yang berjalan bisa di cek menggunakan perintah
sudo fail2ban-client status
Disini saya akan mencoba melakukan bruteforce pada service login wordpress dan melihat apakan fain2ban bekerja.

hasil dari /var/log/auth.log

hasil dari /var/log/fail2ban.log

Sekarang kita cek kembali rule iptables nya.

Yup, fain2ban bekerja dengan baik untuk mengamankan server yang kita kelola.
Lalu bagaimana jika kita ingin meng-unbanned ip yang di block oleh fain2ban?
Masukkan perintah :
fail2ban-client set jailname unbanip ipaddress
Contoh :
fail2ban-client set wordpress-hard unbanip 5.254.65.119
Oke sekian tutorial sederhana dari saya, jika ada yang ingin ditanyakan silahkan komentar . :)