Keamanan & Fail2ban
Panduan mengelola keamanan server ujian: firewall, rate limiting, dan Fail2ban.
Ringkasan Keamanan
Server ujian memiliki 4 layer keamanan bertingkat:
| Layer | Komponen | Fungsi |
|---|---|---|
| 1 | UFW Firewall | Hanya buka port yang diperlukan (SSH, 80, 443) |
| 2 | Nginx Rate Limiting | Batasi jumlah request per IP per detik |
| 3 | Fail2ban | Ban IP yang berulang kali melanggar rate limit |
| 4 | Hardening | Security headers, TLS 1.2+, slowloris protection |
Toggle Security via examtool
Cara termudah untuk mengelola security:
# Lihat status security saat ini
examtool security
# Nonaktifkan security (ufw + fail2ban)
examtool security --disable
# Aktifkan kembali
examtool security --enable
Atau saat install/reconfigure:
# Install tanpa security (server di belakang proxy/VPN)
examtool install ... --security=false
# Aktifkan kembali via reconfigure
examtool reconfigure --security=true
Catatan: Menonaktifkan security hanya men-disable service (ufw + fail2ban), tidak menghapus package atau konfigurasi.
Jika menggunakan topologi via HTTP Proxy, security biasanya tidak diperlukan karena server ujian tidak langsung terekspos ke internet.
Custom SSH Port
Jika server menggunakan SSH port selain 22:
# Ubah SSH port
examtool ssh-port --port=2222
# Lihat SSH port saat ini
examtool ssh-port
Atau saat install: examtool install ... --ssh-port=2222
Examtool otomatis mengupdate /etc/ssh/sshd_config, rule UFW, dan fail2ban jail. SSH port selalu dikelola meskipun security disabled.
Peringatan: Setelah mengubah SSH port, pastikan koneksi SSH berikutnya menggunakan port baru (
ssh -p 2222 user@server).
Fail2ban
Fail2ban memonitor log server dan otomatis mem-ban IP yang menunjukkan perilaku mencurigakan.
Jail yang Aktif
| Jail | Yang Dimonitor | Trigger | Durasi Ban |
|---|---|---|---|
sshd |
Login SSH gagal | 5x dalam 10 menit | 1 jam |
nginx-http-auth |
Auth error di nginx | 5x dalam 10 menit | 1 jam |
nginx-botsearch |
Bot/scanner probe | 10x dalam 10 menit | 24 jam |
nginx-req-limit |
Kena rate limit nginx | 5x dalam 10 menit | 2 jam |
Config file: /etc/fail2ban/jail.d/examtool.conf
Cek Status Fail2ban
# Status umum (jail apa saja yang aktif)
fail2ban-client status
# Status per jail (lihat IP yang di-ban)
fail2ban-client status sshd
fail2ban-client status nginx-http-auth
fail2ban-client status nginx-botsearch
fail2ban-client status nginx-req-limit
Contoh output:
Status for the jail: nginx-req-limit
|- Filter
| |- Currently failed: 2
| |- Total failed: 15
| `- File list: /var/log/nginx/ujian-error.log
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 192.168.1.50
Unban IP
Jika IP admin atau peserta ujian ter-ban:
# Unban dari jail tertentu
fail2ban-client set sshd unbanip 192.168.1.100
fail2ban-client set nginx-req-limit unbanip 192.168.1.100
fail2ban-client set nginx-http-auth unbanip 192.168.1.100
fail2ban-client set nginx-botsearch unbanip 192.168.1.100
Jika tidak yakin di jail mana IP ter-ban, cek semua:
# Cek IP di semua jail sekaligus
for jail in sshd nginx-http-auth nginx-botsearch nginx-req-limit; do
echo "=== $jail ==="
fail2ban-client status $jail 2>/dev/null | grep "Banned IP"
done
Unban dari semua jail sekaligus:
IP="192.168.1.100"
for jail in sshd nginx-http-auth nginx-botsearch nginx-req-limit; do
fail2ban-client set $jail unbanip $IP 2>/dev/null
done
echo "IP $IP di-unban dari semua jail"
Whitelist IP (Agar Tidak Pernah Di-ban)
Edit file config:
nano /etc/fail2ban/jail.d/examtool.conf
Tambahkan ignoreip di setiap jail yang relevan. Contoh untuk jail sshd:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 192.168.1.0/24 10.0.0.0/8
Catatan: Jika menggunakan custom SSH port (via
examtool ssh-port), nilaiportotomatis disesuaikan oleh examtool.
Format ignoreip: bisa IP tunggal (
192.168.1.100), range CIDR (192.168.1.0/24), atau beberapa dipisah spasi.
Setelah edit, restart:
systemctl restart fail2ban
Tips: Untuk whitelist IP di semua jail sekaligus, tambahkan ignoreip di bagian [DEFAULT] di awal file:
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.1.0/24
[sshd]
enabled = true
...
Disable Fail2ban (Sementara)
Jika ada masalah dan perlu mematikan fail2ban sementara:
# Stop fail2ban (semua ban dicabut, monitoring berhenti)
systemctl stop fail2ban
# Verifikasi sudah mati
systemctl status fail2ban
Peringatan: Saat fail2ban mati, server tidak terlindungi dari brute-force. Jangan biarkan dalam keadaan mati terlalu lama.
Enable Fail2ban Kembali
# Start fail2ban
systemctl start fail2ban
# Verifikasi semua jail aktif
fail2ban-client status
Disable Jail Tertentu
Jika hanya satu jail yang bermasalah (misal terlalu banyak false positive di rate limit):
nano /etc/fail2ban/jail.d/examtool.conf
Ubah enabled = true menjadi enabled = false pada jail yang diinginkan:
[nginx-req-limit]
enabled = false
...
Kemudian:
systemctl restart fail2ban
fail2ban-client status # jail yang di-disable tidak muncul
Tuning Fail2ban
Jika terlalu banyak IP ter-ban (false positive saat ujian):
| Parameter | Efek | Rekomendasi |
|---|---|---|
maxretry |
Naikkan → lebih toleran | 5 → 10 untuk rate limit saat ujian |
bantime |
Turunkan → ban lebih singkat | 7200 → 1800 (30 menit) |
findtime |
Naikkan → window lebih lebar | 600 → 300 (5 menit) |
ignoreip |
Whitelist IP lab/admin | Tambahkan subnet lab ujian |
Edit /etc/fail2ban/jail.d/examtool.conf, lalu systemctl restart fail2ban.
Rate Limiting (Nginx)
Rate limit berjalan di level Nginx, sebelum Fail2ban. Konfigurasi otomatis disesuaikan per tier:
| Tier | Request/detik | Burst | Max koneksi/IP |
|---|---|---|---|
| SMALL (≤150 PC) | 30/s | 50 | 100 |
| MEDIUM (≤299 PC) | 50/s | 80 | 150 |
| LARGE (≤500 PC) | 80/s | 120 | 200 |
Login endpoint (/auth/login) dibatasi lebih ketat: 5 request/menit untuk mencegah brute-force.
Config file: /etc/nginx/conf.d/rate-limiting.conf
Skenario Saat Ujian
Saat ujian berlangsung dengan banyak peserta:
- Peserta refresh bersamaan → rate limit bisa tercapai → 429 error
- Jika 429 berulang dari satu IP → Fail2ban ban IP tersebut
- Ini bisa terjadi jika banyak peserta di belakang 1 IP (NAT/proxy)
Solusi untuk jaringan NAT (banyak peserta dari 1 IP):
- Whitelist IP gateway di fail2ban (lihat bagian di atas)
- Naikkan
maxretrydi jailnginx-req-limit - Atau reconfigure ke tier yang lebih besar:
examtool reconfigure --client=300
Firewall (UFW)
Cek Status
ufw status verbose
Buka/Tutup Port
# Buka port
ufw allow 3000/tcp # contoh: untuk Grafana
# Tutup port
ufw delete allow 3000/tcp
# Cek ulang
ufw status
Reset Firewall (Darurat)
# Reset semua rules (HATI-HATI: semua port tertutup termasuk SSH!)
ufw --force reset
# Setelah reset, buka kembali port minimal (ganti 22 jika pakai custom SSH port)
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
Peringatan: Jangan reset firewall via SSH tanpa memastikan port SSH dibuka kembali. Jika menggunakan custom SSH port (misal 2222), gunakan
ufw allow 2222/tcpbukan port 22. Anda bisa terkunci dari server.
Tips: Gunakan
examtool security --enablesebagai alternatif yang lebih aman — examtool otomatis membuka port SSH yang benar.