Keamanan

Mengamankan SSH VPS dengan Kunci Ed25519 dan Fail2ban

29 October 2026 6 min baca
Mengamankan SSH VPS dengan Kunci Ed25519 dan Fail2ban

Port 22 adalah pintu yang paling sering diketuk di seluruh internet. Setiap VPS dengan IP publik yang baru menyala sudah mulai menerima percobaan login dalam hitungan menit. Kabar baiknya: perpaduan kunci SSH Ed25519 dan Fail2ban menutup hampir seluruh kelas serangan terhadap SSH, tanpa menambah ribet pemakaian sehari-hari.

Artikel ini adalah lanjutan praktis dari Setup VPS Ubuntu Pertama Kali. Bedanya, di sini kita fokus khusus pada satu layanan: sshd.

1. Kenapa Login Password Berbahaya di Internet Publik

Masalah password bukan panjangnya, melainkan kemungkinan dites. Penyerang punya dua keuntungan:

  • Jumlah percobaan tak terbatas. Bot bisa mengirim ratusan kombinasi per menit dari ribuan IP berbeda.
  • Daftar kredensial bocor. Kombinasi root dengan password hasil kebocoran lain di internet diuji otomatis ke seluruh rentang IP.

Log /var/log/auth.log pada VPS yang baru berumur beberapa jam saja sudah cukup membuktikan poin ini:

grep -c "Failed password" /var/log/auth.log
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head

Angka yang muncul biasanya sudah di atas ratusan sebelum Anda sempat memasang apa pun.

2. Ed25519: Kunci Modern yang Pendek tapi Kuat

Ed25519 adalah algoritma kunci berbasis kurva Edwards yang jadi rekomendasi default OpenSSH modern. Kelebihannya dibanding RSA lama:

  • Ukuran kunci kecil (64 byte publik) namun setara kekuatan RSA 3072-bit ke atas.
  • Penandatanganan cepat dan relatif tahan terhadap kesalahan implementasi sisi random.
  • Parameternya tidak bisa disetel salah — tidak ada pilihan panjang modulus yang membingungkan.

Generate kunci di komputer lokal Anda, bukan di server:

ssh-keygen -t ed25519 -a 100 -C "nama.andab@perusahaan"
# simpan di default ~/.ssh/id_ed25519, isi passphrase kuat

Flag -a 100 menaikkan jumlah turunan kunci (KDF rounds) sehingga file privat tetap sulit dibongkar meskipun ada yang menyalinnya. Setelah kunci dibuat, tambahkan proteksi tambahan pada ~/.ssh/config agar setiap koneksi memakai agent:

Host *
    AddKeysToAgent yes
    IdentitiesOnly yes

3. Copy Public Key dan Uji Akses

Gunakan ssh-copy-id alih-alih menempel manual, karena perintah ini sekaligus memperbaiki permission direktori ~/.ssh yang sering salah:

ssh-copy-id -i ~/.ssh/id_ed25519.pub adminops@IP_VPS
ssh -i ~/.ssh/id_ed25519 adminops@IP_VPS 'id && hostname'

Permission yang benar di server wajib dicek, karena SSH menolak kunci bila direktori terlalu terbuka:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~

Skenario yang perlu diantisipasi: satu kunci untuk banyak server. Alih-alih menaruh private key di setiap laptop, pakai SSH agent forwarding secukupnya, atau lebih aman lagi satu kunci per perangkat yang semuanya didaftarkan ke authorized_keys. Dengan begitu Anda bisa mencabut satu perangkat tanpa menyentuh yang lain.

4. Keras sshd_config Secara Bertahap

Setelah login dengan kunci terbukti mulus, edit /etc/ssh/sshd_config.d/99-hardening.conf (Ubuntu 22.04 ke atas sudah mendukung file drop-in):

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
PermitEmptyPasswords no
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
AllowUsers adminops deployer

Penjelasan bagian yang paling sering disalahpahami:

  • MaxAuthTries 3 — memotong sesi penyerang lebih awal, satu koneksi tidak sempat mencoba banyak akun.
  • LoginGraceTime 30 — koneksi yang tidak selesai autentikasi dalam 30 detik ditutup, membatasi koneksi menggantung.
  • AllowUsers — daftar putih akun; lebih aman daripada DenyUsers karena menutup akun tak terduga.
  • AllowTcpForwarding no — mencegah VPS dipakai sebagai proxy oleh pihak ketiga bila kredensial bocor.

