Website yang terbuka di internet selalu menjadi target serangan. Rate limiting dan Web Application Firewall (WAF) adalah dua lapis pertahanan penting untuk melindungi website dari serangan DDoS, brute-force, dan lalu lintas berbahaya. Artikel ini membahas cara mengkonfigurasi keduanya di Nginx.
Pengertian Rate Limiting
Rate limiting adalah teknik membatasi jumlah permintaan yang bisa dilakukan oleh satu alamat IP dalam periode waktu tertentu. Bayangkan rate limiting seperti petugas keamanan yang hanya mengizinkan sejumlah orang masuk ke gedung per menit.
Mengapa Rate Limiting Penting?
- Anti-DDoS: Mencegah serangan denial-of-service
- Brute-Force Protection: Membatasi percobaan login
- Fair Usage: Memastikan semua pengguna mendapat jatah yang adil
- Resource Protection: Melindungi server dari beban berlebih
- API Protection: Mencegah abuse pada API endpoint
Pengertian Web Application Firewall (WAF)
WAF adalah sistem keamanan yang memfilter, memantau, dan memblokir lalu lintas HTTP ke website berdasarkan aturan keamanan. WAF berfungsi seperti polisi lalu lintas yang memeriksa setiap kendaraan yang lewat dan menghentikan yang mencurigakan.
Fungsi WAF
- SQL Injection Protection: Memblokir query SQL berbahaya
- XSS Protection: Memblokir script cross-site scripting
- Bot Detection: Mendeteksi dan memblokir bot jahat
- File Upload Protection: Memblokir upload file berbahaya
- Rate Limiting: Mengatur kecepatan request per IP
- IP Blacklisting: Memblokir IP yang dikenal jahat
Alat yang Dibutuhkan
- Server Debian 13
- Nginx yang sudah terinstal
- Akses SSH sebagai root atau sudo
Rate Limiting dengan Nginx
1. Konfigurasi Dasar
Buka /etc/nginx/nginx.conf:
http {
# Definisikan rate limit zone
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
# Zone untuk API (lebih ketat)
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
# Zone untuk login (sangat ketat)
limit_req_zone $binary_remote_addr zone=login:10m rate=3r/m;
# ...
}Penjelasan:
limit_req_zone: Mendefinisikan zone baru$binary_remote_addr: Menggunakan IP client sebagai identifierzone=general:10m: Nama zone, 10MB memoryrate=10r/s: 10 requests per detik
2. Terapkan Rate Limiting ke Server Block
server {
listen 80;
server_name masyarakat.id;
# General rate limit
location / {
limit_req zone=general burst=20 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
# API rate limit (lebih ketat)
location /api/ {
limit_req zone=api burst=10 nodelay;
limit_req_status 429;
proxy_pass http://api_backend;
}
# Login rate limit (sangat ketat)
location /login {
limit_req zone=login burst=5 nodelay;
limit_req_status 429;
proxy_pass http://backend/login;
}
}Penjelasan:
burst=20: Mengizinkan 20 request berlebih dalam burstnodelay: Request berlebih tidak ditunda, langsung diproseslimit_req_status 429: Status code saat limit terlampaui (Too Many Requests)
3. Rate Limit Berdasarkan Lokasi Spesifik
# Batasi akses file
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
limit_req zone=static burst=50 nodelay;
expires 30d;
}
# Batasi upload
location ~* /upload/ {
limit_req zone=general burst=5 nodelay;
client_max_body_size 10m;
}4. Hanya Batasi Method Tertentu
# Limit hanya POST requests
limit_req_zone $binary_remote_addr zone=post_limit:10m rate=2r/s;
location ~* ^/(login|register|contact)$ {
limit_req zone=post_limit burst=5 nodelay;
limit_req_method POST;
}Web Application Firewall (WAF) dengan Nginx
1. ModSecurity (WAF Lengkap)
Instal ModSecurity:
apt install libnginx-modsecurity -yKonfigurasi:
# Aktifkan ModSecurity di Nginx
nano /etc/nginx/conf.d/modsecurity.confmodsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;Download OWASP Core Rule Set:
git clone https://github.com/coreruleset/coreruleset.git /etc/nginx/modsecurity/crs/
cp /etc/nginx/modsecurity/crs/crs-setup.conf.example /etc/nginx/modsecurity/crs/crs-setup.conf2. NAXSI (WAF Ringan)
NAXSI adalah WAF ringan yang mudah dikonfigurasi:
apt install libnginx-mod-naxsi -yKonfigurasi:
# /etc/nginx/naxsi_core.rules
Include /etc/nginx/naxsi_core.rules;
LearningMode;
# Deny rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;3. WAF Manual dengan Nginx (Tanpa ModSecurity)
Konfigurasi manual yang efektif:
# Blokir user-agent mencurigakan
map $http_user_agent $bad_bot {
default 0;
"~*(sqlmap|nikto|nmap|masscan|dirbuster|gobuster)" 1;
"~*bot" 0;
}
# Blokir IP jahat
map $remote_addr $block_ip {
default 0;
192.168.1.100 1;
10.0.0.50 1;
}
# Blokir parameter SQL injection
map $args $sqli_attack {
default 0;
"~*(union.*select|drop.*table|insert.*into|delete.*from)" 1;
"~*(<script|javascript:|onclick=)" 1;
}
server {
listen 80;
server_name masyarakat.id;
# Blokir IP
if ($block_ip) {
return 403;
}
# Blokir user-agent jahat
if ($bad_bot) {
return 403;
}
# Blokir SQL injection
if ($sqli_attack) {
return 403;
}
# Limit request size
client_max_body_size 10m;
# ...
}4. Blokir User-Agent dan Referrer Jahat
# Blokir script kiddie tools
map $http_user_agent $suspicious_ua {
default 0;
"~*(ZmEu|Python-requests|curl/7\.28|Wget/1\.13)" 1;
"~*(libwww-perl|LWP::Simple|WinInet)" 1;
}
if ($suspicious_ua) {
return 403;
}Rate Limiting Lanjutan
1. Rate Limit Berdasarkan Subnet
# Limit IP internal
limit_req_zone $binary_remote_addr zone=internal:10m rate=100r/s;
# Allow internal network, restrict external
geo $internal_network {
default 0;
10.0.0.0/8 1;
192.168.0.0/16 1;
}2. Distributed Rate Limiting
# Gunakan Redis untuk rate limiting terdistribusi
# Install nginx-module-njs
apt install libnginx-mod-njs -y3. Adaptive Rate Limiting
# Auto adjust rate limit berdasarkan traffic
map $request_time $adaptive_limit {
default 10r/s;
"~*[0-9]\.[0-9]s" 2r/s; # Lambat = lebih ketat
"~*[0-9]ms" 50r/s; # Cepat = lebih longgar
}Konfigurasi SSL Rate Limiting
# Limit SSL handshake
limit_req_zone $binary_remote_addr zone=ssl:10m rate=5r/s;
server {
listen 443 ssl;
server_name masyarakat.id;
location / {
limit_req zone=ssl burst=5;
# SSL configuration
ssl_certificate /etc/letsencrypt/live/masyarakat.id/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/masyarakat.id/privkey.pem;
}
}Monitoring Rate Limiting
1. Cek IP yang Diblokir
# Cek log Nginx
grep "429" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# Cek request terbanyak
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -202. Dashboard Status
# Instal GoAccess untuk monitoring real-time
apt install goaccess -y
goaccess /var/log/nginx/access.log3. Alert Otomatis
# Cek jumlah 429 errors
ERROR_COUNT=$(grep -c " 429 " /var/log/nginx/access.log)
if [ $ERROR_COUNT -gt 100 ]; then
echo "ALERT: Terlalu banyak request diblokir!" | mail -s "Rate Limit Alert" [email protected]
fiTroubleshooting
1. Semua User Terblokir
Penyebab: Rate limit terlalu ketat atau burst terlalu kecil. Solusi:
# Naikkan rate limit
rate=50r/s;
burst=100;
# Cek log
tail -50 /var/log/nginx/error.log2. Rate Limit Tidak Berfungsi
Penyebab: Konfigurasi belum di-reload atau zone belum didefinisikan. Solusi:
# Pastikan zone ada di http block
nginx -t
systemctl reload nginx3. False Positif
Penyebab: User legitimate terkena rate limit. Solusi:
# Tambahkan IP yang diizinkan
map $remote_addr $whitelist {
default 0;
192.168.1.50 1;
10.0.0.0/8 1;
}
if ($whitelist) {
set $limit '';
}4. ModSecurity Mengembalikan Error 500
Penyebab: Aturan WAF salah atau versi tidak kompatibel. Solusi:
# Cek log ModSecurity
tail -100 /var/log/nginx/modsec_audit.log
# Nonaktifkan sementara
nano /etc/nginx/conf.d/modsecurity.conf
modsecurity off;5. Performance Melambat
Penyebab: WAF terlalu berat atau terlalu banyak aturan aktif. Solusi:
# Nonaktifkan aturan yang tidak perlu
# Kurangi jumlah rule dalam crs-setup.conf
systemctl reload nginxKesimpulan
Rate limiting dan WAF adalah dua lapis pertahanan esensial untuk melindungi website dari serangan. Rate limiting menjaga server dari beban berlebih dengan membatasi request per IP, sementara WAF memfilter lalu lintas berbahaya berdasarkan aturan keamanan yang canggih.
Kombinasi keduanya memberikan perlindungan yang komprehensif — mulai dari serangan DDoS, SQL injection, XSS, hingga brute-force attacks. Dengan monitoring yang tepat, Anda dapat mendeteksi dan merespons ancaman secara proaktif.
Kunci utama:
- Mulai dengan rate limit yang reasonable, lalu sesuaikan berdasarkan pola traffic
- Selalu backup konfigurasi sebelum mengubah aturan WAF
- Monitor log secara rutin untuk mendeteksi pola serangan baru
- Gunakan OWASP Core Rule Set untuk WAF yang komprehensif
- Test konfigurasi di staging sebelum diterapkan ke production
- Kombinasikan rate limiting, WAF, dan firewall (UFW/Fail2Ban) untuk pertahanan berlapis
Catatan penting: Jangan pernah mengaktifkan WAF dalam mode blocking tanpa terlebih dahulu mengujinya dalam mode detection/demiling. Aturan WAF yang salah bisa memblokir pengguna legitimate dan merusak bisnis Anda. Selalu gunakanSecRuleEngine DetectionOnlyterlebih dahulu, pantau log selama beberapa hari, lalu baru aktifkanSecRuleEngine On. Ingat, WAF bukan pengganti keamanan aplikasi yang baik — ini adalah lapisan pertahanan tambahan, bukan solusi akhir.
Ingat: Keamanan website adalah proses berkelanjutan. Serangan semakin canggih setiap hari, dan konfigurasi keamanan Anda harus selalu diperbarui. Jangan pernah merasa bahwa website Anda sudah "cukup aman" — selalu ada ruang untuk perbaikan dan peningkatan. Monitor, audit, dan tingkatkan konfigurasi keamanan secara berkala untuk melindungi website dan penggunanya.
Dipublikasikan untuk membantu para administrator server mengamankan website dari serangan modern.