Home / DevOps, Cloud, and Developer Tools / Cara Hardening SSH …

Cara Hardening SSH di VPS Ubuntu: Nonaktifkan Root & Password, Pasang UFW + Fail2ban

Serangan brute force SSH pada VPS Ubuntu merupakan ancaman konstan yang tercatat setiap detik di dalam log server publik. Tanpa perlindungan dasar, bot otomatis di internet akan terus-menerus mencoba kombinasi nama pengguna dan kata sandi umum sampai berhasil menjebol akses root. Artikel ini memandu langkah demi langkah hardening server Ubuntu dengan menonaktifkan autentikasi password dan login root, serta memasang firewall UFW dan proteksi otomatis Fail2ban.

Ringkasan

  • Pembuatan akun sudo non-root dan autentikasi SSH key adalah syarat mutlak sebelum hardening.
  • Menonaktifkan PermitRootLogin dan PasswordAuthentication menutup celah brute force.
  • UFW wajib mengizinkan port SSH sebelum perintah ufw enable diaktifkan.
  • Fail2ban memblokir alamat IP penyerang secara otomatis berdasarkan batas percobaan gagal.
  • Selalu uji koneksi di jendela terminal terpisah sebelum menutup sesi SSH aktif.

Prasyarat dan Lingkungan Pengujian

Tabel berikut menampilkan versi perangkat lunak dan lingkungan sistem yang digunakan dan tervalidasi dalam panduan ini:

Perangkat Lunak / KomponenVersi / Nilai PengujianKeterangan
Sistem OperasiUbuntu 24.04 LTS (Noble Numbat)Berlaku juga untuk Ubuntu 22.04 LTS
OpenSSH Server9.6p1Layanan SSH bawaan Ubuntu
UFW (Uncomplicated Firewall)0.36.2Manajer firewall iptables/nftables
Fail2ban1.0.2Layanan deteksi dan pemblokiran otomatis
Tipe Kunci SSHEd25519 (id_ed25519)Algoritma kunci publik modern dan aman

Langkah 1: Buat Pengguna Sudo dan Konfigurasi SSH Key

Langkah ini bertujuan membuat akun pengguna baru berpangkat sudo dan memasang kunci publik SSH agar Anda tidak lagi bergantung pada akun root maupun kata sandi.

  • Buat pasangan kunci SSH di komputer lokal. Buka terminal di komputer lokal Anda dan jalankan perintah pembuatan kunci berpola Ed25519:
bash
ssh-keygen -t ed25519 -C "admin@contoh-vps"
  • Buat pengguna sudo baru di VPS Ubuntu. Masuk ke VPS sebagai root, lalu tambahkan pengguna baru dan masukkan pengguna tersebut ke dalam grup sudo:
bash
adduser user
usermod -aG sudo user
  • Salin kunci publik ke akun pengguna baru. Di komputer lokal, gunakan perintah ssh-copy-id untuk mengirimkan kunci publik ke VPS:
bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

Metode Manual. Jika ssh-copy-id tidak tersedia, buat direktori /home/user/.ssh di VPS dengan izin 700, lalu buat berkas /home/user/.ssh/authorized_keys berizin 600 yang berisi isi berkas id_ed25519.pub. Pastikan kepemilikan direktori dan berkas tersebut diatur ke user:user dengan perintah chown -R user:user /home/user/.ssh.

  • Uji autentikasi kunci dari komputer lokal. Pastikan Anda dapat login tanpa dimintai kata sandi pengguna:
bash
ssh -i ~/.ssh/id_ed25519 [email protected]

Verifikasi Hak Sudo. Setelah berhasil masuk menggunakan akun user, uji perintah sudo whoami. Jika keluarannya adalah root, berarti hak akses administratif akun tersebut sudah berfungsi dengan benar.

Langkah 2: Nonaktifkan Root Login dan Autentikasi Password SSH

