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.
  • ed25519 lebih pendek, cepat, dan modern. Pakai rsa -b 4096 hanya 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: ~/.ssh harus 700, authorized_keys harus 600, 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.conf berisi PasswordAuthentication yes. Jika kamu hanya mengedit sshd_config utama, pengaturanmu diabaikan. Cek dengan grep -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
OpsiFungsi
PermitRootLogin noRoot tidak bisa login via SSH (prohibit-password = root hanya boleh via key)
PasswordAuthentication noMatikan login password
KbdInteractiveAuthentication noTutup jalur password via keyboard-interactive/PAM (nama lama: ChallengeResponseAuthentication)
AuthenticationMethods publickeyHanya izinkan key
AllowUsers / AllowGroupsWhitelist user/grup; yang lain ditolak walau key valid
MaxAuthTriesBatas percobaan auth per koneksi
LoginGraceTimeWaktu maksimal untuk menyelesaikan login
X11Forwarding, AllowAgentForwarding, AllowTcpForwardingMatikan fitur yang tidak dipakai
ClientAliveInterval × ClientAliveCountMaxPutus 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 = systemd membaca langsung dari journald; berguna jika /var/log/auth.log tidak ada. Jika SSH memakai port lain, ganti port = 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:

UntungRugi
Log jauh lebih bersih dari bot otomatisBukan keamanan sungguhan (security through obscurity); port scanner menemukannya dalam hitungan detik
Beban CPU dari percobaan brute force berkurangHarus 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 yes mencegah client mencoba semua key di agent satu per satu, yang bisa memicu Too many authentication failures karena MaxAuthTries.
  • UseKeychain hanya dikenali OpenSSH di macOS; IgnoreUnknown UseKeychain membuat file yang sama tetap valid di Linux.
  • ProxyJump lebih aman daripada ForwardAgent untuk 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

  1. Key ed25519 dengan passphrase, sudah dites.
  2. User non-root dengan sudo.
  3. PermitRootLogin no, PasswordAuthentication no, KbdInteractiveAuthentication no (atau yes hanya untuk 2FA).
  4. Tidak ada drop-in lain yang menimpa (sshd -T untuk memastikan).
  5. AllowUsers diisi.
  6. UFW: hanya port SSH yang diperlukan, dengan limit.
  7. fail2ban aktif untuk jail sshd.
  8. Update rutin: sudo apt update && sudo apt upgrade (atau unattended-upgrades).

9. Kesalahan Umum

GejalaPenyebabSolusi
Password masih bisa dipakai setelah diset noDrop-in 50-cloud-init.conf menang (nilai pertama)Pakai drop-in 00-*.conf, cek sshd -T
Key ditolak, minta passwordPermission ~/.ssh atau authorized_keys salahchmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
Too many authentication failuresAgent mencoba banyak keyIdentitiesOnly yes + IdentityFile
Port baru tidak aktif di Ubuntu 24.04Socket activationdaemon-reload + restart ssh.socket
Terkunci setelah restartKonfigurasi salah / port belum dibuka di firewallSelalu sshd -t, tes di terminal kedua, siapkan konsol provider
Unit sshd.service not foundNama service di Ubuntu adalah sshsystemctl restart ssh
Terkena ban fail2ban sendiriIP tidak ada di ignoreipTambah 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.

Comments