Kunci SSH, tutup port yang tidak terpakai, rajin nambal software — kerjakan semua itu, dan server-mu sudah dalam kondisi yang bagus. Tapi masih ada satu jenis serangan yang tidak benar-benar dihentikan oleh langkah-langkah tadi: tebak-menebak yang tanpa henti dan berulang. Bot yang mencoba satu password lalu menyerah itu tidak berbahaya. Bot yang mencoba sepuluh ribu password ke halaman login-mu sepanjang malam itu cerita lain — dan inilah yang berjalan terhadap setiap server publik, terus-menerus, entah ada yang mengawasi atau tidak.
Di sinilah fail2ban masuk. Ini alat kecil yang nyaris membosankan saking praktisnya, tapi justru salah satu hal paling bernilai yang bisa kamu jalankan di server Linux. Idenya bisa dijelaskan dalam satu kalimat: ia mengawasi log-mu, dan begitu melihat alamat yang sama gagal berkali-kali, ia mem-banned alamat itu secara otomatis. Ayo kita bedah apa makna sebenarnya, kenapa ini bekerja sebegitu baik, dan cara menyetelnya tanpa tidak sengaja mem-banned dirimu sendiri.
Seperti apa sebenarnya percobaan intrusi itu
Sebelum alatnya masuk akal, ada baiknya melihat dulu masalahnya dengan jelas. Kalau orang membayangkan sebuah server “diretas”, yang terbayang biasanya sesuatu yang dramatis dan canggih. Kenyataannya jauh lebih datar dan jauh lebih konstan: sebagian besar cuma software otomatis, yang dijalankan entah oleh siapa, memindai seluruh internet dan mencoba trik murah yang sama ke setiap mesin yang ia temukan.
Versi yang paling umum adalah percobaan login brute-force. Sebuah bot menyambung ke port SSH-mu (atau ke mail server, atau ke halaman login admin) lalu mencoba sepasang username dan password. Gagal. Mencoba lagi dengan password berbeda. Lagi. Dan lagi — menarik dari daftar raksasa berisi username umum dan password bocoran, dengan kecepatan mesin. Ia tidak sedang berusaha pintar; ia main angka di jutaan server sekaligus, bertaruh bahwa di suatu tempat nanti ada password lemah yang akhirnya kena.
Kalau kamu sempat melihat log autentikasi di server yang masih baru, skalanya benar-benar bikin kaget. Beberapa menit saja bisa terbaca seperti ini:
Failed password for invalid user admin from 203.0.113.45
Failed password for invalid user root from 203.0.113.45
Failed password for invalid user test from 198.51.100.7
Failed password for invalid user oracle from 203.0.113.45
Failed password for invalid user postgres from 198.51.100.7
Failed password for invalid user admin from 192.0.2.211
...ribuan lagi, setiap hari
Tidak satu pun dari ini akan berhasil kalau kamu sudah menyetel segalanya dengan benar — tapi mereka tidak pernah berhenti, dan inilah latar yang menemani semua hal lain. Gedoran latar belakang yang konstan inilah yang ingin ditangani fail2ban.
Ini normal, bukan tanda kamu jadi target khusus
Melihat ribuan login gagal bukan berarti ada yang sengaja mengincarmu. Setiap server yang bisa dijangkau kebagian perlakuan ini dalam hitungan menit sejak online, karena pemindaiannya sepenuhnya otomatis dan tidak pandang bulu. Ini ibarat cuaca di internet. Tujuannya bukan merasa diserang secara pribadi — tapi memastikan semua gedoran itu sekadar memantul, dan berhenti membuang sumber daya untuk melayani penyerang yang jelas-jelas tidak akan pernah diizinkan masuk.
Celah yang ditambal fail2ban
Wajar kalau kamu bertanya: kalau SSH sudah dikunci pakai key dan password sudah dimatikan, peduli apa berapa kali pun bot gagal? Dan itu pertanyaan yang adil — login yang sudah dikeraskan dengan benar tidak akan jebol oleh tebak-tebakan. Kalau kamu sudah menuntaskan keamanan SSH, bot penebak password memang sungguh-sungguh tidak bisa masuk.
Tapi “tidak bisa masuk” belum menceritakan semuanya. Percobaan yang tak ada habisnya itu tetap membebanimu. Mereka membanjiri log-mu dengan keributan, membuat masalah yang sungguhan jadi makin sulit dilihat di tengah tumpukan itu. Mereka menggerogoti sedikit CPU, memori, dan bandwidth — kecil per percobaan, tapi tanpa henti. Dan tidak setiap layanan di sebuah server sekokoh setup SSH yang hanya pakai key; form login sebuah aplikasi web, sebuah mail server, sebuah panel kontrol — semua ini sering kali masih menerima password, dan di situ penebak yang gigih jadi ancaman sungguhan.
Fail2ban menambal celah itu. Alih-alih sekadar menahan keributannya, ia balas mendorong: ia menyadari adanya penyalahgunaan, memutuskan itu jelas berniat jahat, lalu membanting pintu untuk alamat tersebut selama beberapa waktu. Penyerang yang tadinya mencoba sedetik sekali tiba-tiba tidak bisa menjangkaumu sama sekali. Ia mengubah pengurasan yang konstan jadi gangguan sesaat yang langsung dipotong otomatis.
Cara kerja fail2ban
Ini bagian yang bikin orang kaget: fail2ban tidak memeriksa lalu lintas jaringan, dan ia tidak duduk di dalam SSH atau web server-mu. Yang ia lakukan jauh lebih sederhana sekaligus jauh lebih cerdik. Ia membaca berkas log — log teks biasa yang memang sudah ditulis oleh layanan-layananmu — lalu bereaksi terhadap pola di dalamnya.
Semuanya berpijak pada rangkaian empat gagasan. Begitu kamu melihatnya secara berurutan, alat ini berhenti terasa seperti sihir:
1. AWASI sebuah berkas log
│ (mis. log auth SSH)
▼
2. COCOKKAN baris yang berarti "ini gagal"
│ (sebuah "filter" — pola seperti "Failed password from <IP>")
▼
3. HITUNG kegagalan per alamat dalam rentang waktu
│ (terlalu banyak, terlalu cepat = penyalahgunaan)
▼
4. BANNED alamatnya dengan menambah aturan firewall
(penyerang tak bisa menyambung sama sekali)
Ayo telusuri tiap langkah, karena masing-masing memetakan ke sebuah pengaturan yang benar-benar bakal kamu setel.
Ia mengawasi sebuah log. Layanan di Linux mencatat apa yang terjadi ke berkas log — login yang berhasil, yang gagal, error. Fail2ban “menempel” di ujung berkas-berkas ini, membaca baris baru begitu muncul. Ia sepenuhnya bersandar pada log yang memang sudah dihasilkan sistemmu, itulah kenapa ia bisa menyatu dengan hampir apa saja yang menulis log. (Kalau kamu ingin gambaran lebih besar soal di mana log tinggal dan kenapa ia penting, log dan manajemen log membahas fondasinya.)
Ia mencocokkan baris kegagalan dengan filter. Sebuah filter hanyalah pola (sebuah regular expression) yang mengenali “baris ini berarti sebuah percobaan gagal, dan inilah alamat asalnya.” Fail2ban sudah membawa filter siap pakai untuk layanan-layanan umum, jadi kamu jarang harus menulisnya sendiri. Tugas filter adalah menarik alamat IP pelaku dari tiap baris kegagalan.
Ia menghitung dalam sebuah rentang waktu. Satu login gagal itu tidak ada artinya — semua orang sesekali salah ketik password. Jadi fail2ban cuma peduli pada pengulangan: terlalu banyak kegagalan dari alamat yang sama dalam rentang singkat. Dua angka yang mengatur ini: maxretry (berapa kegagalan yang dianggap kebanyakan) dan findtime (rentang waktu kegagalan itu harus terjadi). Misalnya, “5 kegagalan dalam 10 menit” memicu alarmnya.
Ia mem-banned dengan menambah aturan firewall. Saat sebuah alamat melewati ambang batas, fail2ban tidak berdebat dengannya — ia menyisipkan aturan firewall yang membuang semua lalu lintas dari alamat tersebut selama jangka waktu tertentu, yaitu bantime. Inilah bagian yang memuaskan: ban-nya terjadi di level firewall, jadi penyerang bahkan tidak bisa lagi menjangkau layanannya, apalagi login. Inilah persisnya kenapa konfigurasi firewall yang berfungsi di bawahnya itu penting — fail2ban pada dasarnya adalah penulis aturan firewall otomatis yang bereaksi terhadap log-mu secara real-time.
Jail: unit yang benar-benar kamu setel
Fail2ban menata pekerjaannya dalam hal yang disebut jail. Sebuah jail adalah satu setup utuh yang mengikat semua hal di atas: log mana yang diawasi, filter mana yang dipakai, dan ambang batas apa yang diberlakukan sebelum mem-banned. Biasanya kamu punya satu jail per layanan yang ingin dilindungi — jail SSH, mungkin jail login web, jail mail.
Konfigurasinya tinggal di berkas teks biasa. Kebiasaan penting yang harus kamu pelajari sejak dini adalah di mana menaruh perubahanmu. Fail2ban membawa pengaturan bawaan di berkas yang biasanya bernama jail.conf, tapi kamu jangan pernah menyunting berkas itu langsung, karena update paket bisa menimpanya dan menghapus perubahanmu. Sebagai gantinya, kamu buat berkas bernama jail.local, dan pengaturan apa pun yang kamu taruh di situ akan menimpa bawaannya. Ide yang sama berlaku untuk filter: kustomisasi di .local, biarkan .conf bawaan apa adanya.
Jail minimal untuk melindungi SSH kira-kira seperti ini:
# /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
Baca dengan lantang, dan ia menjelaskan dirinya sendiri: aktifkan jail SSH; kalau sebuah alamat gagal 5 kali dalam 10 menit, banned dia selama 1 jam. Bagian [sshd] itu menamai jail-nya, dan fail2ban sudah tahu log dan filter mana yang dipakai jail itu, jadi empat baris itu sering kali sudah cukup untuk memulai.
Kamu juga bisa menyetel default yang masuk akal untuk berlaku ke semua jail sekaligus, lewat bagian [DEFAULT], lalu membiarkan tiap jail menimpanya di tempat yang berbeda:
# /etc/fail2ban/jail.local
[DEFAULT]
findtime = 10m
maxretry = 5
bantime = 1h
[sshd]
enabled = true
Mulai longgar, baru kemudian diperketat
Godaan untuk menyetel ambang batas yang galak memang besar — banned setelah 2 kegagalan, banned selama seminggu. Tahan dulu di awal. Cara nomor satu orang kena getah fail2ban adalah mem-banned dirinya sendiri gara-gara salah ketik password beberapa kali di koneksi yang jaringannya labil. Mulailah dengan angka yang pemaaf (5 percobaan, ban satu jam), amati perilakunya selama beberapa hari, dan baru perketat begitu kamu percaya. Ban singkat pun sudah sepenuhnya mematahkan penyerang otomatis — mereka pindah jauh sebelum satu jam itu habis — sambil tetap memberi manusia sungguhan ruang untuk pulih dari kesalahan yang jujur.
Jangan mem-banned diri sendiri: daftar pengecualian
Karena fail2ban mem-banned berdasarkan alamat IP, ada satu jaring pengaman yang sebaiknya kamu siapkan sebelum apa pun: sebuah daftar pengecualian berisi alamat yang tidak akan pernah bisa di-banned, apa pun yang terjadi. Inilah pengaturan ignoreip, dan alamat-alamat tepercayamu sendiri tempatnya di situ.
# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
Contoh itu tidak pernah mem-banned mesin lokalnya sendiri (127.0.0.1/8 dan ::1) atau alamat 203.0.113.10 — yang bisa jadi, misalnya, koneksi kantor atau rumahmu. Dengan alamatmu sendiri ada di daftar pengecualian, sekalipun kamu benar-benar salah ketik login lima kali berturut-turut, fail2ban tetap membiarkanmu.
Ada satu hal yang perlu diketahui: banyak orang tidak punya IP rumah yang tetap, jadi menanam satu alamat secara kaku bisa berhenti berfungsi begitu providermu memberimu alamat baru. Tidak masalah — ini kemudahan, bukan satu-satunya jalan kembalimu. Jaring pengaman yang lebih tangguh adalah menyimpan rute kedua ke server (misalnya konsol web milik penyedia cloud), supaya ban yang kamu timbulkan sendiri pun cuma gangguan kecil yang bisa kamu batalkan, bukan terkunci total. Ban fail2ban memang dirancang sementara, jadi skenario terburuk biasanya “tunggu satu jam”, bukan “kehilangan server”.
Selalu sediakan jalur masuk cadangan
Inilah aturan utama setiap alat keamanan otomatis yang bisa memblokir akses: jangan pernah biarkan ia jadi satu-satunya hal yang berdiri di antara kamu dan server-mu. Sebelum kamu memercayakan ban galak ke fail2ban, pastikan kamu punya jalan masuk independen — konsol penyedia, mode pemulihan, akun admin kedua dari jaringan lain. Alat ini ada untuk mem-banned penyerang, tapi ia tidak bisa membedakan antara penyerang dan kamu yang sedang apes. Rute cadangan itulah asuransimu.
Mengamati ia bekerja
Fail2ban berjalan sebagai layanan latar belakang — ia menyala saat boot dan terus mengawasi diam-diam, sama seperti program lain yang berjalan lama di sebuah server. (Kalau gagasan “layanan” yang berjalan terus-menerus di latar belakang masih asing, proses dan service menjelaskan konsepnya.) Karena ia berjalan tanpa ditunggui, sesekali kamu pasti ingin mengintip untuk memastikan ia menjalankan tugasnya.
Perintah pendampingnya, fail2ban-client, memungkinkanmu bertanya kepadanya. Mengecek status sebuah jail menunjukkan berapa alamat yang sedang ia tahan:
# Lihat apa yang sedang dilakukan jail SSH
fail2ban-client status sshd
Jawaban yang umum memberitahumu berapa kegagalan yang sudah ia lihat, berapa alamat yang sedang di-banned, dan mendaftarnya:
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 11402
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 7
|- Total banned: 489
`- Banned IP list: 203.0.113.45 198.51.100.7 ...
Angka Total banned: 489 itu adalah fail2ban yang diam-diam mengganjar dirinya — ratusan alamat jahat ditutup tanpa kamu mengangkat satu jari pun. Dan kalau suatu saat kamu perlu melepas alamat yang ter-banned karena salah, kamu bisa melakukannya secara manual:
# Lepas ban sebuah alamat secara manual
fail2ban-client set sshd unbanip 203.0.113.10
Perintah satu baris itu saja sudah jadi alasan bagus untuk tidak panik soal ban-diri-sendiri: membatalkannya cuma satu baris.
Posisi fail2ban dalam gambar besar
Ada baiknya kita jelas soal fail2ban itu apa dan bukan apa, karena gampang terlalu memercayai alat apa pun yang ada kata “ban”-nya. Fail2ban adalah pertahanan yang reaktif. Ia tidak mencegah percobaan pertama — memang tidak bisa, karena cara kerjanya adalah bereaksi terhadap kegagalan yang sudah terlanjur terjadi. Yang ia lakukan adalah menghentikan pengulangannya, memotong sumber yang menyalahgunakan begitu polanya jadi jelas.
Itu menjadikannya sebuah lapisan, bukan benteng. Ia bekerja paling baik saat ditumpuk di atas hal-hal yang mencegah pembobolan sejak awal: SSH yang hanya pakai key supaya tebak-tebakan toh tidak mungkin berhasil, firewall yang ketat supaya hanya sedikit port yang terekspos, dan disiplin yang tidak keren yaitu menjaga software tetap update supaya lubang yang sudah diketahui memang sudah tertutup. Tugas fail2ban dalam tumpukan itu adalah mengambil keributan brute-force — yang memang dilalui dengan selamat oleh lapisan-lapisan lain tapi tidak dibungkam — lalu mematikannya otomatis.
Anggap saja ia seperti bouncer yang menyadari orang yang sama mencoba membuka pintu terkunci untuk kesepuluh kalinya dan akhirnya menyuruhnya pergi. Kuncinya memang sudah menjalankan tugasnya; bouncer-nya cuma menghentikan gedoran sia-sia yang membuang sumber daya dan menjaga pintu masuk tetap lapang untuk orang lain. Itu peran yang sederhana, tapi di server publik ia membayar dirinya sendiri berkali-kali lipat, tiap hari, tanpa pernah perlu perhatianmu.
Penutup
Ini keseluruhan idenya dalam satu tempat:
- Percobaan intrusi itu konstan dan otomatis. Setiap server publik digedor bot yang menebak login, ribuan kali sehari — itu keributan latar belakang, bukan serangan pribadi.
- Fail2ban mengawasi log-mu dan mem-banned pelaku berulang. Ia membaca berkas log yang memang sudah ditulis layananmu, mengenali pola kegagalan, lalu bereaksi.
- Empat langkah: awasi sebuah log → cocokkan baris kegagalan dengan filter → hitung kegagalan dalam findtime terhadap maxretry → banned alamatnya dengan aturan firewall selama bantime.
- Kamu menyetelnya dalam jail. Satu jail per layanan, disiapkan di
jail.local(jangan pernah dijail.confbawaan), mengikat sebuah log, sebuah filter, dan ambang batasmu. - Mulai longgar dan lindungi dirimu. Ambang batas yang pemaaf plus daftar pengecualian
ignoreip— dan selalu sediakan jalur masuk cadangan yang independen ke server. - Ia lapisan reaktif, bukan keseluruhan pertahanan. Ia bersinar di atas SSH yang hanya pakai key, firewall yang ketat, dan update rutin, membungkam keributan brute-force yang dilalui dengan selamat oleh lapisan-lapisan itu tapi tidak bisa mereka hentikan.
Setelah percobaan intrusi ditangani otomatis, pertanyaan berikutnya yang wajar adalah soal siapa boleh melakukan apa begitu seseorang (atau suatu proses) memang sah berada di server — yang membawa kita ke prinsip memberi tiap akun dan layanan hanya akses yang benar-benar ia perlukan, tidak lebih.