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.
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.
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.
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%.
┌─────────────────────────────────────────────────────┐
│ SSH ATTACK DEFENSE LAYERS │
└─────────────────────────────────────────────────────┘
Internet
│
▼
Cloud Firewall ──► BLOCK: allow SSH only from known IPs
│
▼
SSH Port 2222 ──► Obscures automated port-22 scans
│
▼
sshd_config ──► Keys only, no root, MaxAuthTries 3
│
▼
Fail2ban ──► Auto-ban IPs after 3 failed attempts
│
▼
Your Server ──► Only legitimate key holders get inDari pengalaman saya mengamankan instance VPS untuk proyek Commsult Indonesia di Jakarta, 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.
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.
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).
# Generate a modern Ed25519 key pair
ssh-keygen -t ed25519 -C "you@example.com"
# Copy public key to server
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# Harden /etc/ssh/sshd_config
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
X11Forwarding no
AllowTcpForwarding no
PermitEmptyPasswords no
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers matthews deploy
KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512
# Validate and reload
sshd -t && systemctl reload sshd
# Install fail2ban SSH jail
apt install fail2ban -y
# /etc/fail2ban/jail.local
# [sshd]
# enabled = true
# port = 2222
# maxretry = 3
# bantime = 3600Untuk 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.
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.
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 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.