Server VPS yang tidak diamankan dengan benar adalah target empuk bagi penyerang. Setiap hari, ribuan bot memindai port SSH, mencoba password lemah, dan mengeksploitasi kerentanan software. Artikel ini membahas langkah-langkah konkret untuk mengamankan server Linux VPS kamu dari serangan siber, mulai dari hardening SSH hingga monitoring real-time.
Sebelum masuk ke teknis, pahami risikonya. Server VPS yang baru diinstall biasanya memiliki:
Serangan brute-force SSH bisa mencoba ribuan kombinasi password per menit. Tanpa proteksi, server kamu bisa terkompromi dalam hitungan jam.
SSH adalah pintu utama akses server. Konfigurasi SSH yang buruk adalah celah keamanan paling umum yang dieksploitasi penyerang.
Langkah pertama yang harus dilakukan adalah mencegah login root langsung. Buat user baru dan gunakan sudo untuk akses administratif:
# Buat user baru
adduser deployer
usermod -aG sudo deployer
# Copy SSH key ke user baru
rsync --archive --chown=deployer:deployer ~/.ssh /home/deployer
Edit konfigurasi SSH untuk menonaktifkan login root:
sudo nano /etc/ssh/sshd_config
Ubah parameter berikut:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deployer
Restart SSH service setelah perubahan:
sudo systemctl restart sshd
Dengan konfigurasi ini, hanya user deployer yang bisa login, hanya menggunakan SSH key, dan session akan otomatis disconnect setelah 10 menit tidak aktif.
UFW (Uncomplicated Firewall) adalah frontend yang memudahkan konfigurasi iptables. Prinsip dasarnya: blokir semua traffic masuk, buka hanya port yang dibutuhkan.
# Install UFW jika belum ada
sudo apt install ufw -y
# Set default policy
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Buka port yang dibutuhkan
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# Aktifkan firewall
sudo ufw enable
# Cek status
sudo ufw status verbose
Output dari ufw status akan terlihat seperti ini:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere # SSH
80/tcp ALLOW IN Anywhere # HTTP
443/tcp ALLOW IN Anywhere # HTTPS
Jika kamu menjalankan database server, jangan buka port database ke internet. Gunakan SSH tunnel untuk akses remote database.
Fail2Ban memantau log file dan secara otomatis memblokir IP yang melakukan percobaan login gagal berulang. Ini adalah pertahanan penting melawan brute-force attack.
# Install Fail2Ban
sudo apt install fail2ban -y
# Buat konfigurasi lokal (jangan edit file asli)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Konfigurasi yang direkomendasikan:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = ufw
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
Aktifkan dan mulai Fail2Ban:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Cek status banned IPs
sudo fail2ban-client status sshd
Dengan konfigurasi ini, IP yang gagal login SSH 3 kali dalam 10 menit akan diblokir selama 24 jam penuh.
Kerentanan software baru ditemukan setiap hari. Patch keamanan harus segera diterapkan tanpa menunggu update manual.
# Install unattended-upgrades
sudo apt install unattended-upgrades -y
# Aktifkan auto-update keamanan
sudo dpkg-reconfigure -plow unattended-upgrades
Untuk konfigurasi lebih detail, edit file berikut:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Tambahkan konfigurasi agar reboot otomatis jika diperlukan:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Verifikasi bahwa auto-update aktif:
sudo systemctl status unattended-upgrades
cat /var/log/unattended-upgrades/unattended-upgrades.log
Nginx yang tidak dikonfigurasi dengan benar bisa membocorkan informasi server atau rentan terhadap serangan.
Tambahkan header keamanan di konfigurasi Nginx:
server {
listen 443 ssl http2;
server_name example.com;
# Header keamanan
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Sembunyikan versi Nginx
server_tokens off;
# Limit request body size
client_max_body_size 10M;
# Rate limiting
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
}
Nonaktifkan HTTP dan paksa redirect ke HTTPS:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
Restart Nginx setelah konfigurasi:
sudo nginx -t
sudo systemctl restart nginx
Keamanan tanpa monitoring ibarat memasang pintu tapi tidak pernah melihat siapa yang mencoba masuk. Setup logging dan monitoring yang memadai.
Pastikan log tidak memenuhi disk dan tetap tersimpan untuk audit:
sudo nano /etc/logrotate.d/custom-logs
/var/log/auth.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
}
Buat script sederhana untuk memantau percobaan login:
#!/bin/bash
# /usr/local/bin/check-logins.sh
echo "=== Failed SSH logins today ==="
grep "Failed password" /var/log/auth.log | grep "$(date +%b\ %d)" | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
echo ""
echo "=== Successful logins today ==="
grep "Accepted" /var/log/auth.log | grep "$(date +%b\ %d)"
Tambahkan cron job untuk menjalankan monitoring setiap jam:
chmod +x /usr/local/bin/check-logins.sh
echo "0 * * * * /usr/local/bin/check-logins.sh >> /var/log/login-monitor.log" | sudo crontab -
Install tool untuk scan rootkit dan malware secara berkala:
# Install rkhunter dan chkrootkit
sudo apt install rkhunter chkrootkit -y
# Update database rkhunter
sudo rkhunter --update
sudo rkhunter --propupd
# Jalankan scan
sudo rkhunter --check --sk
Jadwalkan scan otomatis setiap minggu:
echo "0 2 * * 0 /usr/bin/rkhunter --check --sk --report-warnings-only | mail -s 'RKHunter Report' [email protected]" | sudo crontab -
Permission file yang salah bisa memungkinkan penyerang membaca sensitive data atau mengubah konfigurasi.
# Set permission yang benar untuk direktori home
chmod 700 /home/deployer
chmod 700 /home/deployer/.ssh
chmod 600 /home/deployer/.ssh/authorized_keys
# Set ownership yang benar
chown -R deployer:deployer /home/deployer
# Cek file world-writable yang mencurigakan
find / -type f -perm -o+w -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null
# Cek file SUID yang tidak biasa
find / -type f -perm -4000 -not -path "/proc/*" 2>/dev/null
Konfigurasi kernel parameters untuk meningkatkan keamanan jaringan:
sudo nano /etc/sysctl.d/99-security.conf
# Disable IP forwarding
net.ipv4.ip_forward = 0
# Disable ICMP redirect
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Enable SYN flood protection
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# Ignore ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Disable source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Log martian packets
net.ipv4.conf.all.log_martians = 1
Terapkan perubahan:
sudo sysctl -p /etc/sysctl.d/99-security.conf
Keamanan terbaik sekalipun tidak menjamin 100% aman. Backup adalah jaring pengaman terakhir.
#!/bin/bash
# /usr/local/bin/backup-server.sh
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# Backup website files
tar -czf $BACKUP_DIR/webfiles.tar.gz /var/www/html/
# Backup database
mysqldump -u appuser -p'PasswordKuat123!' --all-databases > $BACKUP_DIR/databases.sql
# Backup konfigurasi
tar -czf $BACKUP_DIR/configs.tar.gz /etc/nginx/ /etc/php/ /etc/ssh/
# Hapus backup lebih dari 30 hari
find /backup -type d -mtime +30 -exec rm -rf {} +
echo "Backup completed: $BACKUP_DIR"
Jadwalkan backup harian:
chmod +x /usr/local/bin/backup-server.sh
echo "0 4 * * * /usr/local/bin/backup-server.sh >> /var/log/backup.log 2>&1" | sudo crontab -
Mengamankan server VPS bukan tugas satu kali, tapi proses berkelanjutan. Sepuluh langkah di atas memberikan fondasi keamanan yang solid:
Jalankan semua langkah ini secara berkala dan monitor log server kamu. Keamanan VPS yang baik adalah investasi yang jauh lebih murah dibanding menangani akibat dari serangan yang berhasil.