Ini langkah awal yang harus dilakukan setelah melakukan instalasi sistem operasi di server, entah server fisik maupun virtual dan akan menggunakan IP Publik. Langkah ini harus dilakukan secara hati-hati dan berurutan, karena jika salah urutannya maka kemungkinan besar adalah kamu terkunci dari servermu sendiri dan tidak bisa login kembali.
Langkah 1, Persiapan [AMAN]
- Buka terminal atau console
- Catat kondisi SSH saat ini
# Versi SSH
ssh -V
# Port yang sedang dipakai
ss -tlnp | grep sshd
# Cek konfigurasi aktif (bukan dari file, tapi yang benar-benar berjalan)
sshd -T | grep -E “port|permitrootlogin|passwordauth|pubkeyauth|maxauthtries”
# Cek user yang ada dan siapa yang bisa login
cat /etc/passwd | grep -v nologin | grep -v false- Backup semua file SSH yang akan diubah
# Backup config utama
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
# Backup seluruh direktori ssh (termasuk host keys)
cp -r /etc/ssh /etc/ssh.bak.$(date +%Y%m%d)
echo "Backup selesai:"
ls -la /etc/ssh.bak.$(date +%Y%m%d)/Langkah 2, Buat dan pasang SSH Key [HATI-HATI]
Langkah ini harus diselesaikan sepenuhnya sebelum menonaktifkan password auth. Urutan langkah harus sesuai, tidak boleh dibolak-balik.
- Generate key pair di komputer lokal kamu (bukan di server)
- Jalankan ini di terminal laptop/PC kamu, bukan di server:
# Buat direktori .ssh kalau belum ada
mkdir -p ~/.ssh && chmod 700 ~/.ssh
# Generate key pair — Ed25519 lebih modern dan aman dari RSA
ssh-keygen -t ed25519 -C "nama.user@nama.domain-$(date +%Y%m%d)" -f ~/.ssh/nama.domain_ed25519
# Kamu akan diminta passphrase — ISI passphrase yang kuat
# (passphrase mengenkripsi private key, sehingga kalau file-nya dicuri tetap tidak bisa dipakai)Perintah diatas akan menghasilkan dua buah file:
~/.ssh/nama.domain_ed25519? private key, jangan pernah dibagikan ke siapapun~/.ssh/nama.domain_ed25519.pub? public key, ini yang dipasang di server
- Pasang public key ke server
# Dari komputer lokal, copy public key ke server
# Ganti [user] dengan username SSH kamu (misal: root atau user lain)
# Ganti [IP_VPS] dengan IP server
ssh-copy-id -i ~/.ssh/nama.domain_ed25519.pub [user]@[IP_SERVER]Kalau ssh-copy-id tidak tersedia (Windows), lakukan manual, buka dengan notepad atau sejenisnya — tampilkan isi public key:
# Di komputer lokal
cat ~/.ssh/nama.domain_ed25519.pubCopy outputnya, lalu di server jalankan:
# Di server — ganti [user] dengan username yang dipakai
mkdir -p /home/[user]/.ssh
chmod 700 /home/[user]/.ssh
# Paste isi public key di sini
echo "ssh-ed25519 AAAA... nama.user@nama.domain-..." >> /home/[user]/.ssh/authorized_keys
chmod 600 /home/[user]/.ssh/authorized_keys
chown -R [user]:[user] /home/[user]/.ssh- Test login dengan key — WAJIB sebelum lanjut
Buka terminal baru (jangan tutup sesi yang lama), lalu:
# Dari komputer lokal — test login dengan key
ssh -i ~/.ssh/nama.domain_ed25519 -p 22 [user]@[IP_VPS]Jika berhasil masuk dengan sukses tanpa diminta password server (hanya passpharse key), baru bisa lanjut ke langkah ke 3. Jika gagal atau menemui galat, perbaiki dahulu sebelum lanjut.
Langkah ke 3, Edit file konfigurasi sshd_config [HATI-HATI]
# Di server — buka file config
nano /etc/ssh/sshd_configCari dan ubah atau tambahkan baris-baris berikut. Kalau barisnya ada tapi di-comment (#), hapus tanda #-nya:
# --- Port: ganti dari 22 ke port lain (pilih antara 1024-65535)
# PENTING: buka port ini di firewall SEBELUM reload SSH
Port 2244
# --- Protokol: hanya SSH versi 2
Protocol 2
# --- Matikan login root langsung via SSH
PermitRootLogin no
# --- Autentikasi: hanya key, matikan password
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no
# --- Batasi percobaan login
MaxAuthTries 3
MaxSessions 5
# --- Timeout koneksi yang tidak selesai login
LoginGraceTime 30
# --- Putus koneksi idle setelah 10 menit
ClientAliveInterval 300
ClientAliveCountMax 2
# --- Batasi user yang boleh SSH
# Ganti dengan username aktual yang dipakai
AllowUsers [user_kamu]
# --- Matikan fitur yang tidak dipakai
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PermitTunnel no
GatewayPorts no
# --- Sembunyikan informasi sistem dari banner login
PrintLastLog yes
PrintMotd no
# --- Algoritma kriptografi kuat (modern, buang yang lemah)
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com
HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-256- Buka port baru di firewall SEBELUM reload SSH [HATI-HATI]
Ini urutan yang tidak boleh (haram) dibalik, buka firewall dulu baru reload SSH:
# Buka port SSH baru (sesuaikan angka dengan Port di atas)
ufw allow 2244/tcp comment 'SSH hardened port'
# Cek aturan firewall
ufw status numbered
# Pastikan port 22 lama belum ditutup dulu (nanti setelah konfirmasi port baru bekerja)
- Uji sintaks config [AMAN]
sshd -t
Output harus bersih — tidak ada pesan error sama sekali. Kalau ada error, perbaiki barisnya sebelum lanjut. Jangan reload kalau sshd -t menampilkan galat atau error.
- Reload SSH [HATI-HATI]
systemctl reload ssh
- Test koneksi dengan port baru, JANGAN tutup sesi lama [HATI-HATI]
ssh -i ~/.ssh/nama.domain_ed25519 -p 2244 [user]@[IP_SERVER]
Jika berhasil masuk dengan aman dan port baru dapat diakses tanpa pesan galat apapun, maka port lama (default) 22 bisa ditutup dengan aman.
# Di server — hapus izin port 22 lama
ufw delete allow 22/tcp
ufw status numberedLangkah ke 4, Pasang Fail2ban [HATI-HATI]
Fail2ban merupakan aplikasi untuk menambahkan lapisan pertahanan penting. Fail2ban akan secara otomatis memblokir IP yang gagal login berkali-kali dan mengurangi noise di log.
# Install (asumsi menggunakan debian dan turunnnya, untuk sistem operasi lainnya dapat merujuk ke dokumentasi yang diberikan oleh produsennya)
apt update && apt install fail2ban -y
# Backup config default
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak.$(date +%Y%m%d)
# Buat config lokal (jangan edit jail.conf langsung — akan ditimpa saat update)
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
# Ban selama 1 jam
bantime = 3600
# Jendela waktu pemantauan: 10 menit
findtime = 600
# Maksimal percobaan gagal sebelum diblokir
maxretry = 3
# Kirim email notifikasi (opsional, isi kalau punya mail server)
# destemail = nama.user@nama.domain (sesuaikan nama emailnya)
[sshd]
enabled = true
port = 2244
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
EOF
# Aktifkan dan jalankan
systemctl enable fail2ban
systemctl start fail2banLangkah ke 5, Verifikasi menyeluruh [AMAN]
# 1. Pastikan SSH jalan di port baru
ss -tlnp | grep sshd
# 2. Pastikan fail2ban aktif
systemctl status fail2ban
fail2ban-client status sshd
# 3. Cek konfigurasi aktif yang benar-benar berjalan
sshd -T | grep -E "port|permitrootlogin|passwordauth|maxauthtries|allowusers|x11forwarding"
# 4. Test: login root harus DITOLAK
ssh -i ~/.ssh/nama.domain_ed25519 -p 2244 root@[IP_SERVER]
# Harus muncul: "Permission denied" atau "root login not allowed"
# 5. Test: login dengan password harus DITOLAK
ssh -o PreferredAuthentications=password -p 2244 [user]@[IP_SERVER]
# Harus muncul: "Permission denied (publickey)"
# 6. Lihat log untuk memastikan tidak ada anomali
journalctl -u ssh -n 30 --no-pagerLangkah ke 6, Konfigurasi SSH Client di komputer lokal [Optional tapi sangan membantu]
Agar tidak perlu mengetik port dan nama key setiap kali, tambahkan ini ke ~/.ssh/config di komputer lokal kamu:
Host pattiro
HostName [IP_SERVER]
User [user_kamu]
Port 2244
IdentityFile ~/.ssh/nama.domain_ed25519
ServerAliveInterval 60