Target: Web Developer, DevOps Engineer, dan Sysadmin yang bertanggung jawab menyiapkan server VPS Ubuntu (AWS EC2, DigitalOcean, Hetzner, GCP, dll.) dari kondisi mentah (fresh install) menjadi lingkungan produksi yang tangguh, aman dari serangan brute-force, dan siap melayani trafik publik.
Versi: Ubuntu Server 24.04 LTS / 22.04 LTS (OpenSSH 9.x, UFW, Fail2ban 1.0+).
Fokus modul ini: Inspeksi jaringan & socket listening (ss -tulpn, ip a) → Kriptografi SSH Keypair (Ed25519) → Hardening SSH Daemon (sshd_config) → Kebijakan Firewall UFW (Default Deny) → Mitigasi Brute-Force dengan Fail2ban → Transfer file rilis performan via rsync → Pengamanan Environment Variables → Mini Project: Zero-to-Hero Production Server Hardening Checklist.
Cara Belajar
🟢 Fundamental (Wajib Dipahami)├── Diagnostik Jaringan & Pengecekan Socket Terbuka (ip, ping, curl, ss -tulpn)├── Remote Access Aman via Kriptografi SSH Keypair (Ed25519)└── Pengiriman File Efisien Antar-Server Menggunakan Rsync🟡 Intermediate (Konfigurasi Keamanan)├── Pengelolaan Firewall Server dengan UFW (Uncomplicated Firewall)├── Isolasi Port Database & Layanan Internal dari Akses Publik└── Manajemen Environment Variables & Secrets Persisten🔴 Advanced / Hardening Produksi├── SSH Server Hardening (Mematikan Password Auth & Root Login)├── Mitigasi Serangan Kamus / Brute-Force Otomatis dengan Fail2ban└── Strategi Zero-Lockout saat Mengubah Konfigurasi Keamanan
Mental Model: Lapisan Pertahanan Server (Defense in Depth)
Jangan pernah membiarkan server Linux produksi Anda langsung terekspos ke internet publik hanya dengan perlindungan kata sandi biasa. Di internet, bot scanner menguji ribuan kata sandi root setiap detiknya.
Terapkan arsitektur pertahanan berlapis:
TRAFIK DARI INTERNET PUBLIK (User Valid & Bot Attacker) │ ▼ ═════════════════════════════════════════════════════════════════ 1. LAPISAN FIREWALL KERNEL (UFW / Netfilter) Menutup SEMUA port secara default (Default Deny). Hanya membuka port yang wajib (misal: 22, 80, 443). Port sensitif (3306 MySQL / 5432 Postgres) DIBLOKIR TOTAL! ═════════════════════════════════════════════════════════════════ │ ▼ ═════════════════════════════════════════════════════════════════ 2. LAPISAN INTRUSION PREVENTION (Fail2ban) Memantau log autentikasi gagal (/var/log/auth.log). Jika ada IP yang salah sandi/key > 3 kali, IP penyerang otomatis DI-BAN selama 24 jam! ═════════════════════════════════════════════════════════════════ │ ▼ ═════════════════════════════════════════════════════════════════ 3. LAPISAN AKSES SSH HARDENING (OpenSSH Daemon) - Root login DILARANG (PermitRootLogin no). - Login password DIMATIKAN TOTAL (PasswordAuthentication no). - Hanya menerima Kunci Kriptografi Modern (Ed25519). ═════════════════════════════════════════════════════════════════ │ ▼ AKSES SERVER AMAN DIBERIKAN ✅
Sebelum mengamankan sistem, Anda harus mampu memeriksa status konektivitas kartu jaringan (network interface) dan mengetahui program apa saja yang sedang membuka pintu komunikasi (listening port).
Memeriksa IP & Interface Jaringan
# Menampilkan seluruh antarmuka jaringan dan alamat IP serverip a# Menampilkan tabel routing default gatewayip route
Menemukan Port yang Terbuka dengan ss
Di sistem Linux modern, utilitas netstat telah digantikan oleh ss (Socket Statistics) yang jauh lebih cepat dan akurat:
# Menampilkan port TCP & UDP yang sedang listening beserta nama prosesnyasudo ss -tulpn
Arti Opsi Flag:
-t: Menampilkan socket TCP.
-u: Menampilkan socket UDP.
-l: Hanya tampilkan socket yang berstatus LISTEN (membuka port penerima).
-p: Tampilkan nama Program dan PID yang memiliki port tersebut.
-n: Tampilkan alamat dan nomor port dalam bentuk Angka numerik murni (jangan ubah 80 menjadi teks http).
0.0.0.0:80→ Layanan terbuka dan dapat diakses oleh seluruh antarmuka jaringan / internet publik.
127.0.0.1:5432→ Layanan diikat secara privat ke localhost. Database aman karena hanya dapat dihubungi oleh aplikasi yang berjalan di dalam server yang sama.
Menguji Konektivitas Jaringan
# 1. ping: Menguji latensi ICMP ke server tujuanping -c 4 1.1.1.1# 2. curl: Memeriksa header respon HTTP dari command linecurl -I https://example.com# 3. nc (netcat): Mengetes apakah port tertentu di server tujuan terbuka (Port Checking)# Sintaks: nc -zv <ip_target> <port>nc -zv 192.168.1.10 3306
2. 🟢 Otentikasi Remote Akses dengan SSH Keypair
Konsep
SSH (Secure Shell) adalah protokol standar terenkripsi untuk mengendalikan server dari jarak jauh. Menggunakan kata sandi biasa (password authentication) memiliki risiko besar terhadap serangan tebak sandi (brute-force).
Metode otentikasi standar industri yang aman adalah Kunci Kriptografi Asimetris (Public/Private Keypair):
Private Key (Kunci Privat): Disimpan secara rahasia di komputer lokal Anda. Jangan pernah dikirim atau dibagikan kepada siapapun!
Public Key (Kunci Publik): Diunggah ke server target di dalam berkas ~/.ssh/authorized_keys.
┌───────────────────────────────────┐ ┌───────────────────────────────────┐ │ KOMPUTER LOKAL │ │ SERVER UBUNTU │ │ │ │ │ │ Private Key: id_ed25519 (RAHASIA)│ ── Challenge ─> Kunci Publik Terpasang di: │ │ Hanya dipegang pemilik laptop │ <── Response ── ~/.ssh/authorized_keys │ └───────────────────────────────────┘ └───────────────────────────────────┘
Langkah 1: Membuat SSH Keypair di Komputer Lokal
Gunakan algoritma Ed25519 (algoritma kriptografi kurva eliptis modern yang jauh lebih cepat dan aman dibandingkan RSA):
# Jalankan di terminal laptop Anda (Linux/macOS/Git Bash Windows)ssh-keygen -t ed25519 -C "budi@perusahaan.com"
Sistem akan menanyakan lokasi penyimpanan (tekan Enter untuk default ~/.ssh/id_ed25519).
Masukkan passphrase pengaman jika diinginkan.
Langkah 2: Mengunggah Kunci Publik ke Server
# Cara Otomatis: Menggunakan utilitas ssh-copy-idssh-copy-id -i ~/.ssh/id_ed25519.pub username@IP_SERVER_ANDA
Jika utilitas ssh-copy-id tidak tersedia, lakukan secara manual:
# 1. Cetak kunci publik di laptop Andacat ~/.ssh/id_ed25519.pub# 2. Di terminal server, tambahkan teks kunci publik tersebut ke:mkdir -p ~/.sshchmod 700 ~/.sshecho "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... budi@perusahaan.com" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys
IMPORTANT
SSH sangat ketat terhadap hak akses file. Jika folder ~/.ssh memiliki izin selain 700 atau authorized_keys selain 600, SSH daemon akan menolak login demi alasan keamanan!
3. 🟡 Transfer Berkas & Deployment Aman dengan Rsync
Konsep
Untuk mengirim berkas source code, build asset, atau file backup dari komputer lokal ke remote server, rsync jauh lebih unggul dibandingkan scp atau ftp.
Kelebihan Utama Rsync:
Delta-Transfer Algorithm: Hanya mengirimkan bagian file yang mengalami perubahan (menghemat bandwidth hingga 95%).
Mendukung kompresi data saat pengiriman (-z).
Mampu melanjutkan proses transfer yang terputus (resume).
# Mengirimkan folder 'dist/' lokal ke direktori web serverrsync -avzP --delete --exclude='.git' --exclude='node_modules' ./dist/ deployer@192.168.1.50:/var/www/my-app/public/
Arti Opsi Flag:
-a (archive): Menjaga timestamp, hak akses berkas, symlink, dan mode rekursif.
-v (verbose): Menampilkan rincian berkas yang sedang disinkronkan.
-z (compress): Mengompres data saat proses transfer jaringan berlangsung.
-P (progress & partial): Menampilkan progress bar dan menyimpan transfer parsial jika jaringan putus.
--delete: Menghapus berkas di server target jika file tersebut sudah dihapus di komputer lokal.
--exclude: Melewati folder raksasa yang tidak diperlukan saat rilis (seperti .git atau cache).
WARNING
Perhatikan Karakter Garis Miring di Akhir Path!
rsync -a ./dist/ server:/var/www/→ Menyalin isi dari folder dist ke dalam /var/www/.
rsync -a ./dist server:/var/www/→ Membuat folder dist di dalam /var/www/dist/.
4. 🟡 Mengamankan Server dengan UFW Firewall
Konsep
UFW (Uncomplicated Firewall) adalah antarmuka manajemen firewall bawaan Ubuntu yang memudahkan kita mengelola subsistem packet filtering Linux Kernel (Netfilter / iptables).
Filosofi Utama Firewall Produksi:
Tutup semua pintu masuk secara default (Default Deny), dan hanya buka port yang benar-benar esensial untuk melayani publik.
Konfigurasi Dasar UFW
# 1. Tetapkan kebijakan dasar (Default Policies)sudo ufw default deny incomingsudo ufw default allow outgoing# 2. Buka port SSH TERLEBIH DAHULU agar Anda tidak terkunci dari server!sudo ufw allow 22/tcp# 3. Buka port HTTP dan HTTPS untuk lalu lintas Websudo ufw allow 80/tcpsudo ufw allow 443/tcp# Atau bisa menggunakan profil aplikasi bawaan NGINX:sudo ufw allow "Nginx Full"# 4. Aktifkan firewallsudo ufw enable# 5. Periksa status aturan firewall secara detailsudo ufw status verbose
Contoh Tampilan ufw status verbose:
Status: activeLogging: on (low)Default: deny (incoming), allow (outgoing), disabled (routed)New profiles: skipTo Action From-- ------ ----22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6) 80/tcp (v6) ALLOW IN Anywhere (v6) 443/tcp (v6) ALLOW IN Anywhere (v6)
Membatasi Akses Port Database Hanya untuk IP Tertentu
Jika Anda memiliki server database (misal PostgreSQL port 5432) dan ingin agar database tersebut hanya bisa dihubungi oleh IP server backend (10.0.1.50):
# Mengizinkan hanya IP 10.0.1.50 untuk mengakses port PostgreSQL 5432sudo ufw allow from 10.0.1.50 to any port 5432 proto tcp# Menghapus aturan yang sudah tidak digunakansudo ufw delete allow 80/tcp
5. 🟡 Manajemen Environment Variables & Secret di Server
Konsep
Jangan pernah menyimpan credential sensitif (seperti token API pihak ketiga, secret key enkripsi, atau kata sandi database) secara hardcoded di dalam file repository Git publik. Di server Ubuntu, simpan environment variables di tempat yang terisolasi.
Tingkatan Environment Variables di Linux
System-Wide Persisten (/etc/environment):
Berlaku global untuk seluruh user di sistem.
Format pasangan murni: KEY="VALUE" (tanpa perintah export).
User Profile Persisten (~/.bashrc):
Hanya dieksekusi saat user terkait login ke sesi shell interaktif.
Menggunakan format: export KEY="value".
Application-Specific (.env terisolasi):
Pendekatan terbaik untuk web app: diletakkan di direktori kerja aplikasi dan dibaca oleh Systemd service via opsi EnvironmentFile=/var/www/my-app/.env.
# Praktik Keamanan: Pastikan berkas .env aplikasi HANYA bisa dibaca oleh pemiliknyachmod 600 /var/www/my-app/.envchown www-data:www-data /var/www/my-app/.env
6. 🔴 SSH Server Hardening & Anti-Lockout Strategy
Konsep
Setelah Anda berhasil memasang SSH Public Key dan mengujinya, saatnya mengunci pintu server secara permanen dengan mematikan login user root dan menonaktifkan otentikasi kata sandi.
Prosedur Hardening /etc/ssh/sshd_config
Buka file konfigurasi SSH daemon:
sudo nano /etc/ssh/sshd_config
Sesuaikan direktif berikut:
# 1. Larang superuser 'root' login langsung via SSHPermitRootLogin no# 2. Matikan total login berbasis kata sandi (Wajib punya SSH Key!)PasswordAuthentication no# 3. Matikan autentikasi kosongPermitEmptyPasswords no# 4. Batasi percobaan autentikasi maksimalMaxAuthTries 3# 5. Nonaktifkan forwarding grafis yang tidak terpakaiX11Forwarding no# 6. (Opsional tapi direkomendasikan) Batasi hanya user tertentu yang boleh loginAllowUsers deployer
Strategi Anti-Lockout (PENTING!)
CAUTION
JANGAN PERNAH MENUTUP TERMINAL SSH LAMA ANDA SEBELUM MENGUJI!
Jika Anda salah mengetik konfigurasi SSH dan langsung keluar, Anda berisiko terkunci dari server selamanya.
Buka jendela terminal baru di laptop Anda, lalu coba login:
ssh -i ~/.ssh/id_ed25519 deployer@IP_SERVER_ANDA
Jika jendela baru berhasil login tanpa meminta kata sandi, konfigurasi aman dan Anda boleh menutup terminal lama.
7. 🔴 Proteksi Serangan Brute-Force dengan Fail2ban
Konsep
Meskipun Anda sudah mematikan login password, bot scanner internet akan terus membombardir port SSH Anda ribuan kali per hari, menghabiskan bandwidth dan mencemari file log sistem.
Fail2ban adalah daemon yang bertugas membaca log sistem (seperti /var/log/auth.log) secara real-time. Jika sebuah IP gagal login beberapa kali dalam kurun waktu tertentu, Fail2ban akan otomatis menulis aturan blokir IP tersebut ke dalam firewall UFW/iptables untuk jangka waktu tertentu.
[DEFAULT]# Waktu durasi IP diblokir (misal: 1 jam / 3600 detik atau 1 hari / 86400 detik)bantime = 1d# Jendela waktu pemantauan kegagalan (10 menit)findtime = 10m# Batas toleransi percobaan gagal sebelum di-banmaxretry = 3# Jangan pernah memblokir IP lokal dan IP kantor Anda sendiriignoreip = 127.0.0.1/8 ::1[sshd]enabled = trueport = 22mode = aggressive
Mengaktifkan Layanan & Memeriksa Status Ban
# Jalankan dan aktifkan fail2ban servicesudo systemctl enable --now fail2ban# Memeriksa status pengawasan jail SSHsudo fail2ban-client status sshd
Contoh Output Saat Penyerang Tertangkap:
Status for the jail: sshd|- Filter| |- Currently failed: 2| |- Total failed: 45`- Actions |- Currently banned: 3 |- Total banned: 12 `- Banned IP list: 185.220.101.5 194.26.29.112 45.154.255.88
Jika Anda tidak sengaja memblokir IP Anda sendiri, lepaskan blokir (unban) dengan perintah:
sudo fail2ban-client set sshd unbanip ALAMAT_IP_ANDA
8. 🛠️ Mini Project: Zero-to-Hero VPS Production Hardening
Tujuan
Mempraktikkan seluruh rangkaian prosedur pengamanan server VPS Ubuntu baru (checklist checklist hardening) agar siap menjadi host server web yang aman.
Langkah demi Langkah Eksekusi
Alur Eksekusi VPS Production Hardening 1. Login Root Awal & Update Sistem (apt update && upgrade) │ ▼ 2. Buat User Dedicated Non-Root (adduser deployer & usermod -aG sudo) │ ▼ 3. Daftarkan SSH Keypair Ed25519 ke User Baru (~/.ssh/authorized_keys) │ ▼ 4. Nyalakan UFW Firewall (Deny Default, Allow 22, 80, 443) │ ▼ 5. Kunci SSH Daemon (PermitRootLogin no, PasswordAuthentication no) │ ▼ 6. Pasang & Aktifkan Fail2ban (Auto-ban Brute-Force Bot) │ ▼ 7. Uji Koneksi dari Terminal Baru (Anti-Lockout Validation) ✅
Langkah 1: Buat User Baru Non-Root dengan Hak Sudo
# Tambahkan user baru khusus deploymentsudo adduser deployer# Berikan hak sudo administratifsudo usermod -aG sudo deployer
Langkah 2: Salin SSH Key ke User Baru
# Beralih ke user deployersudo -u deployer mkdir -p /home/deployer/.sshsudo -u deployer chmod 700 /home/deployer/.ssh# Salin public key Anda ke authorized_keys deployersudo cp /root/.ssh/authorized_keys /home/deployer/.ssh/sudo chown deployer:deployer /home/deployer/.ssh/authorized_keyssudo chmod 600 /home/deployer/.ssh/authorized_keys
Dari komputer lokal Anda, lakukan login menggunakan user baru:
ssh deployer@IP_SERVER_ANDA
Jika berhasil masuk dengan SSH key tanpa ditanya password, dan user root ditolak, selamat! Server Ubuntu produksi Anda telah berhasil diamankan sesuai standar industri.
9. 📚 Ringkasan & Peta Ingatan
Peta Ingatan Konsep
Linux Networking & Hardening├── Inspeksi Jaringan│ ├── ip a → Cek alokasi IP & interface│ └── ss -tulpn → Daftar port listening aktif├── Otentikasi SSH Key│ ├── ssh-keygen → Buat pair Ed25519 di client│ └── authorized_keys → Public key di server (600/700)├── Hardening SSH Daemon│ ├── PermitRootLogin no│ └── PasswordAuth no├── Firewall (UFW)│ ├── default deny → Blokir semua port masuk│ └── allow 22, 80, 443 → Hanya buka port layanan web├── Intrusion Prevention│ └── Fail2ban → Auto ban IP penyerang via auth.log└── File Transfer └── rsync -avzP → Sinkronisasi delta hemat bandwidth
Cheat Code 10 Detik
ss -tulpn → periksa port mana saja yang terbukaufw status → lihat status aturan firewall aktifufw allow 22/tcp → buka akses port SSHfail2ban-client status sshd → cek daftar IP hacker yang ter-banrsync -avzP ./dist/ user@ip:/ → sinkronisasi deployment cepatsudo sshd -t → tes keabsahan syntax SSH sebelum reload
10. 🧭 Urutan Belajar Berikutnya
Lanjut ke Modul 4:Linux Bash Scripting untuk DevOps untuk mempelajari penulisan script otomasi server defensif, backup otomatis, dan monitoring kesehatan sistem.
Kombinasikan dengan NGINX: Pasang sertifikat SSL gratis Let’s Encrypt / Certbot pada port 80 dan 443 yang telah dibuka via panduan NGINX Security & SSL.
Kombinasikan dengan Git: Bangun alur push deployment otomatis menggunakan SSH key dengan panduan Git Workflow & Kolaborasi.