Sebagai administrator server, ada dua hal yang harus selalu menjadi prioritas utama: keamanan dan backup. Tidak peduli seberapa kecil server Anda, ancaman hacker dan bencana fisik (kebakaran, banjir, kerusakan hardware) bisa datang kapan saja. Dalam artikel ini, saya akan membahas secara detail cara mengamankan server dari berbagai jenis serangan, serta bagaimana melakukan backup Container (CT) di Proxmox VE agar seluruh environment bisa dipulihkan dengan cepat.
Konteks: Saat ini saya mengelola 3 Container (CT) di Proxmox VE di node alazhar:
- CT 105 — kaskecil-server (Aplikasi Kas Kecil)
- CT 106 — taaruf-server (Aplikasi Taaruf)
- CT 107 — myblog-server (Blog Pribadi)
Bagian 1: Mengamankan Server dari Serangan Hacker
🔐 1. Amankan Akses SSH
SSH adalah pintu masuk utama ke server. Ini juga target utama serangan brute force — di mana hacker mencoba ribuan kombinasi password secara otomatis.
a. Ganti Port SSH Default
Port default SSH adalah 22. Menggantinya ke port lain akan mengurangi sebagian besar serangan brute force otomatis (bot scanner biasanya hanya menyerang port 22).
# Edit konfigurasi SSH
sudo nano /etc/ssh/sshd_config
# Cari dan ubah baris berikut:
Port 2222 # Ganti dari 22 ke port lain (misal 2222)
# Restart SSH service
sudo systemctl restart ssh
# PENTING: Setelah restart, login SSH harus menggunakan port baru:
ssh -p 2222 [email protected]
b. Nonaktifkan Login Root via SSH
Daripada login langsung sebagai root, buat user biasa dengan akses sudo. Ini menambah satu layer keamanan karena hacker harus menebak username DAN password.
# Buat user baru
adduser donar
usermod -aG sudo donar
# Edit SSH config
sudo nano /etc/ssh/sshd_config
# Ubah:
PermitRootLogin no # Nonaktifkan login root
# Restart SSH
sudo systemctl restart ssh
# Sekarang login dengan user biasa:
ssh -p 2222 [email protected]
# Lalu gunakan sudo untuk perintah admin:
sudo systemctl restart nginx
c. Gunakan SSH Key (Tanpa Password)
SSH Key adalah metode autentikasi yang jauh lebih aman dari password. Hacker tidak bisa brute force SSH key karena panjangnya bisa ribuan karakter.
# Di LAPTOP/PC Anda (bukan di server):
ssh-keygen -t ed25519 -C "[email protected]"
# Copy public key ke server:
ssh-copy-id -p 2222 [email protected]
# Setelah SSH key terpasang, nonaktifkan login password:
sudo nano /etc/ssh/sshd_config
# Ubah:
PasswordAuthentication no
sudo systemctl restart ssh
⚠️ PERINGATAN: Pastikan SSH key sudah berfungsi SEBELUM menonaktifkan password. Jika tidak, Anda bisa terkunci dari server sendiri!
🛡️ 2. Konfigurasi Firewall (UFW)
UFW (Uncomplicated Firewall) adalah firewall bawaan Ubuntu yang mudah dikonfigurasi. Prinsipnya: blokir semua, izinkan hanya yang diperlukan.
# Reset semua rules
sudo ufw reset
# Set default policy: blokir semua incoming, izinkan semua outgoing
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Izinkan port yang dibutuhkan
sudo ufw allow 2222/tcp # SSH (port custom)
sudo ufw allow 80/tcp # HTTP (web)
sudo ufw allow 443/tcp # HTTPS (web secure)
# Aktifkan firewall
sudo ufw enable
# Cek status
sudo ufw status verbose
⚠️ JANGAN lupa izinkan port SSH baru SEBELUM mengaktifkan UFW! Jika tidak, Anda akan terkunci dari server.
🚫 3. Install Fail2Ban (Anti Brute Force)
Fail2Ban adalah tool yang otomatis memblokir IP address yang mencoba login berulang kali dan gagal. Ini adalah pertahanan terbaik terhadap serangan brute force.
# Install Fail2Ban
sudo apt install fail2ban -y
# Buat konfigurasi custom (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 # Ban selama 1 jam (3600 detik)
findtime = 600 # Dalam rentang 10 menit terakhir
maxretry = 3 # Maksimal 3 kali percobaan gagal
banaction = ufw # Gunakan UFW untuk blocking
[sshd]
enabled = true
port = 2222 # Sesuaikan dengan port SSH Anda
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 3x login gagal = BANNED
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
# Restart Fail2Ban
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
# Cek IP yang sudah di-ban
sudo fail2ban-client status sshd
# Unban IP tertentu (jika terkunci sendiri)
sudo fail2ban-client set sshd unbanip 192.168.1.100
🔄 4. Update Sistem Secara Berkala
Banyak serangan hacker memanfaatkan celah keamanan (vulnerability) di software yang belum di-update. Selalu update sistem secara berkala.
# Update manual
sudo apt update && sudo apt upgrade -y
# Aktifkan auto-update untuk security patches
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
Dengan unattended-upgrades, security patches akan terinstall otomatis tanpa intervensi manual.
🔒 5. Amankan Aplikasi Web
a. Sembunyikan Info Server
# Edit nginx.conf
sudo nano /etc/nginx/nginx.conf
# Tambahkan di blok http:
server_tokens off; # Sembunyikan versi Nginx dari response header
# Di PHP-FPM config
sudo nano /etc/php/8.2/fpm/php.ini
# Ubah:
expose_php = Off # Sembunyikan versi PHP
b. Lindungi File Sensitif Laravel
# Di Nginx config, blokir akses ke file sensitif
location ~ /\.env {
deny all;
return 404;
}
location ~ /\.git {
deny all;
return 404;
}
c. Set Laravel ke Production Mode
# Pastikan di .env:
APP_ENV=production
APP_DEBUG=false # WAJIB false di production!
# Cache konfigurasi
php artisan config:cache
php artisan route:cache
Jika APP_DEBUG=true di production, error message akan menampilkan informasi sensitif seperti database credentials, path file, dan stack trace yang bisa dimanfaatkan hacker.
📊 6. Monitoring dan Deteksi Intrusi
# Cek login yang gagal
sudo grep "Failed password" /var/log/auth.log | tail -20
# Cek login yang berhasil
sudo grep "Accepted" /var/log/auth.log | tail -20
# Cek user yang sedang login
who
w
# Cek koneksi network aktif (cari koneksi mencurigakan)
sudo ss -tlnp
sudo netstat -tlnp
# Cek proses yang berjalan (cari proses asing)
ps aux | head -30
top
🧱 7. Rangkuman Checklist Keamanan
- ✅ Ganti port SSH dari 22 ke port custom
- ✅ Nonaktifkan login root via SSH
- ✅ Gunakan SSH key, nonaktifkan password login
- ✅ Konfigurasi UFW firewall (deny all, allow only needed)
- ✅ Install dan konfigurasi Fail2Ban
- ✅ Aktifkan auto-update (unattended-upgrades)
- ✅ Sembunyikan versi Nginx dan PHP
- ✅ Blokir akses ke .env dan .git di Nginx
- ✅ Laravel: APP_DEBUG=false, APP_ENV=production
- ✅ Monitor log secara berkala
Bagian 2: Backup Container (CT) di Proxmox VE
Backup adalah jaring pengaman terakhir. Jika server diretas atau terjadi bencana fisik (kebakaran, kerusakan hardware), backup yang tersimpan di lokasi terpisah adalah satu-satunya cara untuk memulihkan semuanya.
📦 Memahami Proxmox Backup
Proxmox VE memiliki fitur backup bawaan yang bisa mem-backup seluruh Container (CT) atau Virtual Machine (VM) sebagai satu file. File backup ini berisi:
- Seluruh filesystem CT (termasuk OS, aplikasi, konfigurasi, database)
- Konfigurasi CT (RAM, CPU, network, storage)
- Semua data di dalam CT
Artinya, dengan satu file backup, Anda bisa mengembalikan seluruh CT dengan semua isinya — seolah-olah tidak pernah terjadi masalah.
💾 Metode 1: Backup Manual via Proxmox Web UI
Cara paling mudah adalah melalui Proxmox Web Interface.
- Login ke Proxmox Web UI — Buka browser, akses
https://IP_PROXMOX:8006 - Pilih CT yang ingin di-backup — Klik CT di sidebar (misal: 105 kaskecil-server)
- Klik tab "Backup" — Di panel kanan
- Klik "Backup now":
- Storage: local (atau storage lain yang tersedia)
- Mode: Snapshot (recommended, CT tetap berjalan) atau Stop (lebih konsisten tapi downtime)
- Compression: ZSTD (tercepat) atau GZIP
- Klik "Backup" — Tunggu proses selesai
Ulangi untuk setiap CT (105, 106, 107).
💾 Metode 2: Backup Manual via Command Line
Jika Anda lebih suka CLI, login ke Proxmox host (bukan ke dalam CT) dan jalankan:
# Backup CT 105 (kaskecil-server)
vzdump 105 --storage local --mode snapshot --compress zstd --notes "Backup kaskecil-server"
# Backup CT 106 (taaruf-server)
vzdump 106 --storage local --mode snapshot --compress zstd --notes "Backup taaruf-server"
# Backup CT 107 (myblog-server)
vzdump 107 --storage local --mode snapshot --compress zstd --notes "Backup myblog-server"
# Backup SEMUA CT sekaligus
vzdump 105 106 107 --storage local --mode snapshot --compress zstd
Penjelasan opsi:
--storage local— Simpan backup di storage "local" Proxmox--mode snapshot— Backup tanpa mematikan CT (no downtime)--mode stop— Matikan CT sementara untuk konsistensi 100% (ada downtime)--compress zstd— Kompresi dengan ZSTD (cepat, rasio bagus)
File backup tersimpan di: /var/lib/vz/dump/
# Lihat file backup yang sudah dibuat
ls -lh /var/lib/vz/dump/
# Contoh output:
# vzdump-lxc-105-2026_02_10-08_00_00.tar.zst (kaskecil-server)
# vzdump-lxc-106-2026_02_10-08_05_00.tar.zst (taaruf-server)
# vzdump-lxc-107-2026_02_10-08_10_00.tar.zst (myblog-server)
⏰ Metode 3: Backup Otomatis (Terjadwal)
Backup manual mudah dilupakan. Sebaiknya buat jadwal backup otomatis agar CT di-backup secara berkala tanpa intervensi manual.
Via Proxmox Web UI:
- Di sidebar, klik Datacenter
- Klik tab "Backup"
- Klik "Add" untuk membuat jadwal baru
- Konfigurasi:
- Node: alazhar
- Storage: local
- Schedule: Pilih jadwal (misal: setiap hari jam 02:00 WIB)
- Selection mode: Include — pilih CT 105, 106, 107
- Mode: Snapshot
- Compression: ZSTD
- Max backups (Retention): Keep Last = 3 (simpan 3 backup terakhir agar disk tidak penuh)
- Klik "Create"
Via CLI (crontab Proxmox):
# Edit jadwal backup Proxmox
nano /etc/pve/jobs.cfg
# Atau buat cron job manual:
crontab -e
# Backup semua CT setiap hari jam 2 pagi:
0 2 * * * vzdump 105 106 107 --storage local --mode snapshot --compress zstd --mailnotification always --mailto [email protected] 2>&1 | logger -t vzdump
🌍 Metode 4: Backup Offsite (Lokasi Terpisah) — PALING PENTING!
⚠️ Backup yang tersimpan di server yang sama TIDAK melindungi dari kebakaran atau kerusakan hardware! Anda HARUS menyimpan salinan backup di lokasi berbeda.
Opsi A: Copy Backup ke Komputer/Laptop Lokal
# Dari LAPTOP, download file backup via SCP:
scp [email protected]:/var/lib/vz/dump/vzdump-lxc-105-*.tar.zst D:\Backup\Proxmox\
scp [email protected]:/var/lib/vz/dump/vzdump-lxc-106-*.tar.zst D:\Backup\Proxmox\
scp [email protected]:/var/lib/vz/dump/vzdump-lxc-107-*.tar.zst D:\Backup\Proxmox\
# Atau download SEMUA backup sekaligus:
scp [email protected]:/var/lib/vz/dump/vzdump-lxc-*.tar.zst D:\Backup\Proxmox\
Opsi B: Copy ke External Hard Drive / USB
# Di Proxmox host, colokkan USB drive lalu mount:
mkdir -p /mnt/usb-backup
mount /dev/sdb1 /mnt/usb-backup
# Copy semua backup ke USB
cp /var/lib/vz/dump/vzdump-lxc-*.tar.zst /mnt/usb-backup/
# Unmount USB setelah selesai
umount /mnt/usb-backup
Opsi C: Upload ke Cloud Storage (Google Drive, Rclone)
Untuk perlindungan maksimal, simpan backup di cloud. Gunakan rclone untuk sync ke Google Drive, OneDrive, atau S3:
# Install rclone
curl https://rclone.org/install.sh | sudo bash
# Setup remote (ikuti wizard interaktif)
rclone config
# Pilih: Google Drive, masukkan credentials, dll.
# Upload backup ke Google Drive
rclone copy /var/lib/vz/dump/ gdrive:Proxmox-Backup/ --include "vzdump-lxc-*.tar.zst"
# Otomatiskan dengan cron (setelah backup harian selesai):
crontab -e
# Upload ke cloud setiap hari jam 4 pagi (setelah backup jam 2):
0 4 * * * rclone copy /var/lib/vz/dump/ gdrive:Proxmox-Backup/ --include "vzdump-lxc-*.tar.zst" --max-age 24h
Opsi D: Backup ke Server/NAS Lain di Jaringan
# Tambahkan storage NFS atau CIFS di Proxmox:
# Datacenter > Storage > Add > NFS/CIFS
# Atau via CLI:
pvesm add nfs backup-nas --server 192.168.13.200 --export /backup --content backup
# Setelah ditambahkan, bisa langsung backup ke storage tersebut:
vzdump 105 106 107 --storage backup-nas --mode snapshot --compress zstd
♻️ Cara Restore CT dari Backup
Jika terjadi masalah, berikut cara mengembalikan CT dari backup:
Via Proxmox Web UI:
- Klik local (alazhar) di sidebar
- Klik tab "Backups" (atau "Content" → filter "Backup")
- Pilih file backup yang diinginkan
- Klik "Restore"
- Pilih CT ID tujuan (bisa ID yang sama atau ID baru)
- Klik "Restore" dan tunggu proses selesai
Via CLI:
# Restore CT 105 dari backup
pct restore 105 /var/lib/vz/dump/vzdump-lxc-105-2026_02_10-02_00_00.tar.zst --storage local-lvm
# Restore ke CT ID baru (misal 110) jika CT lama masih ada
pct restore 110 /var/lib/vz/dump/vzdump-lxc-105-2026_02_10-02_00_00.tar.zst --storage local-lvm
# Restore dari file backup yang di-download ke laptop (upload dulu ke Proxmox):
scp D:\Backup\Proxmox\vzdump-lxc-105-*.tar.zst [email protected]:/var/lib/vz/dump/
# Lalu restore seperti biasa
📋 Script Backup Lengkap (Automasi)
Berikut script bash yang bisa digunakan untuk backup semua CT, menyimpan ke lokal, dan upload ke cloud secara otomatis:
#!/bin/bash
# /root/backup-all-ct.sh
# Script backup semua CT + upload ke cloud
DATE=$(date +%Y%m%d)
LOG="/var/log/ct-backup-$DATE.log"
echo "=== Backup Started: $(date) ===" | tee -a $LOG
# Backup semua CT
for CTID in 105 106 107; do
echo "Backing up CT $CTID..." | tee -a $LOG
vzdump $CTID --storage local --mode snapshot --compress zstd 2>&1 | tee -a $LOG
done
echo "=== Local Backup Complete ===" | tee -a $LOG
# Upload ke Google Drive (jika rclone sudah dikonfigurasi)
echo "Uploading to Google Drive..." | tee -a $LOG
rclone copy /var/lib/vz/dump/ gdrive:Proxmox-Backup/ \
--include "vzdump-lxc-*.tar.zst" \
--max-age 24h 2>&1 | tee -a $LOG
# Hapus backup lama (simpan 3 terakhir per CT)
echo "Cleaning old backups..." | tee -a $LOG
for CTID in 105 106 107; do
ls -t /var/lib/vz/dump/vzdump-lxc-$CTID-*.tar.zst 2>/dev/null | tail -n +4 | xargs -r rm -v 2>&1 | tee -a $LOG
done
echo "=== Backup Complete: $(date) ===" | tee -a $LOG
# Buat file executable
chmod +x /root/backup-all-ct.sh
# Jadwalkan otomatis setiap hari jam 2 pagi
crontab -e
# Tambahkan:
0 2 * * * /root/backup-all-ct.sh
🎯 Strategi Backup 3-2-1 (Best Practice)
Ikuti aturan 3-2-1 yang menjadi standar industri:
- 3 salinan data — Data asli di CT + 2 backup
- 2 media berbeda — Disk server + external drive ATAU cloud
- 1 offsite — Minimal 1 salinan di lokasi fisik berbeda (cloud, rumah, kantor lain)
Contoh implementasi untuk setup kita:
- Salinan 1: Data asli di CT (Proxmox local-lvm)
- Salinan 2: Backup di Proxmox local storage (
/var/lib/vz/dump/) - Salinan 3 (offsite): Upload ke Google Drive via rclone ATAU copy ke laptop via SCP
📊 Ringkasan: Action Plan
Langkah Keamanan (Lakukan Sekarang)
- Ganti port SSH di setiap CT (105, 106, 107)
- Install dan konfigurasi Fail2Ban di setiap CT
- Konfigurasi UFW firewall di setiap CT
- Pastikan APP_DEBUG=false di semua aplikasi Laravel
- Update sistem:
apt update && apt upgrade -y - Aktifkan auto-update:
apt install unattended-upgrades
Langkah Backup (Lakukan Sekarang)
- Buat backup manual semua CT (105, 106, 107) via Proxmox UI atau CLI
- Download backup ke laptop:
scp root@IP:/var/lib/vz/dump/*.tar.zst D:\Backup\ - Buat jadwal backup otomatis di Proxmox (Datacenter > Backup > Add)
- (Opsional) Setup rclone untuk upload backup ke Google Drive
- Test restore! — Pastikan backup benar-benar bisa di-restore
⚠️ Backup yang tidak pernah di-test restore sama saja dengan tidak punya backup. Selalu coba restore ke CT baru dengan ID berbeda untuk memastikan backup valid.
Dengan menerapkan kombinasi keamanan server dan strategi backup 3-2-1, data dan aplikasi Anda akan terlindungi baik dari serangan hacker maupun bencana fisik. Jangan tunda — lakukan langkah-langkah di atas sekarang! 🛡️