Melindungi akses server dengan Fail2ban

Namanya server yang online jelas bisa diakses dari seluruh dunia dan ini membuat celah keamanan dimana ada yang berusaha masuk lewat SSH dengan cara brute force password root atau akun lainnya yang ada. Berbahaya bukan? Walau kita sudah menggunakan password yang kuat tapi kalau tidak dicegah ya ada resiko jebol juga, dan proses brute force ini sendiri akan menggunakan resource VPSnya untuk validasi login. Jelas banyak ruginya. Karena itu jangan dibiarkan saja, dan cegah sebelum terlanjur menjadi musibah.

Nah… di Linux anda bisa memanfaatkan paket aplikasi fail2ban untuk otomatis melakukan blokir sementara kalau ada usaha login yang gagal berulang kali atau sekalian saja permanen. Fail2ban sendiri memanfaatkan IPTables untuk melakukan filter atau blokir akses, dan ini biasanya sudah terinstall secara default. Yang dilakukan sebenarnya menambahkan aturan baru sesuai kasus anda.

Ya seperti biasa langkah pertama jelas menginstallnya:
Debian/Ubuntu

apt-get install fail2ban

RHEL/CentOS/Fedora

yum install fail2ban

Setelah ini kita atur konfigurasi fail2ban, dan ini agak berbeda karena yang kita edit bukanlah file aslinya (jail.conf) melainkan khusus untuk server tersebut (jail.local). Tapi masih mirip dengan sumbernya, jadi mari dicopy dulu:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Kemudian didalamnya langsung cari bagian yang bernama Jail:

nano /etc/fail2ban/jail.local

Minimal pastikan SSH terproteksi, dan secara default memang aktif tapi siapa tahu saja:

Debian/Ubuntu

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6

RHEL/CentOS/Fedora

[ssh-iptables]
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
           sendmail-whois[name=SSH, dest=root, [email protected]]
logpath  = /var/log/secure
maxretry = 5

Untuk memahaminya dan supaya bisa membuat aturan baru saya jelaskan:

  • [] – Yang didalam kurung kotak itu nama atau label aturannya.
  • enabled – Nilainya bisa true untuk aktif atau false untuk mati.
  • port – Port dimana aturan tersebut aktif dan bisa mereferensikan nama proses/protokol yang sudah dikenal.
  • filter – Akan melakukan filter menggunakan aturan yang sudah ditetapkan, lokasinya ada di /etc/fail2ban/filter.d/ dan cukup menggunakan nama filenya tanpa perlu ekstensinya (misal: sshd.conf).
  • action – Aksi apa yang perlu dilakukan saat ada kondisi yang memicu filternya. Bisa dicek di /etc/fail2ban/action.d/.
  • logpath – Disimpan dimana catatan (log) aktivitas fail2ban, terutama kalau ada yang gagal.

  • maxretry – Diberi kesempatan berapa kali mencoba sebelum diblokir.

Setiap kali anda memodifikasi konfigurasi fail2ban maka perlu direstart prosesnya:

service fail2ban restart

Anda bisa melihat sendiri ada aturan fail2ban di IPTables, eksekusi saja perintah:

iptables -L

Akan muncul informasi seperti berikut:

Chain INPUT (policy DROP)
target     prot opt source               destination         
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh
fail2ban-SSH  tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:27868
DROP       tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             multiport dports http,https
ACCEPT     tcp  --  anywhere             anywhere             multiport dports ftp,12000:12100
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             multiport dports smtp,ssmtp,submission,2525
ACCEPT     tcp  --  anywhere             anywhere             multiport dports pop3,pop3s
ACCEPT     tcp  --  anywhere             anywhere             multiport dports imap2,imaps
ACCEPT     tcp  --  anywhere             anywhere             multiport dports mysql,postgresql
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8083
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  servernesia          anywhere            
ACCEPT     all  --  localhost.localdomain  anywhere

Saya potong karena panjang, tapi saya yakin anda paham maksudnya. 🙂

Sudah, itu saja untuk dasar – dasarnya. 🙂 Tinggal belajar saja menerapkan aturan baru untuk kasus – kasus spesifik.

