Skip to main content
BlogDevOps

Fail2ban di VPS: Otomatiskan Perlindungan Brute Force dalam 15 Menit

Siapkan fail2ban di VPS Ubuntu untuk secara otomatis memblokir serangan brute-force SSH, melindungi Nginx, dan mengonfigurasi jail kustom — dengan contoh konfigurasi nyata.

Matthews Wong

Software Engineer

Juni 20259 menit baca
DevOps

Fail2ban adalah alat keamanan dengan leverage tertinggi di VPS Linux — 15 menit untuk menginstal dan mengonfigurasi, dan ia diam-diam memblokir serangan brute-force sepanjang waktu tanpa intervensi manusia. VPS baru yang terpapar internet hampir seketika menarik bot yang memindai SSH, dan fail2ban mengubah upaya gagal berulang itu menjadi ban otomatis. Tanpa fail2ban, upaya-upaya tersebut akan terus berlanjut tanpa henti.

Cara Kerja Fail2ban

Fail2ban adalah daemon yang memantau file log secara real-time menggunakan filter regex yang dapat dikonfigurasi. Ketika alamat IP memicu ambang kegagalan dalam jendela waktu (misalnya 5 login SSH yang gagal dalam 10 menit), fail2ban menambahkan aturan iptables atau nftables yang menjatuhkan semua traffic dari IP tersebut selama durasi larangan yang dapat dikonfigurasi.

Instalasi dan Setup Awal

Di Ubuntu/Debian: apt install fail2ban. Fail2ban dikirimkan dengan konfigurasi default di /etc/fail2ban/jail.conf — jangan pernah edit file ini secara langsung, karena pembaruan paket menimpanya. Sebagai gantinya, buat /etc/fail2ban/jail.local dengan override Anda. Jail SSH diaktifkan secara default di sebagian besar sistem.

Memahami Jail dan Filter

Jail adalah kombinasi file log yang dipantau, filter (pola regex untuk mencocokkan kegagalan), dan tindakan (apa yang harus dilakukan saat ambang tercapai). Fail2ban dikirimkan dengan jail bawaan untuk SSH, Nginx, Apache, Postfix, Dovecot, dan lusinan layanan lainnya. Anda dapat menguji filter terhadap file log dengan fail2ban-regex.

┌─────────────────────────────────────────────────────┐
│              HOW FAIL2BAN WORKS                     │
└─────────────────────────────────────────────────────┘

  Bot attempts SSH login
          │
          ▼
  /var/log/auth.log ──► fail2ban monitors in real-time
          │
          ▼
  Filter regex matches   ──► Failure count for IP
  "Failed password for..."
          │
     maxretry (3) exceeded?
          │
     YES  │  NO
          ▼
  iptables DROP rule added for IP
          │
          ▼
  bantime expires (1h) ──► Rule auto-removed
          │
          ▼
  Persistent offenders get escalating bans:
  1h → 2h → 4h → 1 day → 1 week

Dari pengalaman saya menjalankan fail2ban di server produksi, tingkatkan bantime secara progresif untuk pelanggar berulang menggunakan pengaturan bantime.increment dan bantime.multiplier (tersedia di fail2ban 0.11+). Atur bantime.increment = true dan bantime.maxtime = 1w. Ini berarti pelanggaran pertama mendapat larangan 1 jam, pelanggaran kedua 2 jam, akhirnya meningkat menjadi larangan seminggu.

Konfigurasi Jail Nginx

Di luar SSH, lindungi server Nginx Anda dengan jail fail2ban untuk kegagalan autentikasi HTTP, brute-force WordPress, dan anomali tingkat permintaan. Jail nginx-http-auth melarang IP yang gagal autentikasi HTTP basic. Jail nginx-badbots melarang user agent berbahaya yang diketahui.

Jail Kustom untuk API NestJS

Untuk API NestJS dengan autentikasi kustom, buat jail fail2ban kustom yang memantau log aplikasi Anda untuk event login yang gagal. Definisikan filter yang mencocokkan format log Anda, atur untuk dipicu setelah 5 kegagalan dalam 5 menit, dan larang selama 1 jam. Ini melindungi endpoint login API Anda dari serangan credential stuffing.

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 3
ignoreip = 127.0.0.1/8 YOUR_HOME_IP YOUR_OFFICE_IP

# Progressive banning
bantime.increment = true
bantime.multiplier = 2
bantime.maxtime = 1w

[sshd]
enabled = true
port    = 2222
logpath = /var/log/auth.log
maxretry = 3

