Memahami WAF dari rule engine hingga deployment: ModSecurity dengan Core Rule Set, mode detection vs blocking, bot management, dan bypass awareness melalui teknik encoding; ditutup praktik setup WAF berlapis yang memperketat aturan berdasarkan data tanpa merusak trafik sah

Setelah di episode 17 kita mengelola researcher eksternal, episode ini kembali ke kontrol teknis — kali ini di tepi jaringan: Web Application Firewall. Posisi WAF dalam diskusi AppSec selalu polemik: ada yang menjadikannya lapisan utama keamanan, ada yang mencibirnya sebagai band-aid. Kebenarannya di tengah: WAF adalah lapisan mitigasi cepat dan lebar yang sangat berguna untuk menahan serangan generik, memberi waktu patch, dan memenuhi compliance — tapi tidak pernah menggantikan secure coding.
Kita bahas cara kerjanya, pilihan implementasi (self-hosted vs cloud), strategi tuning detection→blocking, dan kesadaran bypass yang menjaga kalian dari false sense of security.
WAF menganalisis request HTTP di layer aplikasi sebelum menyentuh backend. Keputusan per request didasarkan pada:
UNION SELECT, <script>, path traversal).Posisi penempatan menentukan kemampuannya:
Cloud WAF (Cloudflare, AWS WAF, Akamai) duduk di edge — blokir sebelum bandwidth kalian tersentuh. ModSecurity/Nginx atau Coraza terpasang dekat aplikasi — kontrol penuh, log detail, tapi kapasitas mengikuti infrastruktur kalian.
Paket open source standar untuk self-hosted WAF adalah ModSecurity v3 (libmodsecurity) atau Coraza (Go-native) dengan OWASP Core Rule Set (CRS):
docker run -d --name waf \
-p 8080:80 \
-v ./crs-setup.conf:/etc/nginx/modsecurity.d/crs-setup.conf:ro \
owasp/modsecurity-crs:nginxCRS bekerja dengan paranoia level (PL1–PL4): semakin tinggi, semakin agresif rule — dan semakin banyak potensi false positive. PL1 default aman untuk mulai; e-commerce/API JSON-heavy biasanya naik ke PL2 setelah tuning.
Setiap rule memberi skor anomali; total melewati threshold → block. Konfigurasi inti yang kalian atur:
| Parameter | Arti |
|---|---|
tx.paranoia-level | Agresivitas rule (1–4) |
tx.inbound_anomaly_score_threshold | Skor untuk inbound block |
tx.restricted_extensions | Ekstensi file yang diblokir |
SecRuleUpdateTargetById | Pengecualian per parameter |
Kesalahan paling mahal dengan WAF: nyalakan blocking hari pertama → pelanggan komplain form gagal → WAF dimatikan permanen. Jalur adopsi yang benar:
Minggu 1–2 — Detection only: semua rule mencatat, tidak ada blokir. Kumpulkan baseline: siapa pengunjung sah, parameter apa yang memicu rule.
Minggu 3–4 — Tuning exception: parameter tertentu yang sah (field deskripsi produk yang berisi teks bebas) di-exclude dari rule spesifik — bukan rule-nya dimatikan global:
# Jangan scan field 'bio' dengan rule 942100 (SQLi detection),
# karena validasi dilakukan di aplikasi + ORM binding
SecRuleUpdateTargetById 942100 "!ARGS:bio"Perhatikan bedanya: exception presisi pada satu parameter, bukan menonaktifkan kategori serangan untuk semua input.
Minggu 5+ — Blocking bertahap: aktifkan block untuk rule dengan false positive nol; sisanya tetap detection. Review log mingguan; ketatkan bertahap.
Tip
Metrik sukses tuning bukan "berapa request diblokir" melainkan "nol false positive pada trafik sah + temuan serangan nyata tersentuh". WAF yang memblokir ribuan bot tapi juga checkout page sesekali akan dimatikan manajemen dalam sebulan.
Mayoritas trafik "serangan" modern adalah bot: scraping harga, credential stuffing (episode 5!), inventory hoarding. Lapisan penanganannya:
Sebagai AppSec engineer, kalian wajib tahu kenapa WAF bisa dilewati — supaya tidak menjual rasa aman palsu ke organisasi:
UNI/**/ON), case mixing. CRS menangani mayoritas varian umum, tapi parser differential antara WAF dan backend selalu membuka celah baru.Konsekuensi praktisnya: WAF masuk strategi episode 14 sebagai mitigasi lapisan, bukan kontrol utama. Vulnerability tetap harus difix di kode; WAF memberi jeda dan pertahanan generik.
Uji siklus lengkap di lab kalian:
# Payload injection klasik ke Juice Shop via proxy WAF
curl "http://localhost:8080/rest/products/search?q=apple%27%20OR%20true--" \
-o /dev/null -w "%{http_code}\n"
# Cek log WAF — cari anomaly score dan rule ID yang terpicu
docker logs waf 2>&1 | grep -i "anomaly\|id \"94" | tail -20Di detection mode, request tetap 200 tapi log menunjukkan rule CRS mana yang cocok. Setelah pindah ke blocking, request sama mendapat 403. Latihan lanjutan: coba bypass dengan encoding ganda dan amati rule mana yang tetap menangkap — pemahaman ini langsung meningkatkan kualitas review WAF config kalian di pekerjaan nyata.
Inti yang harus dibawa pulang:
Di episode 19 kita angkat perspektif arsitektur: Zero Trust untuk Apps — identity-aware access, least privilege per request, microsegmentation antar service, dan bagaimana menerjemahkan slogan "never trust, always verify" menjadi kontrol konkret pada aplikasi kalian. Sampai jumpa di episode 19!