Langkah ini mengonfigurasi daemon OpenSSH agar menolak login langsung sebagai root dan menolak semua bentuk autentikasi berbasis kata sandi.

  • Buat berkas konfigurasi tambahan SSH. Di Ubuntu modern, seperti dijelaskan pada manpage sshd_config Ubuntu, direktori /etc/ssh/sshd_config.d/ digunakan untuk menyimpan penyesuaian kustom tanpa mengubah berkas utama. Buat berkas /etc/ssh/sshd_config.d/hardening.conf:
bash
sudo nano /etc/ssh/sshd_config.d/hardening.conf
  • Isi baris direktif keamanan berikut ke dalam berkas:
ini
# /etc/ssh/sshd_config.d/hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes

Makna dan fungsi dari setiap direktif di atas dirangkum dalam tabel berikut:

Direktif KonfigurasiNilaiFungsi Keamanan
PermitRootLoginnoMelarang akun root untuk login langsung melalui SSH
PasswordAuthenticationnoMenonaktifkan autentikasi menggunakan password teks biasa
KbdInteractiveAuthenticationnoMenonaktifkan tantangan interaktif keyboard/PAM password
PubkeyAuthenticationyesMewajibkan dan mengizinkan autentikasi berbasis kunci publik
  • Uji sintaks berkas konfigurasi SSH. Sebelum me-reload layanan, jalankan pengujian sintaks untuk memastikan tidak ada kesalahan penulisan:
bash
sudo sshd -t
  • Terapkan perubahan konfigurasi SSH. Jika sshd -t tidak menampilkan pesan kesalahan, jalankan perintah reload pada layanan SSH:
bash
sudo systemctl reload ssh

Jangan Tutup Sesi Terminal Ini! Biarkan sesi terminal VPS saat ini tetap terbuka. Jika ada kesalahan konfigurasi kunci SSH, sesi yang aktif ini akan menjadi penyelamat Anda untuk memperbaiki kesalahan sebelum terputus total.

Langkah 3: Konfigurasi dan Aktifkan Firewall UFW

Langkah ini membatasi lalu lintas jaringan masuk hanya pada port yang diizinkan dan menutup port lain yang tidak digunakan.

  • Periksa status awal UFW. Jalankan perintah berikut untuk melihat status firewall:
bash
sudo ufw status verbose
  • Atur kebijakan bawaan firewall. Tetapkan kebijakan menolak semua paket masuk (incoming) dan mengizinkan semua paket keluar (outgoing), sebagaimana direkomendasikan di dokumentasi UFW Ubuntu:
bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
  • Izinkan lalu lintas port SSH. Buka port 22/TCP agar koneksi SSH tidak terputus saat firewall diaktifkan:
bash
sudo ufw allow 22/tcp comment 'Akses SSH'

Bahaya Terkunci Out! Menjalankan ufw enable tanpa mengeksekusi ufw allow 22/tcp atau ufw allow ssh terlebih dahulu akan langsung memutuskan koneksi SSH Anda dan memblokir seluruh akses jaringan masuk ke VPS.

  • Aktifkan firewall UFW. Jalankan perintah aktifkan UFW:
bash
sudo ufw enable
  • Verifikasi aturan yang aktif. Pastikan port 22 tercantum dengan status ALLOW:
bash
sudo ufw status numbered

Langkah 4: Pasang dan Konfigurasi Fail2ban

Langkah ini menginstal Fail2ban untuk memantau log autentikasi SSH dan secara otomatis memblokir alamat IP yang melakukan percobaan login gagal secara berulang.

  • Pasang paket Fail2ban. Jalankan manajer paket apt untuk menginstal Fail2ban:
bash
sudo apt update && sudo apt install -y fail2ban
  • Buat berkas konfigurasi lokal jail.local. Mengikuti aturan pada manpage fail2ban jail.conf, berkas jail.conf bawaan vendor tidak boleh diubah langsung. Buat salinan kustom pada jail.local:
