📋 Progress Modul
Linux dikenal lebih aman dari Windows secara default — tapi "lebih aman secara default" bukan berarti "aman tanpa konfigurasi". Instalasi Linux baru, terutama di VPS atau server yang terekspos ke internet, membutuhkan hardening aktif: firewall yang tepat, SSH yang dikunci, dan sistem monitoring yang memperingatkan Anda sebelum masalah berkembang.
Modul ini ditujukan untuk pengguna Linux yang mengelola server (VPS, cloud, home server) atau desktop Linux yang terhubung ke internet. Semua perintah diuji di Ubuntu 22.04/24.04 dan Debian 12 — sebagian besar perintah berlaku pula di distribusi turunannya.
⚠️ Perhatian untuk pengguna server: Beberapa langkah di modul ini — terutama konfigurasi SSH (Langkah 3) — bisa membuat Anda terkunci dari server jika dilakukan tanpa hati-hati. Selalu buka dua sesi SSH sebelum memodifikasi konfigurasi SSH sehingga sesi cadangan bisa digunakan jika terjadi kesalahan. Idealnya, lakukan perubahan saat konsol fisik tersedia.
🛠️ Yang dibutuhkan: Sistem Linux (Ubuntu/Debian direkomendasikan) · Akses terminal dengan hak sudo · Koneksi internet · ~3 jam
Update Sistem dan Aktifkan Pembaruan Otomatis
Mayoritas serangan berhasil bukan karena teknik canggih, tapi karena sistem yang tidak dipatch. Kerentanan yang sudah dipublikasikan dan memiliki patch tersedia adalah sasaran mudah bagi penyerang. Update rutin adalah langkah hardening yang paling efektif per menit yang diinvestasikan.
Update Sistem Sekarang
# Update daftar paket dan upgrade semua paket sudo apt update && sudo apt upgrade -y # Upgrade distribusi (jika ada versi baru Ubuntu/Debian) sudo apt dist-upgrade -y # Hapus paket yang tidak lagi diperlukan sudo apt autoremove --purge -y sudo apt clean
Aktifkan Pembaruan Keamanan Otomatis
# Pasang paket unattended-upgrades sudo apt install unattended-upgrades -y # Aktifkan dan konfigurasi sudo dpkg-reconfigure --priority=low unattended-upgrades # Pilih "Yes" ketika ditanya
Konfigurasi unattended-upgrades
// Aktifkan hanya update keamanan otomatis Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; }; // Hapus paket yang tidak diperlukan setelah update Unattended-Upgrade::Remove-Unused-Dependencies "true"; // Reboot otomatis jika dibutuhkan (kernel update) // Hati-hati aktifkan ini di server produksi Unattended-Upgrade::Automatic-Reboot "false";
💡 Untuk server produksi: Nonaktifkan reboot otomatis (Automatic-Reboot "false") dan buat jadwal maintenance window rutin untuk reboot manual setelah kernel update. Cek kebutuhan reboot dengan perintah: ls /var/run/reboot-required 2>/dev/null && echo "REBOOT NEEDED"
- Sistem sudah di-update ke versi terbaru (
apt update && apt upgrade) - unattended-upgrades sudah dipasang dan diaktifkan
- Tidak ada paket usang atau tidak diperlukan yang tersisa
Konfigurasi Firewall dengan UFW
UFW (Uncomplicated Firewall) adalah frontend untuk iptables yang jauh lebih mudah dikonfigurasi. Prinsip firewall yang baik: default deny — blokir semua traffic masuk, lalu buka hanya port yang benar-benar dibutuhkan.
Setup UFW Dasar
# Pasang UFW jika belum ada sudo apt install ufw -y # Aturan default: blokir semua masuk, izinkan semua keluar sudo ufw default deny incoming sudo ufw default allow outgoing # Izinkan SSH (WAJIB sebelum aktifkan UFW di server remote!) sudo ufw allow ssh # Atau jika SSH di port custom (misalnya 2222): sudo ufw allow 2222/tcp # Aktifkan UFW sudo ufw enable # Cek status sudo ufw status verbose
Aturan UFW untuk Layanan Umum
| Perintah UFW | Port | Keterangan |
|---|---|---|
| ufw allow 80/tcp | 80 | HTTP web server |
| ufw allow 443/tcp | 443 | HTTPS web server |
| ufw allow 25/tcp | 25 | SMTP (mail server masuk) |
| ufw allow 587/tcp | 587 | SMTP submission (mail keluar) |
| ufw allow from 10.0.0.0/24 | semua | Izinkan semua dari subnet lokal |
| ufw deny from 1.2.3.4 | semua | Blokir IP spesifik |
Hapus Aturan UFW
# Lihat aturan dengan nomor sudo ufw status numbered # Hapus aturan berdasarkan nomor sudo ufw delete 3 # Atau hapus berdasarkan aturan eksplisit sudo ufw delete allow 80/tcp
- UFW sudah aktif dengan aturan default deny incoming
- SSH sudah diizinkan sebelum UFW diaktifkan (tidak terkunci dari server)
- Hanya port yang benar-benar diperlukan yang dibuka
sudo ufw status verbosemenampilkan aturan yang diinginkan
Hardening SSH: Key-Only, Nonaktifkan Root
Login SSH dengan password adalah target utama serangan brute force. Setiap server Linux yang terekspos ke internet menerima ribuan upaya login setiap harinya dari bot otomatis. Solusinya: nonaktifkan autentikasi password, gunakan hanya SSH key pair.
🚨 BACA SEBELUM MELANJUTKAN: Buka dua sesi SSH sebelum mengubah konfigurasi SSH. Jika konfigurasi salah dan sesi pertama terputus, sesi kedua masih terbuka untuk memperbaikinya. Jangan tutup sesi SSH sampai semua konfigurasi terverifikasi berfungsi.
Langkah 1: Buat SSH Key Pair (di komputer lokal Anda)
# Buat SSH key pair dengan ED25519 (lebih kuat dari RSA) ssh-keygen -t ed25519 -C "[email protected]" # Saat ditanya lokasi: tekan Enter untuk default (~/.ssh/id_ed25519) # Saat ditanya passphrase: ISI passphrase yang kuat (WAJIB!) # Passphrase melindungi private key jika file dicuri
Langkah 2: Salin Public Key ke Server
# Salin public key ke server (ganti user dan IP) ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip # Jika ssh-copy-id tidak tersedia, cara manual: cat ~/.ssh/id_ed25519.pub | ssh user@server-ip \ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" # Test login dengan key (SEBELUM menonaktifkan password auth!) ssh -i ~/.ssh/id_ed25519 user@server-ip
Langkah 3: Hardening sshd_config
# Nonaktifkan login root via SSH PermitRootLogin no # Nonaktifkan autentikasi password (hanya izinkan key) PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no # Nonaktifkan forwarding X11 (tidak diperlukan untuk server) X11Forwarding no # Batasi percobaan autentikasi MaxAuthTries 3 # Timeout koneksi yang tidak aktif ClientAliveInterval 300 ClientAliveCountMax 2 # Izinkan hanya user tertentu (opsional — ganti "namauser") AllowUsers namauser # Ganti port SSH (opsional — obscurity bukan keamanan, tapi mengurangi noise log) # Jika mengubah port, update juga aturan UFW! Port 2222
# Validasi konfigurasi sebelum restart sudo sshd -t # Harus tidak ada output error. Jika ada error, perbaiki dulu sebelum lanjut. # Restart SSH service sudo systemctl restart ssh # Verifikasi SSH masih berjalan sudo systemctl status ssh
✅ Test dari terminal baru sebelum menutup sesi: Buka terminal baru → coba SSH ke server dengan perintah ssh -i ~/.ssh/id_ed25519 user@server-ip. Jika berhasil login dengan key, konfigurasi sudah benar. Coba juga login dengan password — harus ditolak jika PasswordAuthentication berhasil dinonaktifkan.
- SSH key pair sudah dibuat dengan ED25519 dan passphrase
- Public key sudah disalin ke server dan login via key berhasil diverifikasi
- PermitRootLogin no dan PasswordAuthentication no sudah aktif
- Login dengan password sudah dicoba dan ditolak (verifikasi bahwa password auth nonaktif)
- Private key disimpan aman dan di-backup (Bitwarden atau lokasi terenkripsi lainnya)
Pasang dan Konfigurasi fail2ban
Meskipun password SSH sudah dinonaktifkan, fail2ban tetap berguna sebagai lapisan pertahanan tambahan — memblokir IP yang melakukan scan port atau percobaan autentikasi berulang ke layanan lain (web server, mail, FTP). fail2ban memantau log dan secara otomatis memblokir IP dengan aktivitas mencurigakan menggunakan iptables.
Instalasi fail2ban
sudo apt install fail2ban -y sudo systemctl enable fail2ban sudo systemctl start fail2ban
Konfigurasi Kustom (jail.local)
Jangan edit jail.conf langsung — buat jail.local yang akan override pengaturan default:
[DEFAULT] # Waktu ban (detik) — 1 jam = 3600 bantime = 3600 # Jendela waktu untuk menghitung percobaan (10 menit) findtime = 600 # Maksimum percobaan gagal sebelum diblokir maxretry = 5 # Backend log (auto biasanya sudah tepat) backend = auto # Email notifikasi (opsional — isi dengan email Anda) destemail = [email protected] sendername = fail2ban action = %(action_)s [sshd] enabled = true port = ssh # Jika menggunakan port SSH kustom: # port = 2222 maxretry = 3 # Ban lebih lama untuk SSH (24 jam) bantime = 86400 [nginx-http-auth] # Aktifkan jika menggunakan Nginx dengan basic auth enabled = false
Perintah fail2ban yang Berguna
# Restart fail2ban setelah perubahan konfigurasi sudo systemctl restart fail2ban # Lihat status semua jail sudo fail2ban-client status # Lihat IP yang sedang diblokir di jail sshd sudo fail2ban-client status sshd # Unban IP secara manual (jika Anda tidak sengaja terblokir) sudo fail2ban-client set sshd unbanip 1.2.3.4 # Whitelist IP agar tidak pernah diblokir (tambahkan ke jail.local) # ignoreip = 127.0.0.1/8 ::1 IP-LOKAL-ANDA
- fail2ban sudah terpasang dan berjalan (
systemctl status fail2ban) - jail.local sudah dibuat dengan konfigurasi sshd aktif
- IP lokal/admin sudah ditambahkan ke ignoreip agar tidak ter-ban
sudo fail2ban-client status sshdmenampilkan jail aktif
Manajemen User dan Sudo yang Aman
Prinsip least privilege: setiap user hanya memiliki akses yang benar-benar diperlukan untuk tugasnya. Tidak ada user yang beroperasi sebagai root untuk kegiatan sehari-hari. Root hanya digunakan melalui sudo dan hanya ketika benar-benar diperlukan.
Buat User Non-Root untuk Operasi Harian
# Buat user baru (ganti "namauser") sudo adduser namauser # Tambahkan ke grup sudo sudo usermod -aG sudo namauser # Verifikasi user ada di grup sudo groups namauser
Audit User yang Ada di Sistem
# Lihat semua user yang bisa login (shell /bin/bash atau /bin/sh) grep -E '/bin/(bash|sh|zsh|fish)' /etc/passwd | cut -d: -f1,3,7 # Lihat user yang ada di grup sudo getent group sudo # Lihat user yang pernah login terakhir lastlog | grep -v "Never logged in" # Kunci akun user yang tidak diperlukan (jangan hapus, kunci saja) sudo passwd -l namauser-tidak-aktif
Konfigurasi sudo yang Lebih Aman
sudo visudo # Tambahkan di bagian bawah untuk mewajibkan password setiap kali sudo # (hapus baris yang membuat sudo tidak butuh password) Defaults timestamp_timeout=5 # sudo timeout 5 menit Defaults requiretty # sudo hanya dari terminal nyata Defaults logfile="/var/log/sudo.log" # Log semua perintah sudo
- Tidak ada operasi harian yang dilakukan sebagai root langsung
- Semua user aktif di sistem sudah diaudit — user tidak dikenal sudah dikunci
- Hanya user yang diperlukan yang ada di grup sudo
- Logging sudo sudah dikonfigurasi
Monitoring Log Sistem
Log adalah rekaman aktivitas sistem — berfungsi sebagai sistem alarm dini untuk mendeteksi anomali, percobaan intrusi, dan masalah konfigurasi sebelum berkembang menjadi insiden besar.
Lokasi Log Penting
| File / Perintah | Isi |
|---|---|
| /var/log/auth.log | Login SSH, sudo, autentikasi sistem (Ubuntu/Debian) |
| /var/log/secure | Sama seperti auth.log (Fedora/RHEL/CentOS) |
| /var/log/syslog | Pesan sistem umum |
| /var/log/fail2ban.log | Aktivitas fail2ban — IP yang diblokir |
| /var/log/ufw.log | Traffic yang diblokir firewall UFW |
| /var/log/sudo.log | Semua perintah sudo (jika dikonfigurasi di Langkah 5) |
Perintah Monitoring yang Berguna
# Lihat upaya login gagal SSH sudo grep "Failed password\|Invalid user" /var/log/auth.log | tail -20 # Lihat login berhasil sudo grep "Accepted" /var/log/auth.log | tail -20 # Lihat semua login terakhir (sukses) last -n 20 # Lihat upaya login gagal sudo lastb | head -20 # Monitor log secara real-time sudo journalctl -f -u ssh # Cek log systemd (semua layanan) sudo journalctl --since "1 hour ago" -p err # Rangkuman IP yang paling banyak gagal login sudo grep "Invalid user" /var/log/auth.log \ | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
Konfigurasi Log Retention
[Journal] # Simpan log maksimal 2 minggu atau 500MB MaxRetentionSec=2weeks SystemMaxUse=500M
sudo systemctl restart systemd-journald- Saya mengetahui lokasi log auth, syslog, fail2ban, dan UFW
- Saya sudah menjalankan
lastbdan memeriksa upaya login gagal - Log retention sudah dikonfigurasi agar tidak memenuhi disk
Hardening Tambahan: Kernel dan Protokol
Beberapa parameter kernel Linux secara default dikonfigurasi untuk kompatibilitas maksimal, bukan keamanan maksimal. Penyesuaian via sysctl bisa menonaktifkan fitur yang tidak diperlukan dan mempersulit berbagai jenis serangan jaringan.
Hardening Kernel via sysctl
# ===== PROTEKSI JARINGAN ===== # Cegah IP spoofing net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # Nonaktifkan ICMP redirect (cegah MITM) net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 # Nonaktifkan source routing net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 # Aktifkan SYN cookies (proteksi SYN flood) net.ipv4.tcp_syncookies = 1 # ===== PROTEKSI KERNEL ===== # Nonaktifkan magic SysRq kernel.sysrq = 0 # Batasi akses ke kernel log bagi non-root kernel.dmesg_restrict = 1 # Nonaktifkan core dumps fs.suid_dumpable = 0 # Amankan /proc (sembunyikan proses user lain) kernel.perf_event_paranoid = 3
sudo sysctl --system # atau spesifik file: sudo sysctl -p /etc/sysctl.d/99-hardening.conf
Nonaktifkan Protokol dan Modul yang Tidak Diperlukan
# Nonaktifkan protokol jaringan yang jarang digunakan # (bisa digunakan untuk eksploitasi) install dccp /bin/false install sctp /bin/false install rds /bin/false install tipc /bin/false # Nonaktifkan USB storage (untuk server headless yang tidak perlu) # HATI-HATI: nonaktifkan hanya di server, bukan desktop # install usb-storage /bin/false
- File /etc/sysctl.d/99-hardening.conf sudah dibuat dan diterapkan
- Protokol jaringan tidak digunakan sudah di-blacklist
sudo sysctl -ptidak menampilkan error
Audit Paket dan Proses Aktif
Setiap paket yang terpasang dan setiap port yang terbuka adalah potensi vektor serangan. Prinsipnya sederhana: jika tidak digunakan, hapus. Jika terbuka tanpa alasan, tutup.
Audit Port yang Terbuka
# Lihat semua port yang mendengarkan (listening) beserta prosesnya sudo ss -tlnup # t=TCP, l=listening, n=numeric, u=UDP, p=process # Alternatif dengan netstat sudo netstat -tlnup # Cek proses mana yang membuka port tertentu (misal port 80) sudo fuser -n tcp 80
Tinjau output dan pertanyakan setiap port yang terbuka: "Apakah saya memang butuh layanan ini?". Layanan umum yang sering tidak diperlukan di server minimal: Avahi (port 5353), Samba (445), cups printer (631), rpcbind (111).
Nonaktifkan Layanan yang Tidak Diperlukan
# Lihat semua service yang berjalan sudo systemctl list-units --type=service --state=running # Hentikan dan nonaktifkan service yang tidak diperlukan (contoh: avahi) sudo systemctl stop avahi-daemon sudo systemctl disable avahi-daemon # Hapus paket yang tidak diperlukan sepenuhnya sudo apt purge avahi-daemon cups -y sudo apt autoremove --purge -y
Cek File dengan SUID/SGID yang Tidak Wajar
# Temukan semua file dengan SUID bit (bisa eskalasi privilege) sudo find / -perm /4000 -type f 2>/dev/null | sort # Temukan semua file yang ditulis oleh semua user (world-writable) sudo find / -perm -0002 -type f -not -path "/proc/*" 2>/dev/null
File dengan SUID bit yang wajar: /usr/bin/passwd, /usr/bin/sudo, /usr/bin/su, /bin/ping. File SUID yang tidak Anda kenal atau tidak ada di paket standar perlu diinvestigasi.
- Semua port yang terbuka sudah diaudit dengan
ss -tlnup - Layanan yang tidak diperlukan sudah dihentikan dan dinonaktifkan
- Daftar file SUID sudah diperiksa — tidak ada yang mencurigakan
Backup Terenkripsi dengan restic
Semua hardening yang sudah dilakukan tidak berarti jika satu ransomware atau hardware failure bisa menghapus semua data Anda. Backup terenkripsi yang diuji secara rutin adalah jaring pengaman terakhir. restic adalah tool backup modern yang mendukung enkripsi AES-256 secara bawaan.
Instalasi restic
# Ubuntu/Debian sudo apt install restic -y # Atau unduh binary terbaru langsung dari GitHub untuk versi terkini restic version
Setup Backup Repository
# Inisialisasi repository backup (ganti path sesuai tujuan) # Bisa ke disk lokal, NAS, atau cloud (B2, S3, SFTP, dll.) restic init --repo /backup/restic-repo # Masukkan password repository — simpan di Bitwarden! # Jalankan backup pertama restic -r /backup/restic-repo backup /home /etc /var/www # Lihat snapshot yang tersimpan restic -r /backup/restic-repo snapshots # Test restore (wajib! backup yang tidak diuji = tidak ada backup) restic -r /backup/restic-repo restore latest --target /tmp/restore-test
Otomatisasi Backup dengan Cron
sudo crontab -e # Tambahkan baris ini untuk backup setiap hari pukul 02:00 0 2 * * * RESTIC_PASSWORD='password-repo-anda' restic -r /backup/restic-repo backup /home /etc >> /var/log/restic-backup.log 2>&1 # Bersihkan snapshot lama otomatis (simpan 7 harian, 4 mingguan, 3 bulanan) 0 3 * * 0 RESTIC_PASSWORD='password-repo-anda' restic -r /backup/restic-repo forget --keep-daily 7 --keep-weekly 4 --keep-monthly 3 --prune
⚠️ Simpan password restic dengan aman. Jika password repository restic hilang, backup tidak bisa didekripsi. Simpan di Bitwarden atau tuliskan di lokasi fisik yang aman. Juga, simpan backup di minimal dua lokasi berbeda (aturan 3-2-1: 3 salinan, 2 media berbeda, 1 offsite).
- restic sudah terpasang dan repository sudah diinisialisasi
- Password repository disimpan di Bitwarden
- Test restore sudah dilakukan dan berhasil
- Backup otomatis via cron sudah dikonfigurasi
Checklist Audit Keamanan Berkala
Keamanan Linux bukan kondisi statis — sistem baru diinstal, layanan baru ditambahkan, kerentanan baru ditemukan. Checklist audit berkala memastikan postur keamanan yang sudah dibangun tidak terdegradasi seiring waktu.
Script Audit Cepat
Simpan script ini sebagai /usr/local/bin/security-audit.sh dan jalankan setiap bulan:
#!/bin/bash echo "===== SECURITY AUDIT: $(date) =====" echo "\n[1] Pembaruan tersedia:" apt list --upgradable 2>/dev/null | grep -c upgradable echo "\n[2] Port terbuka:" ss -tlnup | grep LISTEN echo "\n[3] User di grup sudo:" getent group sudo echo "\n[4] Login gagal (24 jam terakhir):" grep "Failed password" /var/log/auth.log | grep "$(date '+%b %e')" | wc -l echo "\n[5] Status fail2ban:" fail2ban-client status sshd 2>/dev/null | grep "Banned IP" echo "\n[6] Status UFW:" ufw status | head -5 echo "\n[7] Reboot diperlukan?" [ -f /var/run/reboot-required ] && echo "YA - perlu reboot" || echo "Tidak" echo "\n[8] Snapshot backup terakhir:" restic -r /backup/restic-repo snapshots 2>/dev/null | tail -3 echo "\n===== SELESAI ====="
sudo chmod +x /usr/local/bin/security-audit.sh sudo security-audit.sh
🎉 Selamat menyelesaikan Modul 09 — dan seluruh rangkaian modul ZONAUTARA Keamanan Digital! Sistem Linux Anda kini memiliki firewall aktif, SSH yang dikunci dengan key-only auth, fail2ban yang memblokir brute force, user management yang tepat, monitoring log, hardening kernel, dan backup terenkripsi otomatis.
- Script audit sudah dibuat dan dijalankan setidaknya sekali
- Jadwal menjalankan audit bulanan sudah dibuat di kalender
- Semua 9 langkah sebelumnya sudah diverifikasi via script audit
🏆 Anda telah menyelesaikan semua 9 Modul ZONAUTARA Keamanan Digital.
Dari password manager (01) hingga hardening Linux (09), Anda kini memiliki postur keamanan digital yang komprehensif: identitas terlindungi, komunikasi terenkripsi, perangkat diaudit, dan sistem Linux yang diperkeras. Bagikan platform ini ke orang-orang yang Anda pedulikan.
Kembali ke Daftar Semua Modul
Tinjau kembali modul yang pernah Anda selesaikan, atau rekomendasikan modul tertentu ke teman dan keluarga berdasarkan kebutuhan mereka.
← Lihat Semua Modul