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), nilai port otomatis 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:

  1. Peserta refresh bersamaan → rate limit bisa tercapai → 429 error
  2. Jika 429 berulang dari satu IP → Fail2ban ban IP tersebut
  3. Ini bisa terjadi jika banyak peserta di belakang 1 IP (NAT/proxy)

Solusi untuk jaringan NAT (banyak peserta dari 1 IP):

  1. Whitelist IP gateway di fail2ban (lihat bagian di atas)
  2. Naikkan maxretry di jail nginx-req-limit
  3. 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/tcp bukan port 22. Anda bisa terkunci dari server.

Tips: Gunakan examtool security --enable sebagai alternatif yang lebih aman — examtool otomatis membuka port SSH yang benar.