bash
sudo nano /etc/fail2ban/jail.local
  • Isi konfigurasi proteksi SSH pada jail.local:
ini
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 3
backend  = systemd

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = systemd

Parameter utama konfigurasi Fail2ban dijelaskan pada tabel berikut:

ParameterNilai ContohPenjelasan Fungsi
enabledtrueMengaktifkan penjara (jail) untuk proteksi daemon SSH
portsshPort atau layanan yang dipantau (default: 22)
maxretry3Batas maksimum percobaan login gagal sebelum diblokir
findtime10mJendela waktu pencarian kegagalan (10 menit)
bantime1hDurasi pemblokiran alamat IP penyerang (1 jam)
backendsystemdMetode pembacaan log melalui systemd-journald pada Ubuntu modern
  • Mulai dan aktifkan layanan Fail2ban. Jalankan perintah systemd untuk menghidupkan Fail2ban saat sistem dinyalakan:
bash
sudo systemctl enable --now fail2ban
  • Periksa status penjara SSH di Fail2ban. Verifikasi bahwa penjara sshd sudah aktif dan memantau koneksi:
bash
sudo fail2ban-client status sshd

Langkah 5: Uji Koneksi dan Verifikasi Pengamanan (Prosedur Anti-Terkunci)

Langkah terakhir ini memastikan seluruh lapisan keamanan berfungsi tanpa risiko mengunci diri sendiri dari VPS.

  • Buka jendela terminal baru di komputer lokal. Jangan menutup terminal lama tempat Anda mengonfigurasi VPS.
  • Uji login menggunakan akun sudo baru dan SSH key:
bash
ssh -i ~/.ssh/id_ed25519 [email protected]
  • Uji penolakan login root. Di jendela baru, coba login sebagai root:
bash

Hasil yang diharapkan adalah pesan Permission denied (publickey).

  • Uji penolakan autentikasi kata sandi. Uji coba login dengan memaksa autentikasi password:
bash
ssh -o PubkeyAuthentication=no [email protected]

Hasil yang diharapkan adalah penolakan koneksi tanpa muncul perintah pengisian password (Permission denied (publickey)).

Penanganan Darurat Console VNC/Serial. Jika Anda tidak sengaja terkunci karena salah mengonfigurasi berkas SSH atau UFW, gunakan fitur Web Console atau Serial Console (VNC) yang disediakan oleh penyedia VPS Anda (seperti DigitalOcean, Linode, atau Hetzner). Akses console ini tidak melewati SSH maupun UFW sehingga Anda dapat masuk dan memperbaiki berkas /etc/ssh/sshd_config.d/hardening.conf atau menjalankan ufw disable.

Pemecahan Masalah (Troubleshooting)

Tabel berikut memuat daftar masalah umum yang sering ditemui saat hardening SSH dan langkah penyelesaiannya:

Gejala MasalahKemungkinan PenyebabLangkah Solusi
Permission denied (publickey) saat login userHak akses folder .ssh atau authorized_keys salahJalankan chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys pada VPS
Koneksi Connection timed out setelah ufw enablePort SSH belum diizinkan di UFWGunakan console VNC VPS, lalu jalankan sudo ufw allow 22/tcp
Fail2ban tidak mendeteksi kegagalan loginOpsi backend tidak sesuai dengan log UbuntuPastikan backend = systemd diatur dalam jail.local
IP komputer sendiri tidak sengaja terblokir Fail2banTerlalu banyak percobaan salahBuka console VPS dan jalankan sudo fail2ban-client unban <IP-Anda>

Penutup

Hardening SSH di VPS Ubuntu dapat diselesaikan dalam hitungan menit dengan menggabungkan kunci SSH, mematikan login root & password, serta memfungsikan UFW dan Fail2ban. Dengan menerapkan langkah-langkah di atas dan selalu melakukan pengujian pada sesi terminal terpisah, VPS Anda kini terlindungi dari serangan brute force otomatis tanpa mengorbankan kenyamanan akses administratif Anda.