[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log

[nginx-req-limit]
enabled  = true
filter   = nginx-req-limit
logpath  = /var/log/nginx/error.log
maxretry = 10

# Check status and manage bans
fail2ban-client status sshd
fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client set sshd banip 5.6.7.8

Memantau dan Mengelola Larangan

Periksa status fail2ban: fail2ban-client status (mencantumkan semua jail aktif), fail2ban-client status sshd (menampilkan IP yang dilarang saat ini dan total larangan untuk jail SSH). Untuk membatalkan larangan IP secara manual: fail2ban-client set sshd unbanip 1.2.3.4. Periksa log fail2ban di /var/log/fail2ban.log untuk event larangan/pembatalan larangan.

Saya telah melarang IP rumah sendiri dari server produksi sebanyak dua kali — sekali saat menguji jail baru dengan pengaturan maxretry yang agresif, sekali saat sebuah skrip membuat panggilan API yang gagal berulang kali. Larangan fail2ban diterapkan segera dan diam-diam. Selalu tambahkan IP rumah, kantor, dan server CI/CD Anda ke pengaturan ignoreip di jail.local sebelum mengaktifkan jail yang agresif.

Lanjutan: Integrasi Cloudflare

Jika situs Anda berada di belakang Cloudflare, event larangan di level fail2ban tidak efektif karena semua traffic berasal dari IP Cloudflare. Sebagai gantinya, konfigurasikan fail2ban untuk menggunakan tindakan API Cloudflare — saat larangan dipicu, fail2ban memanggil API Cloudflare untuk memblokir IP klien nyata di edge, sebelum mencapai server Anda.

Fail2ban Saja Tidak Cukup

Fail2ban adalah satu lapisan dalam strategi defense-in-depth, bukan solusi keamanan yang lengkap. Penyerang dapat merotasi IP di ratusan penyedia cloud dan proxy residensial, mengalahkan larangan IP tunggal. Kombinasikan fail2ban dengan: hanya autentikasi kunci SSH, firewall cloud yang membatasi SSH ke IP yang diketahui, pembaruan keamanan reguler, dan rate limiting Nginx untuk endpoint API.

Sumber & Bacaan Lanjutan

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Bagaimana fail2ban secara otomatis memblokir serangan brute-force di VPS?

Fail2ban adalah daemon yang memantau file log secara real-time menggunakan filter regex yang dapat dikonfigurasi. Ketika sebuah alamat IP memicu ambang kegagalan dalam jendela waktu tertentu — misalnya 5 login SSH yang gagal dalam 10 menit — fail2ban menambahkan aturan iptables atau nftables yang menjatuhkan semua traffic dari IP tersebut selama durasi larangan yang ditentukan. Aturan dihapus otomatis saat larangan berakhir, dan IP yang dilarang disimpan ke database persisten sehingga perlindungan tetap aktif setelah reboot.

Mengapa harus menggunakan jail.local dan bukan mengedit jail.conf langsung?

Fail2ban menyertakan konfigurasi default di /etc/fail2ban/jail.conf, tetapi pembaruan paket akan menimpa file tersebut dan menghapus semua perubahan yang dibuat di sana. Pendekatan yang benar adalah membuat /etc/fail2ban/jail.local yang hanya berisi override Anda, karena file ini tidak pernah disentuh oleh pembaruan. Dengan cara ini pengaturan kustom — bantime, findtime, maxretry, dan opsi per-jail — tetap utuh setelah upgrade.

Apa itu pengaturan bantime.increment dan mengapa berguna?

bantime.increment (tersedia di fail2ban 0.11+) meningkatkan durasi larangan secara progresif untuk pelanggar berulang, bukan menerapkan hukuman tetap yang sama setiap kali. Dengan bantime.increment = true dan bantime.maxtime = 1w, pelanggaran pertama mendapat larangan 1 jam, pelanggaran kedua 2 jam, dan penyerang yang terus-menerus akhirnya mendapat larangan seminggu. Pendekatan ini menghalangi penyerang yang gigih tanpa memblokir permanen IP yang mungkin milik infrastruktur bersama.

Apa yang harus ditambahkan ke ignoreip, dan mengapa penting?

Pengaturan ignoreip di jail.local adalah daftar alamat IP yang tidak akan pernah dilarang oleh fail2ban, berapa pun banyaknya kegagalan yang dipicu. Anda harus menambahkan IP rumah, IP kantor, dan IP server CI/CD sebelum mengaktifkan jail yang agresif, karena larangan fail2ban diterapkan segera dan diam-diam. Penulis pernah mengunci diri dari server produksi dua kali — sekali saat menguji jail baru dengan pengaturan maxretry yang agresif, dan sekali saat sebuah skrip membuat panggilan API yang gagal berulang kali.

Mengapa fail2ban saja tidak cukup, dan apa yang harus dikombinasikan dengannya?

Penyerang dapat merotasi IP di ratusan penyedia cloud dan proxy residensial, sehingga larangan IP tunggal bisa dikalahkan. Fail2ban harus menjadi satu lapisan dalam strategi defense-in-depth, dikombinasikan dengan autentikasi kunci SSH saja (menghilangkan password yang bisa di-brute-force), firewall cloud yang membatasi akses SSH ke IP yang diketahui, pembaruan keamanan rutin melalui unattended-upgrades, dan rate limiting Nginx untuk endpoint API. Fail2ban menangkap apa yang lolos dari pertahanan lain dan memberikan respons otomatis yang tidak bisa diberikan pemantauan manual.