September 27, 2026
SSH Hardening.
Mengamankan SSH di server Ubuntu: autentikasi key ed25519, mematikan login password dan root, opsi penting sshd_config, fail2ban, untung-rugi ganti port, konfigurasi client, dan 2FA opsional.
Begitu server punya IP publik, dalam hitungan menit port 22-nya akan dicoba bot dengan ribuan kombinasi username/password. SSH sendiri aman, yang lemah biasanya konfigurasinya: password yang bisa ditebak dan login root yang terbuka. Catatan ini merangkum langkah hardening OpenSSH di Ubuntu Server (22.04/24.04).
Peringatan: Selama mengubah konfigurasi SSH, biarkan satu sesi SSH tetap terbuka dan tes login dari terminal kedua. Jika konfigurasi salah, sesi pertama masih bisa dipakai untuk memperbaikinya. Siapkan juga akses konsol dari panel VPS.
1. Autentikasi dengan SSH Key
Key jauh lebih aman daripada password: tidak bisa ditebak dengan brute force, dan private key tidak pernah dikirim ke server.
Buat key di laptop (client)
ssh-keygen -t ed25519 -C "fanny@laptop"
- Simpan di lokasi default
~/.ssh/id_ed25519. - Isi passphrase. Jika laptop dicuri, key tidak langsung bisa dipakai.
ssh-agent(dan Keychain di macOS) membuatmu cukup mengetik passphrase sekali. ed25519lebih pendek, cepat, dan modern. Pakairsa -b 4096hanya jika sistem lama tidak mendukung ed25519.
Kirim public key ke server
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@IP_SERVER
Tanpa ssh-copy-id (misalnya dari Windows), tambahkan manual:
# di server
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... fanny@laptop" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Tes login tanpa password sebelum lanjut:
ssh -i ~/.ssh/id_ed25519 user@IP_SERVER
Penting: Permission yang terlalu longgar membuat sshd menolak key tanpa pesan jelas di sisi client:
~/.sshharus700,authorized_keysharus600, dan home directory tidak boleh writable oleh group/other.
2. Buat User Non-root dengan sudo
Jangan bekerja sebagai root sehari-hari.
sudo adduser deploy
sudo usermod -aG sudo deploy
sudo rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
Perintah terakhir menyalin authorized_keys milik user sekarang ke user baru. Tes ssh deploy@IP_SERVER dan sudo -v sebelum mematikan login root.
3. Konfigurasi sshd
Di Ubuntu, /etc/ssh/sshd_config meng-include /etc/ssh/sshd_config.d/*.conf di bagian atas. Untuk sebagian besar opsi, OpenSSH memakai nilai pertama yang ditemukan. Artinya pengaturan di folder sshd_config.d/ mengalahkan isi file utama, dan di dalam folder itu file diproses urut abjad.
Peringatan: Image cloud (dan cloud-init) sering membuat
/etc/ssh/sshd_config.d/50-cloud-init.confberisiPasswordAuthentication yes. Jika kamu hanya mengeditsshd_configutama, pengaturanmu diabaikan. Cek dengangrep -r PasswordAuthentication /etc/ssh/.
Cara paling rapi: buat satu file drop-in dengan nama yang terurut lebih dulu.
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
# Autentikasi
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
AuthenticationMethods publickey
# Batasi siapa yang boleh login
AllowUsers deploy
# Kurangi permukaan serangan
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
AllowAgentForwarding no
MaxSessions 5
# Putuskan sesi idle yang mati
ClientAliveInterval 300
ClientAliveCountMax 2
| Opsi | Fungsi |
|---|---|
PermitRootLogin no | Root tidak bisa login via SSH (prohibit-password = root hanya boleh via key) |
PasswordAuthentication no | Matikan login password |
KbdInteractiveAuthentication no | Tutup jalur password via keyboard-interactive/PAM (nama lama: ChallengeResponseAuthentication) |
AuthenticationMethods publickey | Hanya izinkan key |
AllowUsers / AllowGroups | Whitelist user/grup; yang lain ditolak walau key valid |
MaxAuthTries | Batas percobaan auth per koneksi |
LoginGraceTime | Waktu maksimal untuk menyelesaikan login |
X11Forwarding, AllowAgentForwarding, AllowTcpForwarding | Matikan fitur yang tidak dipakai |
ClientAliveInterval × ClientAliveCountMax | Putus koneksi yang tidak merespons (di sini ±10 menit) |
Tes dan terapkan
sudo sshd -t # cek sintaks; tidak ada output = OK
sudo sshd -T | grep -Ei 'passwordauth|permitroot|kbdinteractive|allowusers' # nilai efektif
sudo systemctl restart ssh # nama service di Ubuntu: ssh, bukan sshd
Lalu dari terminal kedua:
ssh deploy@IP_SERVER # harus berhasil
ssh -o PubkeyAuthentication=no deploy@IP_SERVER # harus ditolak: Permission denied (publickey)
ssh root@IP_SERVER # harus ditolak
4. fail2ban
fail2ban membaca log autentikasi, lalu memblokir IP yang gagal login berkali-kali lewat firewall . Dengan password sudah dimatikan, fail2ban bukan lagi pertahanan utama, tetapi tetap berguna untuk mengurangi noise log dan beban server.
sudo apt install fail2ban
Jangan edit jail.conf (tertimpa saat update). Buat jail.local:
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
# naikkan durasi ban untuk pelanggar berulang
bantime.increment = true
[sshd]
enabled = true
port = ssh
backend = systemd
ignoreip: masukkan IP statis kantor/rumahmu agar tidak ikut terblokir.backend = systemdmembaca langsung dari journald; berguna jika/var/log/auth.logtidak ada. Jika SSH memakai port lain, gantiport = 2222.
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 198.51.100.23
5. Ganti Port: Untung dan Rugi
Memindah SSH dari port 22 ke port lain (misalnya 2222) sering disarankan. Faktanya:
| Untung | Rugi |
|---|---|
| Log jauh lebih bersih dari bot otomatis | Bukan keamanan sungguhan (security through obscurity); port scanner menemukannya dalam hitungan detik |
| Beban CPU dari percobaan brute force berkurang | Harus ingat/menulis -p 2222 di mana-mana (Git, rsync, CI) |
| Jaringan kantor/hotel kadang memblokir port non-standar | |
| Risiko terkunci jika lupa membuka port baru di UFW/firewall cloud |
Kesimpulannya: key + password dimatikan + fail2ban jauh lebih penting. Ganti port boleh sebagai lapisan tambahan untuk mengurangi noise.
Jika tetap ingin mengganti, perhatikan bahwa sejak Ubuntu 22.10 (termasuk 24.04), SSH memakai socket activation (ssh.socket). Port dibaca dari sshd_config oleh generator systemd
, jadi restart service saja tidak cukup:
# 1. buka port baru di firewall DULU
sudo ufw allow 2222/tcp
# 2. set port
echo "Port 2222" | sudo tee /etc/ssh/sshd_config.d/10-port.conf
# 3. terapkan (Ubuntu 22.10+)
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
# 4. tes dari terminal lain
ssh -p 2222 deploy@IP_SERVER
# 5. setelah berhasil, tutup port 22
sudo ufw delete allow OpenSSH
Di Ubuntu 22.04 dan sebelumnya (tanpa socket activation), cukup sudo systemctl restart ssh. Cek mana yang aktif dengan systemctl status ssh.socket.
6. Konfigurasi Client: ~/.ssh/config
Daripada mengetik ssh -i ~/.ssh/id_ed25519 -p 2222 [email protected], buat alias di laptop:
# ~/.ssh/config
Host prod
HostName 203.0.113.50
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519
Host db-internal
HostName 10.0.0.12
User deploy
ProxyJump prod
# default untuk semua host; taruh di paling bawah karena
# ssh_config memakai nilai PERTAMA yang cocok
Host *
AddKeysToAgent yes
IdentitiesOnly yes
ServerAliveInterval 60
IgnoreUnknown UseKeychain
UseKeychain yes
ssh prod
scp backup.sql prod:/tmp/
ssh db-internal # otomatis lompat lewat prod (bastion)
ssh -L 3306:127.0.0.1:3306 prod # tunnel MySQL ke laptop
IdentitiesOnly yesmencegah client mencoba semua key di agent satu per satu, yang bisa memicuToo many authentication failureskarenaMaxAuthTries.UseKeychainhanya dikenali OpenSSH di macOS;IgnoreUnknown UseKeychainmembuat file yang sama tetap valid di Linux.ProxyJumplebih aman daripadaForwardAgentuntuk mengakses server di balik bastion.- Permission file:
chmod 600 ~/.ssh/config.
7. (Opsional) 2FA dengan TOTP
Untuk lapisan tambahan, kombinasikan key dan kode TOTP (Google Authenticator, Aegis, 1Password).
sudo apt install libpam-google-authenticator
google-authenticator # jalankan sebagai user yang akan login, bukan root
Pilih time-based = y, scan QR code, dan simpan emergency scratch codes.
Edit /etc/pam.d/sshd:
# nonaktifkan password Unix agar yang diminta hanya key + TOTP
#@include common-auth
auth required pam_google_authenticator.so
Ubah /etc/ssh/sshd_config.d/00-hardening.conf (ganti baris yang sudah ada, jangan menambah duplikat karena nilai pertama yang menang):
KbdInteractiveAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
sudo sshd -t && sudo systemctl restart ssh
Sekarang login membutuhkan key yang valid lalu kode verifikasi. Tes dari terminal kedua sebelum menutup sesi lama. Pastikan jam server akurat (timedatectl), karena TOTP bergantung pada waktu.
8. Checklist
- Key ed25519 dengan passphrase, sudah dites.
- User non-root dengan sudo.
PermitRootLogin no,PasswordAuthentication no,KbdInteractiveAuthentication no(atauyeshanya untuk 2FA).- Tidak ada drop-in lain yang menimpa (
sshd -Tuntuk memastikan). AllowUsersdiisi.- UFW: hanya port SSH yang diperlukan, dengan
limit. - fail2ban aktif untuk jail
sshd. - Update rutin:
sudo apt update && sudo apt upgrade(atauunattended-upgrades).
9. Kesalahan Umum
| Gejala | Penyebab | Solusi |
|---|---|---|
Password masih bisa dipakai setelah diset no | Drop-in 50-cloud-init.conf menang (nilai pertama) | Pakai drop-in 00-*.conf, cek sshd -T |
| Key ditolak, minta password | Permission ~/.ssh atau authorized_keys salah | chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys |
Too many authentication failures | Agent mencoba banyak key | IdentitiesOnly yes + IdentityFile |
| Port baru tidak aktif di Ubuntu 24.04 | Socket activation | daemon-reload + restart ssh.socket |
| Terkunci setelah restart | Konfigurasi salah / port belum dibuka di firewall | Selalu sshd -t, tes di terminal kedua, siapkan konsol provider |
Unit sshd.service not found | Nama service di Ubuntu adalah ssh | systemctl restart ssh |
| Terkena ban fail2ban sendiri | IP tidak ada di ignoreip | Tambah IP, fail2ban-client set sshd unbanip <IP> |
Referensi

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.