# Hardening Keamanan SSH untuk VPS: Hentikan Brute Force Sebelum Dimulai

> Panduan hardening SSH praktis untuk pemilik VPS — nonaktifkan autentikasi kata sandi, ubah port, konfigurasikan fail2ban, dan kunci sshd_config sebelum server Anda dikompromikan.

URL: https://www.matthewswong.com/id/blog/ssh-security-hardening/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2025-06-10
- Updated: 2026-10-17
- Category: DevOps

DigitalOcean Droplet baru dengan pengaturan SSH default akan melihat upaya brute-force pertamanya dalam hitungan menit setelah online. Data dunia nyata menunjukkan 145 upaya login SSH yang gagal dan 45 auto-ban dalam minggu pertama untuk server yang menghadap internet tipikal yang ditargetkan oleh bot yang memindai port 22.

## Langkah 1: Hanya Autentikasi Kunci SSH

Pasangan kunci SSH secara kriptografis kebal terhadap brute-force. Kunci RSA 4096-bit atau kunci Ed25519 memiliki lebih banyak kombinasi yang mungkin daripada atom di alam semesta yang dapat diamati — tidak ada botnet yang dapat memecahkannya dengan mencoba kombinasi. Autentikasi kata sandi adalah permukaan serangan; menghilangkannya menghilangkan risikonya.

### Pengaturan sshd_config Kritis

Edit /etc/ssh/sshd_config dan atur: PasswordAuthentication no, PermitRootLogin no, PubkeyAuthentication yes, MaxAuthTries 3, X11Forwarding no, AllowTcpForwarding no, PermitEmptyPasswords no, LoginGraceTime 30, ClientAliveInterval 300, ClientAliveCountMax 2. Pengaturan ClientAlive memutus sesi idle setelah 10 menit, mencegah ghost session terakumulasi.

### Ubah Port SSH Default

Memindahkan SSH dari port 22 ke port non-standar (misalnya 2222, 22222) menghilangkan sebagian besar kebisingan pemindaian otomatis. Bot memindai port 22 secara default; sangat sedikit yang memindai port non-standar secara komprehensif. Ini adalah keamanan melalui ketidakjelasan dan bukan pertahanan utama, namun mengurangi kebisingan log lebih dari 90%.

> Saat mengamankan instance VPS, selalu pertahankan satu sesi terminal aktif saat menguji perubahan SSH. Urutan yang saya gunakan: 1) Buat perubahan sshd_config, 2) Jalankan sshd -t untuk memvalidasi, 3) Buka sesi SSH kedua untuk memverifikasi konfigurasi baru berfungsi, 4) Baru kemudian tutup sesi asli. Ini mencegah terkunci.

## Langkah 2: Fail2ban untuk Pemblokiran IP Otomatis

Bahkan dengan autentikasi kata sandi dinonaktifkan, pemindai SSH menghasilkan kebisingan. Fail2ban memantau /var/log/auth.log, mendeteksi upaya login yang gagal berulang, dan menambahkan aturan iptables untuk melarang IP yang menyinggung secara otomatis. Dengan pengaturan default (5 kegagalan dalam 10 menit = larangan 10 menit), fail2ban menangani beban pemindaian otomatis tanpa intervensi manual.

### Cloud Firewall sebagai Pertahanan Terluar

Lapisi pertahanan Anda: firewall penyedia cloud adalah pertahanan terluar Anda dan memblokir traffic sebelum mencapai VPS Anda. Gunakan Cloud Firewall DigitalOcean atau aturan firewall GCP VPC untuk membatasi akses SSH ke alamat IP yang diketahui saja (IP rumah, kantor, atau VPN Anda).

> **Jebakan AllowUsers**

> Saya belajar hal ini dengan cara yang sulit: ketika Anda menambahkan AllowUsers username ke sshd_config dan reload, SEMUA PENGGUNA LAIN segera ditolak akses SSH — termasuk root dan pengguna lain yang tidak Anda daftarkan secara eksplisit. Saya menambahkan AllowUsers matthews ke VPS bersama tanpa mencantumkan pengguna deploy, dan pipeline CI/CD kami langsung berhenti bekerja.

## Langkah 3: Autentikasi Dua Faktor

Untuk keamanan maksimal, tambahkan autentikasi dua faktor berbasis TOTP melalui modul Google Authenticator PAM (libpam-google-authenticator). Ini memerlukan kunci SSH Anda dan OTP berbasis waktu bahkan jika seseorang mencuri kunci privat Anda. Trade-off adalah overhead operasional: setiap sesi SSH memerlukan memasukkan OTP.

## Mengaudit Keamanan SSH Anda