Selalu uji konfigurasi sebelum restart, dan jangan tutup sesi pertama Anda:

sshd -t && systemctl restart ssh
ssh adminops@IP_VPS 'echo ok'

5. Mengganti Port SSH (Opsional, Bukan Solusi Utama)

Mengubah port dari 22 ke port acak tinggi menurunkan kebisingan log, tetapi tidak menambah keamanan nyata karena scanner tetap memindai seluruh rentang port. Bila tetap ingin:

# /etc/ssh/sshd_config.d/99-hardening.conf
Port 22022

Jangan lupa buka port barunya di firewall sebelum restart sshd, dan simpan alamat lengkapnya di catatan Anda:

ufw allow 22022/tcp comment 'SSH custom'

6. Fail2ban: Ban Otomatis untuk yang Tetap Memaksa

Fail2ban membaca log, menemukan pola kegagalan berulang, lalu menyuntikkan aturan firewall sementara untuk menahan IP tersebut.

apt -y install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Isi minimal /etc/fail2ban/jail.local untuk jail SSH:

[sshd]
enabled = true
port = 22022
backend = systemd
maxretry = 3
findtime = 10m
bantime = 2h
bantime.increment = true
bantime.maxtime = 1w

bantime.increment membuat durasi ban bertambah secara eksponensial untuk pelaku yang mengulang, sehingga bot yang keras kepala akhirnya tertahan berhari-hari. Verifikasi dengan:

fail2ban-client status sshd

Penting: Fail2ban bekerja paling baik dengan backend systemd pada Ubuntu 22.04 ke atas, karena log juga bisa terpotong oleh logrotate. Bila memakai backend auto dan jail tidak pernah ban, pindahkan ke backend systemd lalu restart fail2ban.

7. Kunci Tambahan: 2FA dan Sertifikat SSH

Untuk server yang berisi data penting, tambahkan lapisan di atas kunci:

  • TOTP sebagai faktor kedua lewat libpam-google-authenticator, dengan AuthenticationMethods publickey,keyboard-interactive sehingga kunci tetap wajib.
  • SSH certificates lewat ssh-keygen -s ca_key, membuat setiap kunci punya masa berlaku sehingga pencabutan akses tidak perlu mengedit authorized_keys satu per satu.
  • HashLog dengan ssh-keygen -H agar isi authorized_keys tidak membocinkan daftar host Anda bila file itu terbaca.

Untuk tim yang tumbuh, pendekatan bersertifikat biasanya mengalahkan pengelolaan manual karena Anda bisa menetapkan kebijakan seperti "kunci akses server hanya berlaku 24 jam".

8. Audit Berkala: Siapa Saja yang Masuk

Setelah semua terkunci, biasakan membaca jejak login minimal sebulan sekali:

last -n 20
lastb -n 20 | head
journalctl -u ssh --since "7 days ago" | grep -i "invalid user"
grep "Accepted publickey" /var/log/auth.log | tail

Tanda yang wajib ditindak:

  • Accepted publickey dari IP yang tidak Anda kenali — kemungkinan kunci terpasang di perangkat yang hilang.
  • Lonjakan invalid user — biasanya fase enumerasi username sebelum percobaan lebih serius.
  • Perubahan authorized_keys yang tidak Anda lakukan — periksa aturan audit, lihat Membaca Log Server dan Deteksi Intrusi.

9. Ringkasan Checklist Aman SSH

  • Kunci ed25519 dengan passphrase, disimpan di agent, bukan di server.
  • PasswordAuthentication no dan PermitRootLogin no.
  • AllowUsers sebagai daftar putih akun.
  • Fail2ban aktif dengan bantime.increment.
  • Port SSH alternatif dibuka di firewall sebelum restart sshd.
  • Log login diaudit rutin dan perubahan authorized_keys dipantau.

Kesimpulan

Kombinasi kunci Ed25519 plus Fail2ban mengubah SSH dari layanan paling rentan di VPS menjadi salah satu yang paling bisa diandalkan. Kerjakan bertahap: pasang kunci, uji, baru matikan password. Dengan urutan itu Anda tidak akan pernah terkunci di luar server sendiri.

Artikel terkait: Cara Login VPS Linux via SSH untuk Pemula | Firewall VPS: UFW, iptables, atau nftables?

Iklan