Linux adalah sistem operasi paling populer di dunia untuk server, cloud computing, dan perangkat Internet of Things (IoT). Dari Raspberry Pi hingga cluster server enterprise, Linux menjadi fondasi yang menggerakkan sebagian besar infrastruktur digital. Namun, popularitas ini juga menjadikan Linux target utama bagi penyerang siber. Artikel ini akan membahas secara komprehensif berbagai teknik hardening dan keamanan Linux yang wajib dikuasai oleh setiap administrator sistem dan pengembang IoT.
Panduan ini cocok untuk administrator server, pengembang IoT, DevOps engineer, dan siapa saja yang mengelola sistem Linux — baik di lingkungan cloud (AWS, GCP, Azure), on-premise, maupun perangkat embedded seperti Raspberry Pi dan ESP32 gateway. Tidak perlu pengalaman keamanan sebelumnya, cukup pahami dasar command-line Linux.
1. Manajemen User dan Group
Manajemen user yang baik adalah fondasi keamanan Linux. Setiap user harus memiliki akses minimal
yang diperlukan untuk menjalankan tugasnya (prinsip least privilege). Hindari penggunaan
akun root untuk aktivitas sehari-hari — gunakan sudo untuk eskalasi
hak akses sementara.
Membuat dan Mengelola User
Berikut adalah perintah-perintah dasar untuk mengelola user di sistem Linux:
# ============================================
# Manajemen User Linux — Best Practices
# ============================================
# Membuat user baru dengan home directory dan shell
sudo useradd -m -s /bin/bash -c "IoT Engineer" iotdev
# Mengatur password yang kuat
sudo passwd iotdev
# Pastikan password minimal 12 karakter dengan kombinasi huruf, angka, simbol
# Membuat group untuk proyek IoT
sudo groupadd iot-team
# Menambahkan user ke group
sudo usermod -aG iot-team iotdev
sudo usermod -aG sudo iotdev # Berikan akses sudo jika diperlukan
# Melihat informasi user
id iotdev # UID, GID, dan group membership
groups iotdev # Daftar group
whoami # User yang sedang aktif
# Melihat semua user di sistem
cat /etc/passwd | grep -v nologin # Filter user dengan shell aktif
# Menonaktifkan user tanpa menghapus (lock account)
sudo usermod -L iotdev # Lock
sudo usermod -U iotdev # Unlock
# Menghapus user dan home directory
sudo userdel -r username_unused
# Mengatur kebijakan password (edit /etc/login.defs)
# PASS_MAX_DAYS 90 # Ganti password maksimal 90 hari
# PASS_MIN_DAYS 7 # Minimal 7 hari antara pergantian
# PASS_MIN_LEN 12 # Panjang minimal 12 karakter
# PASS_WARN_AGE 14 # Peringatan 14 hari sebelum expired
Konfigurasi Sudo yang Aman
File /etc/sudoers mengatur siapa yang bisa menjalankan perintah dengan hak root.
Selalu edit menggunakan visudo untuk mencegah kesalahan sintaks yang bisa
mengunci akses root.
# Edit sudoers dengan aman (syntax check otomatis)
sudo visudo
# Tambahkan baris berikut di akhir file:
# Izinkan user iotdev menjalankan systemctl tanpa password
iotdev ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart mosquitto
iotdev ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *
# Atau berikan akses sudo penuh dengan password (lebih aman)
iotdev ALL=(ALL:ALL) ALL
# Grup %sudo sudah memiliki akses sudo penuh di Debian/Ubuntu
# Pastikan user ditambahkan ke grup sudo:
sudo usermod -aG sudo iotdev
# Membatasi user agar hanya bisa menjalankan perintah tertentu
# Contoh: user monitoring hanya boleh cek service
monitoring ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *
monitoring ALL=(ALL) NOPASSWD: /usr/bin/journalctl *
monitoring ALL=(ALL) NOPASSWD: /usr/bin/df, /usr/bin/free
Jangan pernah mengaktifkan login root langsung, baik melalui SSH maupun console.
Gunakan user biasa dengan sudo. Jika root login diperlukan untuk troubleshooting,
gunakan sudo -i atau sudo su - sesaat, lalu keluar setelah selesai.
Di server production, pertimbangkan untuk menonaktifkan akun root sepenuhnya dengan
sudo passwd -l root.
2. File Permissions dan Ownership
Setiap file dan direktori di Linux memiliki tiga set permission: owner (pemilik), group (kelompok), dan others (orang lain). Memahami dan mengkonfigurasi permission dengan benar sangat krusial untuk mencegah akses tidak sah ke file sensitif seperti kunci SSH, konfigurasi database, dan file environment.
Memahami Sistem Octal Permission
| Octal | Binary | Permission | Deskripsi |
|---|---|---|---|
| 0 | 000 | --- |
Tidak ada akses |
| 1 | 001 | --x |
Execute saja |
| 2 | 010 | -w- |
Write saja |
| 4 | 100 | r-- |
Read saja |
| 6 | 110 | rw- |
Read + Write |
| 7 | 111 | rwx |
Read + Write + Execute |
# ============================================
# File Permissions — Best Practices
# ============================================
# Melihat permission file (format long)
ls -la /etc/ssh/sshd_config
# -rw------- 1 root root 3525 Jun 25 08:00 /etc/ssh/sshd_config
# Mengubah permission dengan chmod (octal)
chmod 600 ~/.ssh/id_rsa # Hanya owner yang bisa baca/tulis (private key)
chmod 644 ~/.ssh/id_rsa.pub # Owner r+w, others hanya baca (public key)
chmod 700 ~/.ssh # Hanya owner yang bisa akses direktori .ssh
chmod 600 ~/.ssh/authorized_keys # Hanya owner yang bisa baca/tulis
# Mengubah ownership dengan chown
sudo chown iotdev:iotdev /home/iotdev/.ssh/*
sudo chown root:root /etc/ssh/sshd_config
# Permission yang aman untuk file sensitif
chmod 600 /etc/shadow # Password hashes — hanya root
chmod 644 /etc/passwd # Info user — semua bisa baca
chmod 600 /etc/gshadow # Group password — hanya root
chmod 700 /root # Home directory root
# Permission untuk direktori web server
chmod 755 /var/www/html # Direktori: owner rwx, others rx
chmod 644 /var/www/html/* # File: owner rw, others r
# Sticky bit — mencegah user lain menghapus file di shared directory
chmod 1777 /tmp # Semua bisa tulis, tapi hanya owner yang hapus
# SetGID — file baru di direktori mewarisi group parent
chmod 2775 /var/www/shared # File baru otomatis milik group yang sama
# Menggunakan umask untuk default permission
# Tambahkan di ~/.bashrc atau /etc/profile
umask 027 # Default: file 640, directory 750 (lebih aman)
# umask 022 # Default: file 644, directory 755 (standar)
# umask 077 # Default: file 600, directory 700 (paling ketat)
Memberikan permission 777 (read-write-execute untuk semua) adalah kesalahan
keamanan yang sangat sering terjadi. Permission ini memungkinkan siapa saja di sistem
untuk membaca, mengubah, dan mengeksekusi file. Jika ada error permission, diagnosa
masalah sebenarnya — biasanya cukup dengan mengubah ownership atau menambahkan user
ke group yang tepat, bukan membuka akses untuk semua.
Special Permissions: SUID, SGID, dan Sticky Bit
# ============================================
# Audit SUID/SGID Files — Security Check
# ============================================
# Mencari semua file SUID (berjalan dengan hak owner)
find / -perm -4000 -type f 2>/dev/null
# Mencari semua file SGID (berjalan dengan hak group)
find / -perm -2000 -type f 2>/dev/null
# SUID files yang normal di Linux:
# /usr/bin/passwd — Ubah password user
# /usr/bin/sudo — Eskalasi privilege
# /usr/bin/su — Switch user
# /usr/bin/newgrp — Switch group
# /usr/bin/chsh — Change shell
# /usr/bin/chfn — Change finger info
# /usr/bin/mount — Mount filesystem
# /usr/bin/umount — Unmount filesystem
# Jika menemukan SUID file yang tidak dikenal, segera investigasi:
# 1. Periksa kapan file tersebut dibuat
ls -la /path/to/suspicious_suid_file
# 2. Periksa hash file untuk melihat apakah sudah dimodifikasi
sha256sum /path/to/suspicious_suid_file
# 3. Hapus SUID bit jika tidak diperlukan
chmod u-s /path/to/suspicious_suid_file
# File dengan capability khusus
getcap -r / 2>/dev/null
# Periksa capability yang mencurigakan seperti cap_setuid, cap_net_raw
3. SSH Hardening
SSH (Secure Shell) adalah pintu utama akses ke server Linux. Mengamankan SSH dengan benar adalah salah satu langkah terpenting dalam hardening server. Konfigurasi default SSH terlalu permisif untuk lingkungan production — kita perlu memperketatnya.
Konfigurasi sshd_config yang Aman
# ============================================
# SSH Hardening — /etc/ssh/sshd_config
# ============================================
# Backup konfigurasi asli
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# Edit konfigurasi SSH
sudo nano /etc/ssh/sshd_config
# --- Port dan Address ---
Port 2222 # Ubah port default (security through obscurity)
ListenAddress 0.0.0.0 # Atau batasi ke IP tertentu: 192.168.1.10
# --- Autentikasi ---
PermitRootLogin no # Nonaktifkan login root
PasswordAuthentication no # Nonaktifkan password, gunakan key saja
PubkeyAuthentication yes # Aktifkan public key authentication
AuthenticationMethods publickey # Hanya public key
MaxAuthTries 3 # Maksimal 3 percobaan autentikasi
LoginGraceTime 30 # Timeout 30 detik untuk autentikasi
# --- Key Algorithm ---
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
PubkeyAcceptedAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# --- Session ---
ClientAliveInterval 300 # Kirim keepalive setiap 5 menit
ClientAliveCountMax 2 # Disconnect setelah 2 keepalive gagal
MaxSessions 3 # Maksimal 3 session per koneksi
MaxStartups 3:50:10 # Rate limit koneksi baru
# --- Restrict Features ---
X11Forwarding no # Nonaktifkan X11 forwarding
AllowTcpForwarding no # Nonaktifkan TCP forwarding
PermitTunnel no # Nonaktifkan tunneling
AllowAgentForwarding no # Nonaktifkan agent forwarding
# --- Allow Specific Users ---
AllowUsers iotdev admin # Hanya user tertentu yang bisa SSH
# Atau gunakan AllowGroups
# AllowGroups ssh-users
# --- Logging ---
LogLevel VERBOSE # Log lebih detail untuk audit
SyslogFacility AUTH
# Verifikasi konfigurasi sebelum restart
sudo sshd -t
# Restart SSH service
sudo systemctl restart sshd
Membuat SSH Key Pair yang Aman
# ============================================
# Generate SSH Key — Ed25519 (Recommended)
# ============================================
# Generate key pair Ed25519 (paling aman dan cepat)
ssh-keygen -t ed25519 -C "iotdev@server-production" -f ~/.ssh/id_ed25519
# Atau RSA 4096-bit jika Ed25519 tidak didukung
ssh-keygen -t rsa -b 4096 -C "iotdev@server-production" -f ~/.ssh/id_rsa
# Copy public key ke server
ssh-copy-id -p 2222 iotdev@192.168.1.10
# Atau manual:
cat ~/.ssh/id_ed25519.pub | ssh iotdev@192.168.1.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Set permission yang benar di server
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
# Test koneksi dengan key
ssh -p 2222 -i ~/.ssh/id_ed25519 iotdev@192.168.1.10
# Nonaktifkan password auth HANYA SETELAH key berfungsi
# sudo nano /etc/ssh/sshd_config
# PasswordAuthentication no
# sudo systemctl restart sshd
Kesalahan paling umum adalah menonaktifkan PasswordAuthentication sebelum
memastikan SSH key sudah terpasang dan berfungsi. Jika key tidak berfungsi dan password
sudah dimatikan, kamu akan terkunci dari server! Selalu test koneksi dengan key terlebih
dahulu, baru nonaktifkan password authentication.
4. Firewall: iptables & ufw
Firewall adalah garis pertahanan pertama yang mengontrol lalu lintas jaringan yang masuk dan keluar dari server. Di Linux, ada dua tools firewall utama: iptables (lebih fleksibel dan powerful) dan ufw (Uncomplicated Firewall, lebih mudah digunakan untuk pemula).
ufw: Firewall yang Mudah Digunakan
# ============================================
# UFW (Uncomplicated Firewall) — Setup Dasar
# ============================================
# Install ufw (jika belum terpasang)
sudo apt update && sudo apt install ufw -y
# Reset ke default (deny incoming, allow outgoing)
sudo ufw reset
# Default policy
sudo ufw default deny incoming # Tolak semua traffic masuk
sudo ufw default allow outgoing # Izinkan semua traffic keluar
# Izinkan layanan yang diperlukan
sudo ufw allow 2222/tcp comment 'SSH (custom port)'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw allow 80/tcp comment 'HTTP (redirect to HTTPS)'
# Izinkan dari subnet tertentu saja
sudo ufw allow from 192.168.1.0/24 to any port 2222 comment 'SSH from LAN only'
# Izinkan layanan IoT
sudo ufw allow from 192.168.10.0/24 to any port 1883 comment 'MQTT from IoT subnet'
sudo ufw allow from 192.168.10.0/24 to any port 8883 comment 'MQTT over TLS'
# Rate limiting untuk SSH (mencegah brute force)
sudo ufw limit 2222/tcp comment 'Rate limit SSH'
# Aktifkan firewall
sudo ufw enable
# Cek status
sudo ufw status verbose
sudo ufw status numbered
# Hapus rule berdasarkan nomor
sudo ufw delete 3
# Logging
sudo ufw logging on # Aktifkan logging
sudo ufw logging high # Log lebih detail
# Log tersedia di:
# /var/log/ufw.log
iptables: Firewall Lanjutan
#!/bin/bash
# ============================================
# Firewall Server Production — iptables
# ============================================
# Flush rules lama
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F
# Default policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Izinkan loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Izinkan koneksi established/related
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Proteksi SYN flood
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# Proteksi port scanning
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-FLAGS ALL ALL -j DROP
# SSH dari subnet tertentu (port custom 2222)
iptables -A INPUT -p tcp --dport 2222 -s 192.168.1.0/24 -j ACCEPT
# HTTPS dan HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# MQTT dari IoT subnet
iptables -A INPUT -p tcp --dport 1883 -s 192.168.10.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 8883 -s 192.168.10.0/24 -j ACCEPT
# ICMP (ping) dengan rate limit
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
# Log paket yang ditolak
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT-DROP: " --log-level 4
# Simpan rules agar persisten
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
# Cek rules aktif
iptables -L -v -n --line-numbers
Untuk server yang membutuhkan konfigurasi cepat dan sederhana, gunakan ufw. Untuk server production dengan kebutuhan kompleks (multiple subnet, NAT, routing rules), gunakan iptables langsung. Keduanya sebenarnya bekerja sama — ufw adalah frontend yang menyederhanakan iptables. Jangan gunakan keduanya secara bersamaan karena bisa menyebabkan konflik rules.
5. Log Monitoring dan Auditing
Log monitoring adalah mata dan telinga administrator keamanan. Tanpa monitoring log yang baik, serangan bisa berlangsung selama berminggu-minggu tanpa terdeteksi. Linux menyediakan beberapa mekanisme logging yang powerful — dari systemd-journald hingga auditd.
journald: Log System Modern
# ============================================
# Log Monitoring — journald & traditional logs
# ============================================
# Melihat log system secara real-time
sudo journalctl -f
# Filter log berdasarkan waktu
sudo journalctl --since "2026-06-25 08:00:00" --until "2026-06-25 12:00:00"
sudo journalctl --since "1 hour ago"
# Filter berdasarkan service
sudo journalctl -u sshd # Log SSH
sudo journalctl -u nginx # Log web server
sudo journalctl -u mosquitto # Log MQTT broker
# Filter berdasarkan priority (emergency=0, debug=7)
sudo journalctl -p err # Hanya error dan lebih kritis
sudo journalctl -p warning # Warning dan lebih kritis
# Melihat login attempts yang gagal
sudo journalctl -u sshd | grep "Failed password"
sudo journalctl -u sshd | grep "Invalid user"
# Log file tradisional
cat /var/log/auth.log # Autentikasi (Debian/Ubuntu)
cat /var/log/secure # Autentikasi (RHEL/CentOS)
cat /var/log/syslog # System log umum
cat /var/log/kern.log # Kernel log
# Mencari IP yang sering gagal login
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# Konfigurasi persistent journald (agar log tersimpan setelah reboot)
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
# Rotasi log — edit /etc/systemd/journald.conf
# SystemMaxUse=500M # Maksimal 500MB untuk journal
# MaxRetentionSec=30day # Simpan log 30 hari
auditd: System Auditing
# ============================================
# auditd — System Audit Daemon
# ============================================
# Install auditd
sudo apt install auditd audispd-plugins -y
# Start dan enable
sudo systemctl enable auditd
sudo systemctl start auditd
# Tambahkan audit rules (edit /etc/audit/rules.d/audit.rules)
sudo nano /etc/audit/rules.d/custom.rules
## /etc/audit/rules.d/custom.rules
# Monitor perubahan pada file autentikasi
-w /etc/passwd -p wa -k identity_change
-w /etc/shadow -p wa -k identity_change
-w /etc/group -p wa -k identity_change
-w /etc/sudoers -p wa -k sudoers_change
-w /etc/sudoers.d/ -p wa -k sudoers_change
# Monitor SSH config
-w /etc/ssh/sshd_config -p wa -k sshd_config_change
# Monitor cron jobs
-w /etc/crontab -p wa -k cron_change
-w /etc/cron.d/ -p wa -k cron_change
-w /var/spool/cron/ -p wa -k cron_change
# Monitor login/logout
-w /var/log/lastlog -p wa -k login_log
-w /var/log/faillog -p wa -k fail_log
# Monitor akses file sensitif
-w /etc/hosts -p wa -k network_change
-w /etc/hostname -p wa -k network_change
-w /etc/resolv.conf -p wa -k network_change
# Monitor command yang dijalankan sebagai root
-a always,exit -F arch=b64 -F euid=0 -S execve -k root_commands
# Monitor perubahan permission file
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -k permission_change
-a always,exit -F arch=b64 -S chown,fchown,fchownat -k ownership_change
# Buffer size untuk high-traffic server
-b 8192
# Failure mode (1=printk, 2=panic)
-f 1
# Reload audit rules setelah edit
sudo augenrules --load
# Cek audit rules aktif
sudo auditctl -l
# Query audit log
sudo ausearch -k identity_change # Cari perubahan identity
sudo ausearch -k sshd_config_change # Cari perubahan SSH config
sudo ausearch -k sudoers_change # Cari perubahan sudoers
sudo ausearch -k root_commands # Cari command root
sudo ausearch -m LOGIN --failed # Cari login gagal
# Report audit
sudo aureport # Ringkasan semua audit
sudo aureport --auth # Laporan autentikasi
sudo aureport --failed # Laporan kegagalan
sudo aureport --login # Laporan login
6. Cron Jobs Security
Cron job adalah mekanisme penjadwalan tugas otomatis di Linux. Namun, cron juga bisa menjadi attack vector jika tidak dikonfigurasi dengan aman. Penyerang bisa menyisipkan cron job berbahaya untuk menjalankan malware, backdoor, atau mengeksfiltrasi data secara berkala.
# ============================================
# Cron Jobs Security — Best Practices
# ============================================
# Membatasi siapa yang bisa menggunakan cron
# Hanya user yang ada di /etc/cron.allow yang boleh membuat cron job
# Buat file cron.allow (whitelist approach)
sudo nano /etc/cron.allow
# Tambahkan hanya user yang diizinkan:
# root
# iotdev
# monitoring
# Buat file cron.deny (blacklist approach — kurang aman)
sudo nano /etc/cron.deny
# Tambahkan user yang TIDAK boleh cron:
# www-data
# nobody
# Jika kedua file ada, cron.allow yang diprioritaskan
# Permission yang benar untuk file cron
sudo chmod 600 /etc/crontab
sudo chmod 700 /etc/cron.d
sudo chmod 700 /etc/cron.daily
sudo chmod 700 /etc/cron.hourly
sudo chmod 700 /etc/cron.weekly
sudo chmod 700 /etc/cron.monthly
# Owner harus root untuk semua direktori cron
sudo chown root:root /etc/crontab
sudo chown root:root /etc/cron.d
sudo chown root:root /etc/cron.daily
sudo chown root:root /etc/cron.hourly
# Monitor perubahan cron dengan auditd
# (sudah ditambahkan di audit rules pada bagian sebelumnya)
# Cek semua cron job yang aktif
crontab -l # Cron job user saat ini
sudo crontab -l # Cron job root
sudo ls -la /etc/cron.d/ # System cron jobs
sudo ls -la /var/spool/cron/crontabs/ # Semua user crontab
# Cek cron job yang mencurigakan
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== Cron jobs for $user ==="
crontab -u $user -l 2>/dev/null
done
# Pastikan cron job menggunakan path absolut
# BURUK: */5 * * * * backup.sh
# BAIK: */5 * * * * /usr/local/bin/backup.sh
# Pastikan output cron diarahkan ke log, bukan email root
# BURUK: 0 2 * * * /usr/local/bin/backup.sh
# BAIK: 0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Cron job yang berjalan sebagai root memiliki akses penuh ke sistem. Pastikan script
yang dijalankan oleh cron job root memiliki permission yang ketat (hanya bisa diubah
oleh root), menggunakan path absolut, dan tidak mengambil input dari sumber yang tidak
terpercaya. Sebuah cron job root yang menjalankan script dengan permission 777
adalah celah keamanan kritis — siapa saja bisa mengganti isi script tersebut.
7. Fail2ban: Proteksi Brute Force
Fail2ban adalah tool yang memantau log sistem dan secara otomatis memblokir IP yang menunjukkan tanda-tanda serangan brute force, seperti percobaan login SSH yang gagal berulang kali. Fail2ban sangat penting untuk server yang terhubung ke internet.
# ============================================
# Fail2ban — Setup dan Konfigurasi
# ============================================
# Install fail2ban
sudo apt update && sudo apt install fail2ban -y
# Backup konfigurasi default
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Edit konfigurasi lokal (tidak akan ditimpa saat update)
sudo nano /etc/fail2ban/jail.local
## /etc/fail2ban/jail.local
[DEFAULT]
# Ban selama 1 jam (3600 detik)
bantime = 3600
# Window waktu untuk menghitung percobaan gagal (10 menit)
findtime = 600
# Maksimal 5 percobaan gagal sebelum ban
maxretry = 5
# Backend log (systemd untuk sistem modern)
backend = systemd
# Action ketika banned: iptables + email notifikasi
action = %(action_mwl)s
# action_mw = iptables-multiport + email
# action_mwl = iptables-multiport + email + log lines
# action_m = iptables-multiport saja
# Email untuk notifikasi
destemail = admin@example.com
sender = fail2ban@example.com
mta = sendmail
# Whitelist IP lokal
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# ---- SSH Protection ----
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
findtime = 600
# Agresif: ban IP yang mencoba user yang tidak ada
[sshd-aggressive]
enabled = true
port = 2222
filter = sshd[mode=aggressive]
logpath = /var/log/auth.log
maxretry = 2
bantime = 86400
findtime = 3600
# ---- Nginx Protection ----
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
# ---- Recidive (ban repeat offenders longer) ----
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = iptables-allports[name=recidive]
bantime = 604800
findtime = 86400
maxretry = 3
# Start dan enable fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Cek status semua jail
sudo fail2ban-client status
# Cek status jail tertentu
sudo fail2ban-client status sshd
# Melihat banned IP
sudo fail2ban-client get sshd banned
# Unban IP secara manual
sudo fail2ban-client set sshd unbanip 203.0.113.50
# Ban IP secara manual
sudo fail2ban-client set sshd banip 203.0.113.50
# Reload konfigurasi setelah edit
sudo fail2ban-client reload
# Monitoring log fail2ban
sudo tail -f /var/log/fail2ban.log
sudo journalctl -u fail2ban -f
Di perangkat IoT seperti Raspberry Pi, fail2ban sangat ringan dan tidak membebani
sumber daya. Tambahkan jail untuk MQTT broker ([mosquitto]) dan dashboard
web ([nginx-http-auth]) untuk melindungi layanan IoT dari brute force.
Gunakan bantime yang lebih panjang untuk perangkat yang tidak perlu
akses dari luar jaringan lokal.
8. Security Auditing dan Hardening Checklist
Security auditing adalah proses evaluasi menyeluruh terhadap postur keamanan sistem. Lakukan audit secara berkala (minimal bulanan) untuk memastikan tidak ada celah keamanan baru yang muncul akibat update, perubahan konfigurasi, atau instalasi software baru.
Lynis: Security Auditing Tool
# ============================================
# Lynis — Security Auditing Tool
# ============================================
# Install Lynis
sudo apt install lynis -y
# Atau dari GitHub (versi terbaru):
# git clone https://github.com/CISOfy/lynis
# cd lynis
# Jalankan audit sistem
sudo lynis audit system
# Audit khusus (hanya test tertentu)
sudo lynis audit system --tests-from-group "firewalls"
sudo lynis audit system --tests-from-group "ssh"
sudo lynis audit system --tests-from-group "storage"
# Hasil audit tersimpan di:
# /var/log/lynis.log
# /var/log/lynis-report.dat
# Hardening index: skor 0-100
# Target: minimal 70 untuk server production
# Excellent: 85+
Checklist Hardening Linux
| No | Area Keamanan | Langkah Hardening | Prioritas |
|---|---|---|---|
| 1 | Update & Patch | Aktifkan automatic security updates (unattended-upgrades) |
🔴 Kritis |
| 2 | SSH | Nonaktifkan password auth, gunakan Ed25519 key, ubah port default | 🔴 Kritis |
| 3 | Firewall | Aktifkan ufw/iptables, deny semua incoming, izinkan hanya port yang diperlukan | 🔴 Kritis |
| 4 | Fail2ban | Install dan konfigurasi fail2ban untuk SSH dan layanan web | 🔴 Kritis |
| 5 | User Management | Nonaktifkan root login, gunakan sudo, hapus user default | 🟠 Tinggi |
| 6 | File Permission | Set umask 027, audit SUID/SGID files, kunci file sensitif | 🟠 Tinggi |
| 7 | Logging | Aktifkan auditd, konfigurasi log rotation, remote logging | 🟠 Tinggi |
| 8 | Kernel Hardening | Konfigurasi sysctl (ASLR, SYN cookies, disable IP forwarding) | 🟡 Sedang |
| 9 | Cron Security | Batasi cron.allow, audit cron job, gunakan path absolut | 🟡 Sedang |
| 10 | Service Hardening | Nonaktifkan service yang tidak diperlukan, gunakan AppArmor/SELinux | 🟡 Sedang |
Kernel Hardening (sysctl)
## /etc/sysctl.d/99-security.conf
## Kernel Hardening Parameters
# --- Network Security ---
# Proteksi terhadap SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# Nonaktifkan IP forwarding (kecuali router/gateway)
net.ipv4.ip_forward = 0
# Proteksi terhadap ICMP redirect
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Proteksi terhadap source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Proteksi terhadap MITM (ARP spoofing)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Log martian packets (paket dengan IP tidak valid)
net.ipv4.conf.all.log_martians = 1
# Ignore ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1
# --- Memory Security ---
# ASLR (Address Space Layout Randomization) — acak memori
kernel.randomize_va_space = 2
# Proteksi terhadap kernel pointer leak
kernel.kptr_restrict = 2
# Nonaktifkan kernel profiling untuk user biasa
kernel.perf_event_paranoid = 3
# Restrict dmesg (hanya root yang bisa baca kernel log)
kernel.dmesg_restrict = 1
# Restrict core dump
fs.suid_dumpable = 0
# Terapkan sysctl settings
sudo sysctl -p /etc/sysctl.d/99-security.conf
# Verifikasi parameter tertentu
sysctl net.ipv4.tcp_syncookies
sysctl kernel.randomize_va_space
# Cek semua parameter keamanan
sudo sysctl -a | grep -E "(syncookie|rp_filter|accept_redirect|randomize)"
Disable Unnecessary Services
# ============================================
# Nonaktifkan Service yang Tidak Diperlukan
# ============================================
# Lihat semua service yang aktif
systemctl list-units --type=service --state=running
# Contoh service yang biasanya bisa dinonaktifkan di server:
sudo systemctl disable --now avahi-daemon # mDNS/Bonjour
sudo systemctl disable --now cups # Printing service
sudo systemctl disable --now bluetooth # Bluetooth
sudo systemctl disable --now ModemManager # Modem
sudo systemctl disable --now accounts-daemon # Accounts service
# Cek listening ports (service yang membuka port)
sudo ss -tlnp
sudo netstat -tlnp
# Pastikan tidak ada service yang tidak diharapkan listening di port
# Jika ada port yang tidak dikenal, segera investigasi
sudo lsof -i :PORT_NUMBER
Menurut laporan keamanan terbaru, serangan brute force SSH masih menjadi vektor serangan #1 terhadap server Linux, diikuti oleh eksploitasi aplikasi web dan malware cryptocurrency mining. Rata-rata server Linux yang terhubung ke internet menerima lebih dari 1.000 percobaan brute force per hari. Dengan fail2ban dan konfigurasi SSH yang benar, 99% serangan ini bisa diblokir otomatis.
Kesimpulan
Keamanan Linux bukanlah proyek satu kali — melainkan proses berkelanjutan yang memerlukan pemantauan, evaluasi, dan adaptasi terus-menerus. Dengan menerapkan semua langkah hardening yang dibahas di artikel ini — dari manajemen user dan file permissions, SSH hardening, firewall, log monitoring, cron security, fail2ban, hingga security auditing — kamu sudah membangun pertahanan berlapis yang sangat kuat.
Ingat prinsip utama keamanan: defense in depth (pertahanan berlapis). Tidak ada satu langkah tunggal yang bisa mengamankan sistem sepenuhnya. Setiap lapisan keamanan menambah kesulitan bagi penyerang, dan kombinasi dari semua lapisan ini membuat server dan perangkat IoT kamu menjadi target yang terlalu sulit untuk diserang.
🧠 Quiz: Keamanan Linux
Uji pemahamanmu tentang keamanan Linux dari panduan ini!