Setelah hardening, audit setup Anda: jalankan ssh-audit (tersedia di ssh-audit.com) terhadap server Anda untuk memeriksa algoritme dan cipher yang lemah. Tinjau /etc/ssh/sshd_config untuk pengaturan lemah yang tersisa. Periksa bahwa fail2ban berjalan dan memiliki larangan aktif (fail2ban-client status sshd).

## sshd_config Minimal yang Diperkuat untuk Produksi

sshd_config minimal yang siap produksi untuk Ubuntu 22.04: nonaktifkan kata sandi dan login root, aktifkan autentikasi berbasis kunci, atur MaxAuthTries 3, batasi ke pengguna tertentu dengan AllowUsers, gunakan algoritme pertukaran kunci modern saja (KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512), dan aktifkan logging di level VERBOSE.

## Sumber & Bacaan Lanjutan

- DigitalOcean — Hardening SSH Fail2Ban Nftables dan Cloud Firewall
- VPS.DO — Checklist Hardening Keamanan VPS 10 Langkah 2025
- MassiveGRID — Panduan Hardening Keamanan VPS Ubuntu 24.04 SSH Firewall Fail2Ban

## Source links

- https://www.digitalocean.com/community/tutorials/hardening-ssh-fail2ban
- https://vps.do/vps-security-hardening-checklist-10-steps-to-protect-your-server-in-2025/
- https://massivegrid.com/blog/ubuntu-vps-security-hardening-guide/

## FAQ

### Mengapa menonaktifkan autentikasi kata sandi adalah langkah hardening SSH yang paling penting?

Autentikasi kata sandi adalah permukaan serangan yang dieksploitasi oleh bot brute-force otomatis — VPS yang menghadap internet dapat menerima 145 upaya login SSH yang gagal hanya dalam minggu pertamanya. Pasangan kunci SSH seperti Ed25519 secara kriptografis kebal terhadap brute-force karena memiliki lebih banyak kombinasi yang mungkin daripada atom di alam semesta yang dapat diamati. Menghilangkan autentikasi kata sandi berarti menghilangkan seluruh kelas serangan ini.

### Apa yang sebenarnya dilindungi oleh perubahan port SSH default, dan apa batasannya?

Memindahkan SSH dari port 22 ke port non-standar (misalnya 2222 atau 22222) menghilangkan sebagian besar kebisingan pemindaian otomatis karena bot memindai port 22 secara default dan sangat sedikit yang memindai port non-standar secara menyeluruh. Ini mengurangi kebisingan log lebih dari 90% sehingga log fail2ban lebih mudah dibaca. Namun, ini adalah keamanan melalui ketidakjelasan dan bukan pertahanan utama — harus dikombinasikan dengan autentikasi berbasis kunci dan cloud firewall.

### Apa jebakan AllowUsers di sshd_config dan mengapa bisa merusak pipeline CI/CD?

Ketika Anda menambahkan AllowUsers ke sshd_config dan reload, semua pengguna yang tidak terdaftar secara eksplisit langsung ditolak akses SSH — termasuk akun servis yang digunakan oleh otomasi. Dalam pengalaman di post ini, menambahkan AllowUsers matthews ke VPS bersama tanpa mencantumkan pengguna deploy menyebabkan pipeline CI/CD langsung berhenti bekerja. Selalu daftarkan semua pengguna SSH yang membutuhkan akses dan uji dengan sesi non-privileged sebelum menerapkan perubahan.

### Bagaimana fail2ban melengkapi autentikasi kunci SSH jika kunci sudah memblokir brute-force?

Meskipun autentikasi kata sandi dinonaktifkan, pemindai SSH tetap menghasilkan kebisingan koneksi yang mengotori log dan menghabiskan sumber daya. Fail2ban memantau /var/log/auth.log, mendeteksi upaya login gagal yang berulang, dan secara otomatis memblokir IP yang menyinggung melalui aturan iptables. Mengonfigurasi waktu ban yang lebih lama (bantime = 1h atau 24h) dan maxretry yang lebih rendah (3) memberikan perlindungan yang lebih agresif terhadap pemindai yang persisten.

### Apa urutan aman yang direkomendasikan untuk menguji perubahan konfigurasi SSH agar tidak terkunci?

Buat perubahan sshd_config, jalankan sshd -t untuk memvalidasi sintaks, buka sesi SSH kedua untuk memverifikasi konfigurasi baru berfungsi, dan baru kemudian tutup sesi asli. Urutan ini memastikan kesalahan sintaks atau miskonfigurasi tidak memutus satu-satunya koneksi aktif Anda. Post ini mencatat bahwa melewati proses ini sekali pada instance GCP membutuhkan pemulihan via serial console selama 20 menit.

---

- HTML version: https://www.matthewswong.com/id/blog/ssh-security-hardening/
- English: https://www.matthewswong.com/en/blog/ssh-security-hardening/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