19 Comments

  1. selesai masalah sebelumnya muncul masalah baru hehe 😀
    mas chandra, saya instal fail2ban di centos 7, berikut langkah2nya:

    yum install fail2ban -y
    systemctl enable fail2ban

    saat eksekusi perintah

    systemctl start fail2ban

    , muncul pesan error :

    Job for fail2ban.service failed because the control process exited with error code. See "systemctl status fail2ban.service" and "journalctl -xe" for details.

    saya coba cek sesuai petunjuk error di atas:

    systemctl status fail2ban.service

    muncul pesan berikut:

    ● fail2ban.service - Fail2Ban Service
       Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
       Active: failed (Result: start-limit) since Fri 2017-02-17 18:52:01 WIB; 4min 21s ago
         Docs: man:fail2ban(1)
      Process: 31863 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=255)
    
    Feb 17 18:52:01 develop-centos7 systemd[1]: fail2ban.service: control process exited, code=exited status=255
    Feb 17 18:52:01 develop-centos7 systemd[1]: Failed to start Fail2Ban Service.
    Feb 17 18:52:01 develop-centos7 systemd[1]: Unit fail2ban.service entered failed state.
    Feb 17 18:52:01 develop-centos7 systemd[1]: fail2ban.service failed.
    Feb 17 18:52:01 develop-centos7 systemd[1]: fail2ban.service holdoff time over, scheduling restart.
    Feb 17 18:52:01 develop-centos7 systemd[1]: start request repeated too quickly for fail2ban.service
    Feb 17 18:52:01 develop-centos7 systemd[1]: Failed to start Fail2Ban Service.
    Feb 17 18:52:01 develop-centos7 systemd[1]: Unit fail2ban.service entered failed state.
    Feb 17 18:52:01 develop-centos7 systemd[1]: fail2ban.service failed.

    tambah mumet 😀

  2. saya coba reboot vps dan cek :

    fail2ban-client status ssh-iptables

    statusnya aktif :

    systemctl status fail2ban
    ● fail2ban.service - Fail2Ban Service
       Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2017-02-17 21:41:09 WIB; 7h ago
         Docs: man:fail2ban(1)
      Process: 772 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS)
     Main PID: 1158 (fail2ban-server)
       CGroup: /system.slice/fail2ban.service
               └─1158 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b
    
    Feb 17 21:41:06 develop-centos7 systemd[1]: Starting Fail2Ban Service...
    Feb 17 21:41:08 develop-centos7 fail2ban-client[772]: 2017-02-17 21:41:08,643 fail2ban.server         [1042]: INFO    Starting Fail2ban v0.9.6
    Feb 17 21:41:08 develop-centos7 fail2ban-client[772]: 2017-02-17 21:41:08,646 fail2ban.server         [1042]: INFO    Starting in daemon mode
    Feb 17 21:41:09 develop-centos7 systemd[1]: Started Fail2Ban Service.

    aneh 😀

  3. mas chandra, di bagian iptables[name=SSH, port=ssh, protocol=tcp] khususnya di port=ssh, itu diganti sesuai port ssh kan ya (port=12345) atau dibiarkan seperti itu?
    trims.

    1. Betul mbak.

      Saya ada pikiran apa mungkin ada masalah fail2ban dengan firewalld ya, kan mbak pakai CentOS 7 sekarang. Sedangkan asumsi tutorial diatas masih pakai iptables.

  4. Pagi mas,
    Saya sudah menggunakan iptables hanya buka port tententu saja selain itu diblock, kalau saya install fail2ban apakah ada konflik nanti. Bisa tidak iptables dan fail2ban di kombinasi jadi berjalan bersamaan dengan tujuan berbeda, maksud saya fail2ban pencegahan tapi kalau orang akses berlebih langsung iptables untuk blok? Minta link kalau boleh soalnya link yang saya dapat baru config fail2ban atau iptables, belum nemu yang kominasi keduanya. Makasih sebelumnya mas

    1. Tidak konflik mas. Fail2ban itu melengkapi iptables. Jadi kalau iptables bisa dikatakan pasif, aturan yang kita tuliskan yang dijalankan. Nah dengan fail2ban ada perilaku akses tertentu yang dianggap berbahaya (seperti contoh diatas brute force SSH) akan ditanggapi dengan blokir, jadi dinamis sifatnya.

      Nah fail2ban menerapkan blokirnya dengan mengedit aturan iptables, ini terjadi secara otomatis.

      1. Makasih mas chandra atas jawabannya, saya coba dulu nanti kalau error saya balik lagi.

  5. Om Chandra,

    Saya pakai VPS Linode 2core 4GB, memory usage stabil di 3.50/3.80, swap 60M/512M, stabil mas walau ngga ada yang online, kalau ada yang online memory naik ke 3.7.
    CPU sih 0%-0.7% kalau ngga ada yang online, cuma memory dan swap koq stabil di 3.5 ya? ngga bergerak gitu om.

    Oiya kemarin malam tiba2 load average besar banget sampai database error, di reboot normal lagi.

    Kalo di check di htop, fail2ban itu jalan terus setiap detik. Apakah itu wajar?

    Situs wordpress, UV 5000/month, pakai bulletproof security dan loginizer pro, keyCDN dan cloudflare.

    Apakah saya harus upgrade ke 8GB? mengingat mahal harganya agak berat nih. hahaha.

    Btw, apakah admin orang yang sama dengan?

    1. Pakai stack apa mas? Dibuat hosting web jenis apa kok trafik cuma 5000 UV per bulan bisa KO? Atau maksudnya 5000 UV per satu menit seperti di Google Analytics?

      Kalau bisa, solusi keamanan WordPressnya, misal ada yang bukan PHP sebaiknya dipakai. Seperti menggabungkan fail2ban dengan login WordPress: https://servernesia.com/2619/melindungi-wordpress-fail2ban/

      Soalnya proses PHP itu mahal dari segi resource yang terpakai, lebih baik langsung iptables dan fail2ban yang proses. Daripada PHP lagi yang blokir.

      Sekalian pada halaman login diberi keamanan ganda pakai password: https://servernesia.com/3232/lindungi-situs-password-nginx/

      fail2ban bekerja setiap detik itu wajar memang tugasnya, tapi kalau seringnya ini berarti perlu pengamanan lebih, ada yang berusaha bruteforce tampaknya.

      Itu habis di CPU daripada RAM mestinya kalau sampai error.

      Saran saya kalau sudah niat upgrade mending langsung ke dedicated, bisa sama mahalnya.

      🙂

  6. om chanda saya punya masalah dengan kombinasi antara fail2ban, csf dan firewalld, tiba2 setelah restart firewalld di centos 7 saya tidak bisa aktif kira2 apa masalahnya ya?

    1. CSF punya fitur yang diberikan Fail2Ban mas. Dan firewalld perlu diuninstall juga. Jadi memang ketiga aplikasi itu tidak bisa digabung.

      Kalau perlu salah satu, saya sarankan cukup CSF saja. Atau firewalld+fail2ban.

  7. lebih bagus mana mas untuk hardeningnya antara firewalld+fail2ban dengan csf saja? sy juga pake maldet+rkhunter (mgkn perlu dibahas jg ini mas utk keoptimalan, kegunaan & live realtimenya hehe.
    owh iya mas, ini lagi. kalau mas lagi butuh topik(mudah2an di acc), bahas load balancing mas, ada yang make haproxy, nginx, modproxy dll.

    1. Lebih bagus pakai mana saja daripada tidak sama sekali mas.

      Paling gampang ya pakai apapun firewall yang diinstall default dan ditambahkan fail2ban.

      Kalau mau agak ketat, baru pertimbangkan CSF. Tapi lebih repot sedikit pemasangannya.

  8. mas chandra mau tanya dong.. fail2ban bisa cegah request berlebih engga ya terhadap server ?? atau bisa blok serangan dos diport 80 engga yaa ??.. untuk cegah dos di port 22 sudah terbukti si fail2ban bisa blokk

    mohon pencerahannya

  9. tanya donk, setelah sy setting fail2ban, keesokan harinya ada yg mencoba masuk ke server, sy cek pake
    cat /var/log/auth.log
    eh ketemu
    sshd[569996]: Unable to negotiate with xxx.xx.xxx.68 port 45428: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1 [preauth]
    ada banyak yg lolos ya, tidak kena ban, padahal jail.local sshd hanya maxretry =3

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *