Cara Mengamankan WordPress di VPS dari Serangan Brute Force 2026
Pasang situs WordPress baru di VPS, biarkan satu jam, lalu buka log akses Anda. Hampir pasti Anda menemukan puluhan sampai ratusan permintaan POST ke wp-login.php dan xmlrpc.php dari alamat IP yang tidak dikenal. Pada situs yang sudah berumur beberapa bulan, angkanya bisa mencapai ribuan percobaan login per hari. Bot tidak peduli apakah situs Anda blog pribadi atau toko online besar. Mereka menyisir seluruh internet dan mencoba kombinasi username dan password yang umum.
Kabar baiknya, memiliki root access di VPS memberi Anda kendali penuh untuk menutup celah ini di beberapa lapisan sekaligus, sesuatu yang sulit dilakukan di shared hosting. Panduan ini ditulis untuk Anda yang sudah punya WordPress di VPS Linux (Ubuntu atau Debian dengan Nginx atau Apache) dan ingin serangan brute force berhenti membebani server serta mengancam akun admin Anda.
Mengapa Brute Force Berbahaya, Bukan Sekadar Mengganggu
Ada dua risiko nyata. Pertama, pembobolan akun: satu password lemah pada akun administrator berarti penyerang bisa memasang plugin berbahaya, menyisipkan backdoor, atau mengarahkan pengunjung ke situs judi dan phishing. Kedua, beban sumber daya: setiap percobaan login memanggil PHP dan database. Ratusan permintaan per menit bisa menghabiskan CPU dan RAM di VPS kecil, sehingga situs Anda lambat atau down padahal tidak ada yang berhasil masuk.
Karena itu pertahanan terbaik bersifat berlapis: batasi di level firewall, level web server, dan level aplikasi WordPress.
Prasyarat
- VPS Linux dengan akses root atau user sudo (Ubuntu 22.04/24.04 atau Debian 12 dipakai pada contoh ini).
- WordPress sudah terpasang dan berjalan di Nginx atau Apache.
- Akses SSH ke server dan kebiasaan membuat cadangan sebelum mengubah konfigurasi.
- Alamat IP publik Anda saat ini, agar tidak terkunci sendiri saat menguji aturan firewall.
- Akses ke dashboard WordPress sebagai administrator.
Sebelum mulai, buat snapshot atau cadangan penuh. Kesalahan konfigurasi firewall adalah penyebab paling umum orang terkunci dari server sendiri, dan cadangan membuat Anda tenang saat bereksperimen.
Langkah-Langkah Mengamankan WordPress dari Brute Force
Perbarui sistem, WordPress, tema, dan plugin
Banyak serangan yang berawal dari brute force lalu berlanjut ke eksploitasi plugin usang. Jalankan:
sudo apt update && sudo apt upgrade -yLalu perbarui inti WordPress, tema, dan plugin dari dashboard. Hapus plugin dan tema yang tidak dipakai, bukan sekadar menonaktifkannya.
Hapus username default dan gunakan password kuat
Penyerang hampir selalu mencoba username
adminlebih dulu. Buat akun administrator baru dengan nama yang tidak mudah ditebak, pindahkan semua konten ke akun itu, lalu hapus akun lama. Pastikan juga nama tampilan publik berbeda dari username login, karena WordPress bisa membocorkan username lewat URL penulis (/?author=1).- Gunakan password minimal 16 karakter, sebaiknya dari pengelola password.
- Jangan memakai ulang password dari layanan lain.
Aktifkan autentikasi dua faktor (2FA)
2FA membuat password yang bocor tidak cukup untuk masuk. Pasang plugin 2FA berbasis aplikasi autentikator (TOTP) dan wajibkan untuk semua akun dengan peran editor ke atas. Simpan kode cadangan di tempat aman.
Pasang dan konfigurasi Fail2ban
Fail2ban membaca log dan memblokir IP yang berulang kali gagal login langsung di level firewall, sebelum permintaan menyentuh PHP.
sudo apt install fail2ban -yBuat filter khusus WordPress di
/etc/fail2ban/filter.d/wordpress-login.conf:[Definition] failregex = ^<HOST> .* "POST /wp-login\.php.*" 200 ^<HOST> .* "POST /xmlrpc\.php.*" 200 ignoreregex =Respons 200 pada POST ke
wp-login.phpberarti login gagal (login sukses biasanya 302), sehingga filter ini menargetkan kegagalan. Lalu buat jail di/etc/fail2ban/jail.local:[wordpress-login] enabled = true port = http,https filter = wordpress-login logpath = /var/log/nginx/access.log maxretry = 5 findtime = 10m bantime = 1h ignoreip = 127.0.0.1/8 IP_ANDAGanti
IP_ANDAdengan IP publik Anda, sesuaikanlogpathjika memakai Apache, lalu aktifkan:sudo systemctl restart fail2bansudo fail2ban-client status wordpress-loginBatasi laju permintaan dengan rate limiting Nginx
Fail2ban bereaksi setelah log tertulis; rate limiting menahan lonjakan secara real-time. Tambahkan di blok
http:limit_req_zone $binary_remote_addr zone=wplogin:10m rate=1r/s;Lalu di blok server:
location = /wp-login.php { limit_req zone=wplogin burst=3 nodelay; include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; }Satu permintaan per detik dengan burst kecil sudah cukup untuk manusia, tetapi memukul mundur bot. Uji konfigurasi dengan
sudo nginx -tsebelumsudo systemctl reload nginx.Nonaktifkan XML-RPC bila tidak dipakai
Fitur
xmlrpc.phpmemungkinkan banyak percobaan password dalam satu permintaan (metodesystem.multicall). Jika Anda tidak memakai aplikasi seluler WordPress atau Jetpack, blokir:location = /xmlrpc.php { deny all; return 403; }Lindungi halaman login dengan pembatas tambahan
Pilih salah satu atau gabungkan:
- Batasi berdasarkan IP: jika Anda punya IP tetap, izinkan hanya IP itu ke
/wp-login.phpdenganallowdandeny all. - HTTP Basic Auth: tambahkan lapisan password server di depan halaman login lewat
auth_basicdan file.htpasswd. - CAPTCHA: pasang pada formulir login untuk menyaring bot sederhana.
Basic Auth adalah favorit saya untuk tim kecil, karena bot bahkan tidak sampai ke PHP.
- Batasi berdasarkan IP: jika Anda punya IP tetap, izinkan hanya IP itu ke
Kunci akses SSH dengan kunci publik
Brute force tidak hanya menyasar WordPress, tetapi juga SSH di port 22. Buat key pair di komputer Anda (
ssh-keygen -t ed25519), salin denganssh-copy-id, lalu edit/etc/ssh/sshd_config:PasswordAuthentication no PermitRootLogin prohibit-password PubkeyAuthentication yesJalankan
sudo systemctl restart ssh, dan jangan tutup sesi lama sebelum memastikan Anda bisa login dari sesi baru.Aktifkan firewall dengan UFW
Buka hanya port yang diperlukan:
sudo ufw default deny incoming sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp sudo ufw enablePastikan aturan SSH ditambahkan sebelum
ufw enable. Jika ingin lebih rapat, batasi SSH hanya dari IP Anda dengansudo ufw allow from IP_ANDA to any port 22.Pantau log dan uji hasilnya
Periksa apakah pertahanan benar-benar bekerja:
sudo fail2ban-client status wordpress-loginuntuk melihat IP yang diblokir.sudo grep "POST /wp-login.php" /var/log/nginx/access.log | tailuntuk melihat pola serangan.- Coba gagal login enam kali dari jaringan lain (misalnya data seluler) dan pastikan IP tersebut diblokir.
Jadwalkan pengecekan mingguan singkat. Lonjakan permintaan yang tiba-tiba sering menjadi tanda awal serangan yang lebih serius.
Perbandingan Singkat Lapisan Pertahanan
| Lapisan | Bekerja di | Kelebihan | Keterbatasan |
|---|---|---|---|
| Fail2ban | Firewall (berdasarkan log) | Memblokir IP penyerang sepenuhnya | Bereaksi setelah percobaan terjadi |
| Rate limiting Nginx | Web server | Menahan lonjakan secara instan | Botnet terdistribusi bisa lolos |
| Basic Auth / batas IP | Web server | Bot tidak menyentuh PHP | Kurang praktis untuk banyak pengguna |
| 2FA | Aplikasi WordPress | Password bocor tidak cukup | Perlu disiplin pengguna |
Mengatasi Masalah Umum
Saya terkunci dari situs atau server sendiri
Masuk lewat konsol VNC atau konsol darurat dari panel VPS Anda, lalu hapus IP Anda dari daftar blokir dengan sudo fail2ban-client set wordpress-login unbanip IP_ANDA. Tambahkan IP tersebut ke ignoreip agar tidak terulang.
Fail2ban tidak memblokir apa pun
Penyebab paling umum adalah logpath salah atau format log tidak cocok dengan regex. Uji dengan sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress-login.conf. Jika hasil kecocokan nol, sesuaikan pola. Jika situs Anda berada di belakang proxy atau CDN, log hanya menampilkan IP proxy, sehingga Anda perlu mengonfigurasi real IP terlebih dahulu.
Aplikasi atau plugin berhenti bekerja setelah XML-RPC diblokir
Jetpack, aplikasi seluler WordPress, dan beberapa layanan integrasi memerlukan XML-RPC. Cabut blokir total dan ganti dengan rate limiting khusus pada lokasi tersebut.
Nginx gagal reload setelah menambah rate limit
Pastikan limit_req_zone berada di konteks http, bukan di dalam blok server. Jalankan sudo nginx -t untuk melihat baris yang bermasalah.
Server tetap lambat padahal serangan terblokir
Periksa penggunaan sumber daya dengan htop dan tinjau slow query database. Jika beban berasal dari ribuan IP berbeda, pertimbangkan lapisan perlindungan di depan server atau tingkatkan spesifikasi VPS agar punya ruang napas.
Penutup
Tidak ada satu pengaturan yang membuat WordPress kebal, tetapi kombinasi password kuat, 2FA, Fail2ban, rate limiting, firewall, dan SSH berbasis kunci sudah menutup sebagian besar serangan brute force yang beredar. Keuntungan terbesar VPS dengan root access adalah Anda bisa menerapkan semuanya sendiri tanpa menunggu izin penyedia hosting.
Jika Anda belum punya server untuk berlatih, VPS Indonesia menyediakan VPS KVM NVMe di Jakarta dengan root access penuh, pilihan Linux dan Windows, mulai dari 20 ribu rupiah per bulan. Cukup untuk membangun lingkungan WordPress yang aman sejak hari pertama.



