π‘οΈ WEB APPLICATION FIREWALL & REVERSE PROXY β Deep Dive: Dari ModSecurity sampai Pingora
WAF dan Reverse Proxy adalah dua komponen yang saling melengkapi β Reverse Proxy mengatur lalu lintas di Layer 7 (routing, load balancing, TLS termination), sementara WAF menginspeksi dan memfilter konten berbahaya di dalam lalu lintas tersebut. Di era arsitektur mikroservis dan API-first, memahami keduanya secara bersamaan bukan lagi opsional β ini adalah fondasi security infrastructure modern. Dokumen ini membedah setiap aspek dari ModSecurity/CRS, Nginx/HAProxy/Envoy, Pingora, dan API Gateway, dari teori sampai implementasi.
Hubungan ke Vault
Ini adalah deep dive utama untuk WAF & Reverse Proxy ecosystem. Terkait erat dengan Supply Chain Security (WAF rule lifecycle), Web Hacking (attack vectors yang diblok WAF), CD Pipeline (WAF testing di pipeline), dan SLSA framework (build provenance untuk WAF rules). Juga terhubung dengan custom WAF project jarsWAF yang dibangun dengan Pingora.
Pola ini (CDN β WAF β Reverse Proxy β Backend) adalah standar industrial.
Fungsi Reverse Proxy β Layer 4 vs Layer 7
Layer 4 (TCP/UDP)
FUNGSI:
- Meneruskan koneksi berdasarkan IP + port
- Tidak melihat isi paket HTTP
- Lebih cepat (kernel-level forwarding)
CONTOH:
HAProxy in TCP mode
Nginx stream module
iptables DNAT
USE CASE:
- Load balancing database (MySQL read replica)
- Game server forwarding
- SSH gateway
- Generic TCP tunnel
Layer 7 (HTTP/HTTPS)
FUNGSI:
- Inspeksi HTTP header, method, path, body
- Routing berdasarkan Host, Path, Cookie, Header
- TLS termination, rewriting, caching
- Authentication passthrough (JWT, OAuth)
- Rate limiting per endpoint
CONTOH:
Nginx http context, HAProxy http mode
Envoy, Traefik, Pingora, Kong
USE CASE:
- Microservices API gateway
- Single Page App routing
- A/B testing (cookie-based canary)
- WAF integration
KEKUATAN:
- Paling cepat di antara proxy tradisional
- Load balancing canggih (leastconn, uri, hdr, rdp-cookie)
- Health check sangat granular (active + passive)
- ACL engine powerful
- Stats UI built-in
KELEMAHAN:
- Konfigurasi verbose (tiap fitur butuh directive terpisah)
- Tidak bisa serve static files
- Ekosistem module terbatas
KONFIGURASI DASAR:
frontend web_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/
mode http
# ACL-based routing
acl is_api path_beg /api/
acl is_static path_beg /static/
use_backend api_servers if is_api
use_backend static_servers if is_static
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health
server web1 10.0.0.1:8080 check fall 3 rise 2
server web2 10.0.0.2:8080 check fall 3 rise 2
Envoy
KEKUATAN:
- Service mesh native (Istio, Consul Connect)
- xDS API untuk dynamic configuration
- Filter chain architecture (L3-L7)
- HTTP/2, gRPC, WebSocket native
- Observability kelas dunia (access log, tracing, metrics)
KELEMAHAN:
- Kompleksitas tinggi
- Butuh control plane untuk dynamic config
- Resource usage lebih besar dari Nginx/HAProxy
ARSITEKTUR FILTER:
Listener β Filter Chain β Network Filters (L4) β HTTP Filter Chain (L7)
β
βββββββββββββββββββββββββββββββββββΌββββββββββββββββββ
β Router β RBAC β Buffer β Fault β CORS β WAF β
ββββββββββ΄ββββββββ΄βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ
Traefik
KEKUATAN:
- Auto-discovery (Docker, Kubernetes, Consul, etcd)
- Let's Encrypt otomatis
- Middleware chain (RateLimit, BasicAuth, CircuitBreaker, Retry)
- Dashboard UI built-in
- Konfigurasi via label/annotations
KELEMAHAN:
- Performa di bawah Nginx/HAProxy pada high throughput
- Kurang cocok untuk non-container deployment
- Edukasi lebih sedikit karena relatif baru
KONFIGURASI DOCKER:
# docker-compose.yml
services:
traefik:
image: traefik:v3.0
labels:
- "traefik.http.routers.api.rule=Host(`app.example.com`)"
- "traefik.http.services.api.loadbalancer.server.port=3000"
- "traefik.http.middlewares.ratelimit.ratelimit.average=100"
- "traefik.http.routers.api.middlewares=ratelimit@docker"
Perbandingan
Aspek
Nginx
HAProxy
Envoy
Traefik
Performa
π’
π’π’
π‘
π‘
Dynamic Config
β (native)
β
β xDS
β
Service Mesh
β
β
β
π‘
Letβs Encrypt
Plugin
β (3rd party)
β
β Native
WAF Module
ModSecurity
β
Wasm/Lua
Plugin
Hot Reload
π‘ SIGHUP
π’ Graceful
β Lame duck
β Native
Learning Curve
π’
π’
π΄
π’
Static Files
β Best
β
β
β
gRPC
π‘
π‘
β Native
β
Pingora β Cloudflare Next-Gen Proxy Framework
PENGERTIAN:
Pingora adalah FRAMEWORK (bukan aplikasi) untuk membangun proxy server
di Rust, digunakan Cloudflare untuk menangani 40M+ request/detik.
Bukan "Nginx killer" β melainkan "building block" untuk custom proxy.
ARSITEKTUR:
KEUNGGULAN DARI CLOUDFLARE:
- Connection reuse rate > 90% (dibanding ~70% Nginx)
- Memory safety (Rust β no buffer overflow, use-after-free)
- Full control atas tiap fase request
- Zero-cost abstractions (Rust trait tanpa overhead runtime)
- TLS via rustls (memory safe, no OpenSSL drama)
KEKURANGAN:
- Harus coding Rust (tidak bisa konfigurasi via file)
- Ekosistem module belum seluas Nginx
- Dokumentasi masih terbatas
- Tidak cocok untuk yang butuh quick config
Minimal Pingora Proxy
use pingora::prelude::*;use async_trait::async_trait;struct MyProxy;#[async_trait]impl ProxyHttp for MyProxy { type CTX = (); fn new_ctx(&self) -> () { () } // Phase: routing async fn upstream_peer(&self, _session: &mut Session, _ctx: &mut ()) -> Result<Box<HttpPeer>> { let peer = HttpPeer::new("127.0.0.1:8080", false, "myapp.local"); Ok(Box::new(peer)) } // Phase: block list async fn request_filter(&self, session: &mut Session, _ctx: &mut ()) -> Result<bool> { let ip = session.client_addr(); if ip.is_loopback() { return Ok(true); // block } Ok(false) // allow }}#[tokio::main]async fn main() { let mut server = Server::new(Some(Opt::default())).unwrap(); server.bootstrap(); let mut lb = load_balancer::RoundRobin::new(&["https://backend:443"]).unwrap(); server.add_service(lb); server.run_forever();}
Connection Pooling & Keep-Alive
MASALAH:
Setiap request ke backend = buka koneksi TCP baru
β 3-way handshake (1 RTT) + TLS handshake (2 RTT)
β Latensi tambahan 2-3 RTT per request
SOLUSI: Connection Pool
Reverse proxy maintain pool koneksi ke backend
Requestε€η¨ koneksi yang sudah ada
Pooling Strategies
Strategy
Cara Kerja
Cocok Untuk
Keep-Alive timeout
Koneksi tetap hidup selama N detik setelah request selesai
General
Max connections
Batasi total koneksi per backend (mencegah overload)
High traffic
Max idle
Pertahankan N idle koneksi siap pakai
Flash traffic
Connection TTL
Reset koneksi setelah N detik (untuk load distribution)
Long-lived
LIFO pool
Last-In-First-Out β reuse koneksi terbaru
Consistent latency
Pingora Connection Pool
// Pingora connection reuse out-of-the-box// Konfigurasi default sudah optimalHttpPeer::new("backend:8080", false, "hostname")// Dengan connection timeoutHttpPeer::new("backend:8080", false, "hostname") .set_connection_timeout(Some(Duration::from_secs(5)))
IMPLEMENTASI DI PINGORA:
Pingora punya pingora-load-balancing crate:
- RoundRobin
- LeastConnected (default karena paling optimal)
- Ketemu: pingora-load-balancing/src/lib.rs di source
TLS Termination & Certificate Management
TLS Termination vs Passthrough
TLS TERMINATION:
Reverse Proxy β decrypt TLS β inspeksi HTTP β re-encrypt ke backend
β WAF bisa inspect request body
β Header manipulation (X-Forwarded-*)
β Backend tidak perlu handle TLS
β Proxy bisa lihat plaintext (internal trust required)
TLS PASSTHROUGH:
Proxy β forward TLS stream tanpa decrypt
β Backend handle sendiri TLS (end-to-end encryption)
β WAF tidak bisa inspect content (hanya IP/port)
β Tidak bisa routing berdasarkan HTTP header
HYBRID (rekomendasi):
TLS termination di proxy β WAF inspect β backend via mTLS
β WAF bisa inspect
β Backend-to-proxy traffic aman (mTLS)
β Backend tidak perlu public cert
KEUNTUNGAN:
- Multiplexing: banyak stream dalam satu koneksi
- Header compression (HPACK)
- Server push
- Binary protocol (lebih efisien parse)
CATATAN:
- HTTP/2 antara clientβproxy
- HTTP/1.1 antara proxyβbackend (kecuali backend support h2c)
- Pingora: HTTP/2 built-in
- Envoy: HTTP/2 antara proxyβbackend via `http2_protocol_options`
CRS v4.28 β 700+ rules, terbagi dalam 4 paranoia level:
PL0: Rules dasar β tidak ada false positive (hanya aturan framework)
Contoh: initialization, exclusion rules
PL1: Rules agresif β false positive minimal
Contoh: SQLi dasar, XSS dasar, LFI, RFI, RCE
β Recommended untuk produksi
PL2: Rules lebih ketat β false positive moderate
Contoh: SQLi bypass lanjutan, XSS encoding, path traversal
β Cocok untuk aplikasi internal
PL3: Rules sangat ketat β butuh tuning
Contoh: out-of-band detection, chained rules
β Untuk high-security environment
PL4: Rules paranoid β false positive tinggi
Contoh: semua karakter non-ASCII = suspicious
β Hanya untuk militer/classified
Anomaly Scoring System
Setiap rule yang match memberikan skor:
TIPE SKOR:
- Critical: 5 skor (SQLi, RCE, LFI)
- Error: 4 skor (Java attack, session fixation)
- Warning: 3 skor (XSS, RFI)
- Notice: 2 skor (scanner detection, protocol violation)
THRESHOLD:
- Inbound Anomaly Score: 5-10 (default: block jika > 5)
- Outbound Anomaly Score: 4-5 (block jika > 4)
KEUNTUNGAN:
- Satu request bisa match multiple rules β akumulasi
- False positive langka tidak langsung block
- Paranoia level naik = threshold tetap β lebih banyak rule match
Rule Categories
File Prefix
Kategori
Jumlah Rule
REQUEST-901
Initialization
Framework
REQUEST-905
Common Exceptions
Whitelist
REQUEST-911
Method Enforcement
9
REQUEST-913
Scanner Detection
9
REQUEST-920
Protocol Enforcement
97
REQUEST-921
Protocol Attack
22
REQUEST-922
Multipart Attack
6
REQUEST-930
LFI
14
REQUEST-931
RFI
10
REQUEST-932
RCE
59
REQUEST-933
PHP Attack
27
REQUEST-934
Generic Injection
19
REQUEST-941
XSS
33
REQUEST-942
SQLi
65
REQUEST-943
Session Fixation
12
REQUEST-944
Java Attack
23
REQUEST-949
Blocking Evaluation
27
WAF Detection vs Blocking Mode
Detection Mode (Log Only)
KEUNTUNGAN:
- Aman untuk deploy pertama (tidak ada false positive block)
- Bisa analisis traffic real untuk tuning
- Metrics: request yang akan di-block jika mode blocking
IMPLEMENTASI:
SecRuleEngine DetectionOnly
# atau di CRS:
SecDefaultAction "phase:1,pass,log"
Blocking Mode
IMPLEMENTASI:
SecRuleEngine On
# atau dengan threshold:
SecAction "id:900001,phase:1,pass,nolog,setvar:tx.blocking_threshold=5"
Rekomendasi Transisi
Minggu 1-2: DetectionOnly β log analysis β tune exclusion rules
Minggu 3: Blocking PL1 β monitor false positive
Minggu 4: Blocking PL1 + specific PL2 rules
Bulan 2: Blocking PL2 β monitor
Bulan 3+: PL3 selective untuk critical endpoints
JANGAN PERNAH langsung PL4 di produksi.
Rule Engine Internals β Regex, Tokenizer, AST
Regex-Based Detection
KEKUATAN:
- Cepat untuk pattern sederhana
- Mudah di-debug
- Portabel
KELEMAHAN:
- Catastrophic backtracking (ReDoS)
- Tidak bisa detect logical structure (SQL grammar)
- Encoding bypass sulit
CONTOH (CRS SQLi detection):
# Detect UNION-based injection
SecRule ARGS "@rx (?i)(\bunion\b.{0,100}?\bselect\b)" \
"id:942200,phase:2,block,msg:'SQL Injection: UNION attack detected'"
Tokenizer/AST-Based Detection
KEKUATAN:
- Parse input sebagai grammar β deteksi anomaly
- Tidak kena encoding bypass (parse setelah normalisasi)
- False positive lebih rendah
CONTOH (libinjection approach):
Input: 1' OR '1'='1
Token: [NUM] [OP] [STR] [OP] [STR]
Tree: Comparison(1, OR, Comparison('1', =, '1'))
Verdict: SQLi (score: 0.98)
IMPLEMENTASI DI JARSWAF:
jarsWAF punya AST semantic tokenizer di rule engine.
Ini lebih advanced dari CRS regex-only.
TEKNIK:
?id=1&id=1' OR '1'='1
β Backend bisa parse parameter berbeda dari WAF
MITIGASI:
- WAF harus tahu bagaimana backend parse parameter
- Test: parameter terakhir vs pertama yang dipakai?
### HTTP Smuggling
TEKNIK:
CL.TE: Content-Length vs Transfer-Encoding beda interpretasi
WAF lihat Content-Length (body aman)
Backend lihat Transfer-Encoding (body = request kedua berbahaya)
MITIGASI:
- HTTP/2 (hilangkan ambiguity)
- Normalize TE header
- Pingora/Envoy: strictly follow RFC
Logic Bypass
TEKNIK:
WAF mendeteksi pattern, tapi attacker bypass dengan logika:
- Menggunakan fungsi database yang legitimate
- Time-based blind (no visible payload)
- Out-of-band (DNS exfil β WAF harus inspect DNS)
MITIGASI:
- Behavioral detection (bukan cuma signature)
- Rate limiting untuk brute force
- Outbound connection monitoring
Normalization Engine
PROSES NORMALISASI:
Input Raw β URL Decode β HTML Entity Decode β Unicode NFKC β Lowercase β Trim
β β β β β β
%253c %3c < \u003c < <
HASIL AKHIR: semua variant input β bentuk kanonikal β rule matching
PENTING:
- Urutan normalisasi mempengaruhi deteksi
- NFKC normalize: β (1 karakter) β R + e (2 karakter) β tetap terdeteksi
- Recursive decode: ulang hingga tidak ada perubahan (max 5 iterasi)
PRINSIP:
- Queue: request antri (bisa overflow)
- Rate: process rate tetap
- Overflow β drop
COCOK UNTUK:
- Processing rate yang predictable
- Backend protection (tidak overload)
Sliding Window
PRINSIP:
- Window: N detik (misal 60s)
- Counter: jumlah request dalam window
- Setiap detik, window geser
COCOK UNTUK:
- API rate limiting granular
- Lebih akurat dari fixed window (tidak ada spike di reset)
Rate Limiting Placement
LAYER 4: iptables + connlimit β block by IP:PORT
LAYER 7: WAF / Reverse Proxy β block by path, token, session
APPLICATION: Backend logic β block by user tier, feature flag
JANGAN cuma andalkan satu layer.
Rate limiting di proxy + backend + WAF.
CILIUM MENGGUNAKAN eBPF β performa kernel-level:
- NetworkPolicy via eBPF (lebih cepat dari iptables)
- mTLS via envoy (opsional, bisa pure eBPF)
- WAF via Tetragon (eBPF-based security observability)
KONEKSI KE JARSWAF:
jarsWAF punya eBPF XDP drop module (/jarswaf-ebpf)
Ini mirror dari Cilium concept β DDoS mitigation di kernel
JARSWAF MENGGUNAKAN:
- Pingora sebagai reverse proxy framework (ProxyHttp trait)
- Tokenizer AST untuk SQLi/XSS detection (advanced dari CRS regex)
- eBPF XDP untuk DDoS mitigation di kernel
- Token bucket rate limiting
- GeoIP blocking via MaxMind
- CRS rules bisa diintegrasikan sebagai signature layer
PERBEDAAN JARSWAF DARI WAF TRADISIONAL:
- Memory safe (Rust > C/CPP)
- AST semantic parser > regex-only (false positive lebih rendah)
- Connection reuse Pingora > 90% (lebih efisien dari Nginx)
- eBPF XDP drop di kernel level
Integrasi CRS ke jarsWAF
CRS rules (ModSecurity SecRule format) bisa di-parse dan dikonversi
ke format jarsWAF. Strategi:
1. Parse .conf β extract id, msg, pattern, phase, paranoia
2. Simpan di HashMap<RuleId, RuleConfig>
3. Load saat runtime dengan ArcSwap (lock-free update)
4. Match menggunakan regex engine Rust (regex crate) + custom AST untuk kompleks
waf-knowledge MCP server sudah mengindex 382 CRS rules untuk
referensi cepat saat develop jarsWAF.
Roadmap Belajar
HARI 1: Fundamentals
- Baca dokumen ini sampai selesai
- Setup Nginx + ModSecurity + CRS di homelab (docker)
- Mode DetectionOnly β inject SQLi β lihat log
HARI 2: Deep Dive WAF
- Pelajari CRS rule format (buka REQUEST-942-*.conf)
- Tes bypass techniques (encoding, HPP, smuggling)
- Pahami anomaly scoring system
HARI 3: Reverse Proxy Architecture
- Bandingkan Nginx vs HAProxy vs Envoy di homelab
- Setup TLS + ACME
- Pelajari connection pooling metrics
HARI 4: API Gateway & Service Mesh
- Deploy Kong/APISIX (docker compose)
- Setup rate limiting + JWT auth
- Baca Istio AuthorizationPolicy
HARI 5: Build & Operasi
- Implementasi custom WAF rule (dari atau untuk jarsWAF)
- Metrics + monitoring (Prometheus)
- Tuning CRS: exclusion rules, false positive handling
Bottom Line
WAF tanpa tuning adalah noise generator. CRS PL1 adalah starting point yang baik, tapi butuh 2-4 minggu monitoring untuk mencapai false positive rate < 0.1%. Reverse proxy bukan sekadar βforwarderβ β ia adalah titik kontrol strategis untuk security, observability, dan reliability. Kombinasi Pingora (kecepatan) + jarsWAF (AST detection) + CRS (signature) + eBPF (kernel-level) adalah stack modern yang memanfaatkan kelebihan tiap pendekatan.