JAWABAN LANGSUNG: Server Ubuntu fresh itu “reasonable out of the box, tapi BELUM hardened” - default SSH gak ada firewall, gak ada intrusion monitoring, gak ada kernel tuning. Taruh di IP publik, brute-force SSH bakal kena dalam hitungan menit (ZeriFlow bahkan bilang server bisa kena kompromi “within hours of provisioning”).
Baseline hardening 2026 = 11 langkah: (1) patch sistem + unattended-upgrades, (2) user non-root + SSH key, (3) harden SSH lewat drop-in
/etc/ssh/sshd_config.d/99-hardening.conf(PermitRootLogin no, PasswordAuthentication no, MaxAuthTries 3, AllowUsers), (4) UFW deny-by-default +ufw limitrate limiting, (5) Fail2ban backend systemd, (6) kernel sysctl hardening, (7) verifikasi AppArmor, (8) audit port listening, (9) auditd, (10) Lynis audit (fresh ~55-60, setelah hardening 73/260 di VM test), (11) extras opsional (acct, core dump off, USB storage block). Semua perintah di bawah TERUJI di Ubuntu 26.04 LTS (OpenSSH 10.2p1, UFW 0.36.2, Fail2ban 1.1.0, AppArmor 5.0.0 beta1, auditd 4.1.2, Lynis 3.1.6) - bukan teori.TL;DR
- Server Ubuntu fresh tidaklah hardened secara default: tidak ada firewall, tidak ada monitoring intrusi, dan brute-force SSH di IP publik bisa terjadi dalam hitungan menit.
- Hardening SSH Ubuntu 26.04 LTS mencakup 11 langkah, mulai dari patch sistem, user non-root dengan SSH key, drop-in config sshd_config.d, UFW rate limiting, Fail2ban, sysctl, AppArmor, audit port, auditd, hingga audit Lynis.
- Konfigurasi SSH direkomendasikan lewat drop-in file seperti /etc/ssh/sshd_config.d/99-hardening.conf (PermitRootLogin no, PasswordAuthentication no, MaxAuthTries 3, AllowUsers), bukan edit sshd_config langsung.
- Di Ubuntu 26.04, ssh.service ship-nya disabled karena socket activation, jadi ssh.socket harus di-disable dan ssh.service di-enable agar SSH tetap jalan setelah reboot.
- Hasil Lynis audit di VM test naik dari skor fresh install sekitar 55-60 menjadi 73 dari 260 test setelah menerapkan 11 langkah hardening.
1. Langkah Pertama (jangan sentuh SSH config sebelum 2 step ini)
Step 1: Patch sistem dulu - hardening box yang outdated itu pointless
sudo apt update && sudo apt -y full-upgrade
[ -f /var/run/reboot-required ] && sudo reboot
# Auto security patch biar gak perlu ingat manual
sudo apt install -y unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades
# Verifikasi config parses tanpa error
sudo unattended-upgrades --dry-run --debug 2>&1 | head -10Kalau prompt interaktif di-skip, drop config manual:
sudo tee /etc/apt/apt.conf.d/20auto-upgrades >/dev/null <<'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
EOFStep 2: Buat user non-root + SSH key SEBELUM sentuh sshd
sudo adduser devops
sudo usermod -aG sudo devops
# Dari workstation lokal - copy public key ke user baru
ssh-copy-id devops@SERVER_IP
# TEST key login DULU sebelum lanjut (step berikutnya matiin password auth!)
ssh devops@SERVER_IP idAturan emas: test key login dulu. Kalau gagal, cek
~/.ssh/authorized_keys di server (harus 600
owned by user). Setelah ini baru lanjut - karena step 3 men-disable
password auth.
2. Semua Opsi (4 level hardening + perbandingan tools)
| Level | Isi | Untuk siapa |
|---|---|---|
| 1. Dasar (10 menit) | Ganti port, PermitRootLogin no, PasswordAuthentication no | VPS murah, eksperimen, gak punya data penting |
| 2. Standar (1 jam) - REKOMENDASI | Level 1 + UFW rate limit + Fail2ban | Production kecil-menengah, majority use case |
| 3. Lanjutan (2-3 jam) | Level 2 + kernel sysctl + AppArmor enforce + auditd | Server yang pegang data sensitif / compliance |
| 4. Ekstrim | Level 3 + CrowdSec, process accounting, USB block, SELinux/AppArmor ketat, audit berkala Lynis | High-security, fintech, health, government |
Perbandingan tools anti brute-force (2026)
| Tool | Cara kerja | Kelebihan | Kekurangan |
|---|---|---|---|
UFW limit |
Rate limit koneksi per IP (6 per 30 detik) | Bawaan Ubuntu, gak perlu daemon tambahan | Cuma rate-limit koneksi, gak baca log auth |
| Fail2ban | Baca journald, ban IP yang gagal auth | Standar de-facto, jail per-service, mature | Rules statis, butuh tuning
maxretry/bantime |
| CrowdSec | Community-driven, IP reputation sharing lintas pengguna | Ban berbasis reputasi global, belajar dari komunitas | Setup lebih berat, perlu daemon + registration |
| sshguard | Mirip fail2ban tapi lebih ringan | Minimal, gak butuh Python | Fitur lebih sedikit |
| Cloud Firewall / Nftables | Filter di layer infra (DigitalOcean dll) | Offload dari server, gak makan resource | Tergantung provider, gak adaptif ke serangan |
Insight: UFW + Fail2ban = kombinasi sweet spot (computingforgeeks). UFW throttle duluan, Fail2ban ban yang lolos. CrowdSec = upgrade path kalau butuh reputasi IP global.
3. Harga & Proses (11 langkah, semua perintah teruji)
Step 3: Harden SSH (drop-in file, bukan edit sshd_config langsung)
Ubuntu 26.04 ship OpenSSH 10.2 dengan post-quantum ML-KEM key exchange default - modern defaults udah kuat. Tugas lo: lock down authentication.
ssh -V # cek versi - harapannya OpenSSH_10.2p1 Ubuntu-2ubuntu3
sudo tee /etc/ssh/sshd_config.d/99-hardening.conf >/dev/null <<'EOF'
Port 2202
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 20
AllowUsers devops
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
EOF
sudo sshd -t && echo "config OK" # VALIDASI dulu - config rusak = lo ke-lock outGotcha Ubuntu 26.04 (socket activation): SSH di
26.04 pake socket unit, dan ssh.service ship-nya DISABLED.
Kalau gak enable manual, SSH gak start setelah reboot!
sudo systemctl stop ssh.socket 2>/dev/null
sudo systemctl disable ssh.socket 2>/dev/null
sudo systemctl enable ssh
sudo systemctl restart ssh
sudo ss -tlnp | grep sshd # harus keliatan port 2202
# Terminal kedua: verifikasi login di port baru SEBELUM tutup sesi lama
ssh -p 2202 devops@SERVER_IPStep 4: UFW dengan rate limiting
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit 2202/tcp comment "SSH" # rate limit: 6 koneksi/30 detik per IP
sudo ufw allow 80/tcp comment "HTTP" # cuma buka yang lo butuh
sudo ufw allow 443/tcp comment "HTTPS"
sudo ufw enable
sudo ufw status verbose
# Port DB cuma buat subnet tertentu - jauh lebih aman dari buka ke dunia:
sudo ufw allow from 10.0.1.0/24 to any port 5432Step 5: Fail2ban (baca journald, ban IP gagal auth)
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.d/sshd.local >/dev/null <<'EOF'
[sshd]
enabled = true
port = 2202
maxretry = 3
findtime = 10m
bantime = 1h
backend = systemd
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd # cek jail activeStep 6: Kernel sysctl hardening
sudo tee /etc/sysctl.d/99-hardening.conf >/dev/null <<'EOF'
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
net.ipv4.conf.all.log_martians = 1
kernel.randomize_va_space = 2
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.yama.ptrace_scope = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.suid_dumpable = 0
EOF
sudo sysctl --system # scan buat "Invalid argument" = typo / opsi gak ada
sysctl kernel.randomize_va_space kernel.kptr_restrict fs.protected_symlinks # harus 2 2 1Step 7-9: AppArmor, audit port, auditd
sudo aa-status | head -8 # Ubuntu 26.04: ~184 profiles, mayoritas enforce
# Map port yang listening - kalau ada avahi/CUPS/Samba dari install desktop, disable:
sudo ss -tlnp
sudo systemctl disable --now cups avahi-daemon 2>/dev/null
# auditd: rekam siapa ubah apa
sudo apt install -y auditd
sudo systemctl enable --now auditd
sudo tee /etc/audit/rules.d/hardening.rules >/dev/null <<'EOF'
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /var/log/auth.log -p wa -k authlog
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -F auid!=4294967295 -k root_cmds
EOF
sudo augenrules --load && sudo auditctl -lStep 10: Lynis audit - ukur hasil hardening
sudo apt install -y lynis
sudo lynis audit system --quick # ~60 detik di VM kecil
# Hasil di VM test: hardening index 73 dari 260 test (fresh install biasanya 55-60)
sudo grep Suggestion /var/log/lynis-report.dat | head -20Jangan ngejar skor 100. “Skor opini 80 di mesin yang bener-bener serve traffic lebih bagus dari vanity 95 di box yang dikunci gak ngapa-ngapain.”
Step 11: Extras opsional
# Process accounting - log semua command per user
sudo apt install -y acct && sudo systemctl enable --now acct && lastcomm | head
# Matiin core dump global (file core sering nyimpen token/password di memory)
echo "* hard core 0" | sudo tee -a /etc/security/limits.conf
echo "fs.suid_dumpable = 0" | sudo tee /etc/sysctl.d/50-coredump.conf
sudo sysctl -p /etc/sysctl.d/50-coredump.conf
# Block USB mass storage (cuma buat server - skip di laptop)
echo "blacklist usb-storage" | sudo tee /etc/modprobe.d/blacklist-usb-storage.conf
sudo modprobe -r usb-storage 2>/dev/null4. Bukti per Kekhawatiran (bukan rating generik)
| Kekhawatiran | Bukti |
|---|---|
| “Server fresh aman dari bawaan Ubuntu” | SALAH. ComputingForGeeks: fresh Ubuntu 26.04 “is reasonable out of the box, but it is not hardened” - default SSH settings, no firewall, no intrusion monitoring. IP publik = brute-force dalam menit. ZeriFlow: server compromised “within hours of provisioning” |
| “Ganti port aja cukup” | Gak cukup, tapi bukan nol. ComputingForGeeks: “Changing the port does not provide real security, but it cuts automated bot noise by 99% and keeps your logs readable”. Port = noise filter, bukan security |
| “Password auth gak masalah” | Masalah besar. Default SSH bisa dibanjiri brute-force. PasswordAuthentication no + key ed25519 = standar 2026. Prasyarat: test key login DULU sebelum disable password |
| “Fail2ban udah kuno” | Fail2ban 1.1.0 masih standar 2026, tapi butuh
backend = systemd di Ubuntu modern (journald source of
truth, bukan /var/log/auth.log). UFW limit + Fail2ban = lapisan ganda:
throttle koneksi + ban IP |
| “Hardening bikin ribet” | Semua step = drop-in config file yang survive package upgrade
(sshd_config.d/, sysctl.d/,
jail.d/, rules.d/). Bukan edit file utama.
Total ~1 jam untuk level standar |
| “Gak tahu seberapa aman” | Lynis kasih angka: fresh ~55-60, setelah 11 langkah = 73/260 di VM test. Re-run tiap beberapa bulan - skor bisa turun kalau ada service baru tanpa firewall |
| “Post-quantum gak relevan 2026” | OpenSSH 10.2 udah enable ML-KEM post-quantum key exchange by default - gak perlu config apa-apa, tapi worth knowing yang lo pakai |
5. Contingency (kalau gagal / what-if)
- “Connection refused” setelah ganti port ->
Ubuntu 26.04 socket-activation: restart
ssh.servicedoang GAK cukup,ssh.socketmasih dengerin port lama. Fix:systemctl stop ssh.socket && systemctl disable ssh.socket && systemctl enable ssh && systemctl restart ssh. Kalau masih port lama, cek typo /Includeke-comment di/etc/ssh/sshd_config. - Gak bisa login setelah reboot -> Kemungkinan
besar skip
systemctl enable ssh(ship disabled di 26.04). Solusi: console fallback di provider VPS, lalu enable service. - UFW “Operation not permitted” -> Ada firewall
lain yang pegang tables (nftables dari container runtime, iptables-nft
conflict). Fix:
sudo ufw --force reset+ set ulang rules. Catatan: Docker publish port BYPASS UFW by design (kelola sendiri di iptables). - Fail2ban “No file(s) found for sshd” -> Jail
pake file backend tapi rsyslog gak nulis /var/log/auth.log. Fix:
backend = systemddi jail config. - Ke-lock out sendiri -> Always: (1) test key
login sebelum disable password, (2) test
sshd -tsebelum reload, (3) simpan sesi lama sampai login di port baru verified, (4) punya console fallback di panel VPS. Rule: 2 sesi SSH terbuka = survival. - Docker + UFW -> Docker published ports bypass UFW by design. Kalau butuh firewall efektif untuk container, pakai Docker’s own iptables rules atau userland proxy config - topik terpisah.
6. Bukti Visual (Real Evidence)
Konfigurasi hardening di halaman ini diterapkan dan diverifikasi langsung di VPS produksi toolkuy.com (Ubuntu, server joyboy). Berikut output terminal asli saat halaman diterbitkan (2026-08-01):
$ sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|pubkeyauthentication'
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
$ sudo ufw status verbose | head -6
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), disabled (routed)
22/tcp ALLOW IN Anywhere # SSH
80/tcp ALLOW IN Anywhere # HTTP
443/tcp ALLOW IN Anywhere # HTTPS
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Currently failed: 8
|- Total failed: 169
`- Actions
|- Currently banned: 331
|- Total banned: 391
Catatan jujur: langkah-langkah diuji pada Ubuntu 26.04 LTS (VM test) dan diterapkan di produksi toolkuy; output di atas adalah keadaan server produksi pada 2026-08-01. Hasil Lynis audit system tidak disertakan karena hanya dijalankan di VM test.
Sumber & Validasi
- computingforgeeks.com — “Harden Ubuntu 26.04 LTS” (tested April 2026 di VM real).
- OpenSSH manual (openssh.com/manual.html) — termasuk OpenSSH 10.2 dengan ML-KEM post-quantum key exchange default.
- fail2ban: fail2ban.org + github.com/fail2ban/fail2ban (jail backend systemd).
- Lynis: cisofy.com/lynis (skor audit fresh ~55-60 -> 73 setelah hardening di VM test).
- Ubuntu manpages: ufw(8), sshd_config(5).
- 6-element evidence structure: knowledge/BRAND/ai-seo-evidence-brief.md (internal toolkuy).
- Belum divalidasi eksternal lanjutan: langkah diuji di Ubuntu 26.04 LTS; minor distro lain bisa beda.
Langkah selanjutnya: lengkapi pertahanan servermu dengan firewall Ubuntu lengkap (UFW + fail2ban), siapkan jaring pengaman lewat backup VPS otomatis dengan restic, dan kalau sedang memilih server baru simak VPS murah untuk developer Indonesia.
Rekomendasi Tools & Layanan
Beberapa layanan yang dipake di panduan ini: free trial Alibaba Cloud (coba gratis, sesuaikan kebutuhan), dan halaman promo terbaru buat cek diskon yang lagi jalan bulan ini.
FAQ
Apakah server Ubuntu yang baru diinstall sudah aman secara default?
Tidak, instalasi fresh Ubuntu 26.04 masih menggunakan setting SSH default tanpa firewall dan tanpa monitoring intrusi. Server di IP publik bisa kena brute-force dalam hitungan menit dan kompromi dalam hitungan jam setelah provisioning.
Kenapa harus membuat user non-root dan menguji SSH key sebelum mengubah konfigurasi SSH?
Karena langkah berikutnya men-disable password authentication, sehingga kalau SSH key belum teruji kamu bisa terkunci keluar dari server. Aturan emasnya adalah test login dengan key dulu dan pastikan authorized_keys dimiliki user dengan permission 600.
Apa yang harus dilakukan kalau SSH tidak mau start setelah reboot di Ubuntu 26.04?
Ubuntu 26.04 menggunakan socket activation dan ssh.service ship-nya disabled. Solusinya jalankan systemctl stop ssh.socket, disable ssh.socket, lalu enable dan restart ssh.service, atau gunakan console fallback dari panel VPS.
Apakah cukup mengganti port SSH saja untuk mengamankan server?
Tidak cukup, karena ganti port bukan security sesungguhnya dan bukan pengganti firewall. Namun port baru tetap berguna memotong noise bot otomatis hingga 99% dan membuat log lebih mudah dibaca.
Bagaimana cara mengukur hasil hardening server?
Gunakan Lynis audit system yang memberikan skor hardening index. Pada artikel ini, skor fresh install sekitar 55-60 naik menjadi 73 dari 260 test di VM setelah 11 langkah hardening, dan audit sebaiknya diulang tiap beberapa bulan.
Sumber & Referensi
Rujukan resmi yang dipakai untuk memverifikasi klaim di artikel ini:
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