Hardening Server Linux & WAF: Melindungi Infrastruktur Web dari Serangan DDoS
Hardening Server Linux & WAF: Melindungi Infrastruktur Web dari Serangan DDoS
1. Konteks Industri & Analisis Akar Masalah
Dalam lanskap infrastruktur web modern, ancaman terhadap ketersediaan layanan (availability) dan integritas data berada pada titik tertinggi sepanjang sejarah. Serangan Distributed Denial of Service (DDoS), eksploitasi Layer 7, serangan brute force terdistribusi, serta kerentanan konfigurasi web server menjadi ancaman harian bagi Sysadmin dan Security Engineer. Tanpa mitigasi yang terstruktur, sebuah aplikasi web berbasis arsitektur modern (Nginx, PHP-FPM, Node.js, atau Go) yang didukung database relasional dan sistem caching seperti Redis akan rentan lumpuh seketika.
Bottleneck keamanan sering kali bukan terletak pada kelemahan kode aplikasi itu sendiri, melainkan pada kealpaan dalam melakukan hardening pada tingkat sistem operasi Linux, manajemen antarmuka jaringan (UFW/iptables), proteksi brute force (Fail2ban), dan konfigurasi proksi reverse/WAF (Nginx + ModSecurity/Cloudflare Edge).
Perbandingan Kondisi: Sebelum vs Sesudah Hardening Komprehensif
| Parameter Keamanan | Kondisi Sebelum (Default / Lemah) | Kondisi Sesudah (Hardened & WAF Integrated) |
|---|---|---|
| Ketahanan HTTP Flood | Server langsung kehabisan resource (CPU/RAM OOM Killer terpanggil) dalam hitungan detik. | Permintaan terfilter otomatis di edge / rate limit di Nginx (HTTP 503/429), CPU stabil di bawah 20%. |
| Brute Force SSH & Panel | Percobaan login SSH tanpa batas, rentan serangan kamus (dictionary attack). | IP penyerang diblokir otomatis via iptables/nftables setelah 3 kali kesalahan gagal autentikasi. |
| Eksploitasi Celah Nginx | Informasi versi terbuka (Server: nginx/1.18.0), rentan version-specific exploit. |
Versi tersembunyi, modul berbahaya dinonaktifkan, header keamanan wajib (HSTS, CSP, X-Frame-Options) aktif. |
| Mitigasi SQLi / XSS | Bergantung sepenuhnya pada sanitasi kode aplikasi internal. | WAF memblokir payload berbahaya sebelum mencapai backend web server atau database. |
[!WARNING] Mengandalkan keamanan aplikasi saja tanpa melakukan hardening pada lapisan OS dan web server adalah kesalahan fatal. Lapisan pertahanan harus bersifat Defense in Depth (berlapis).
2. Konsep Inti & Deep Dive Arsitektur
Arsitektur web modern mengandalkan rantai eksekusi yang panjang: Klien -> Edge CDN/WAF (Cloudflare) -> Load Balancer / Reverse Proxy (Nginx) -> Application Server (PHP-FPM / Node.js / Go) -> Database (MySQL/MariaDB) & Cache (Redis).
[ Client / Botnet ]
│
▼ (HTTP/HTTPS Flood & Brute Force)
[ Cloudflare WAF / Edge Caching ] ──(Ditekan/Di-challenge via JS/Captcha)
│
▼ (Clean Traffic)
[ Linux OS Kernel (TCP SYN Cookies, sysctl tuning) ]
│
▼
[ UFW / iptables & Fail2ban (Dynamic IP Blocking) ]
│
▼
[ Nginx Reverse Proxy (Rate Limiting, SSL/TLS Hardening, Security Headers) ]
├── Static Files (Direct Serve)
└── Dynamic Requests ──► [ PHP-FPM / App Backend ] ──► [ Redis / MySQL ]
Alur penanganan ancaman bekerja secara proaktif dan reaktif:
- Edge Filtering: Serangan volume masif (DDoS Layer 3/4) diredam oleh infrastruktur edge network.
- Kernel & Network Stack: Konfigurasi
sysctl.confmengatur ambang batas koneksi TCP setengah terbuka (SYN backlog) untuk mencegah SYN Flood. - Perimeter Defense: UFW membatasi port akses, sementara Fail2ban memindai log Nginx/SSH secara real-time untuk menjatuhkan ban otomatis.
- Application Gateway: Nginx mengeksekusi rate limiting berdasarkan zona memori bersama (
limit_req_zone) untuk menahan lonjakan request abnormal.
3. Perbandingan Komparatif / Analisis Pendekatan
Dalam mengamankan server dari DDoS dan brute force, terdapat beberapa pendekatan arsitektural yang dapat dipilih:
| Pendekatan / Tools | Kelebihan | Kekurangan | Konsumsi Sumber Daya |
|---|---|---|---|
| UFW / iptables Murni | Sangat ringan, bawaan kernel, tanpa overhead aplikasi. | Tidak dinamis terhadap serangan Layer 7 (HTTP Flood dengan IP acak). | CPU: Sangat Rendah RAM: Minimal |
| Fail2ban + Nginx Log Parsing | Sangat efektif untuk mengatasi brute force, SSH, dan crawler agresif. | Memiliki jeda waktu reaksi (latency) beberapa detik hingga log tertulis ke disk. | CPU: Rendah RAM: Sedang (tergantung ukuran log) |
| Cloudflare WAF / Enterprise Edge | Mencegah serangan sebelum mencapai server asal (Origin IP aman). | Bergantung pada pihak ketiga; biaya tinggi untuk fitur Enterprise. | CPU & RAM Server Asal: Sangat Hemat |
| Nginx Rate Limiting (Built-in) | Mengontrol laju request langsung di web server dengan cepat dan presisi. | Perlu konfigurasi zona memori yang tepat agar tidak salah memblokir pengguna sah. | CPU: Rendah RAM: Sedang (Shared Memory) |
4. Prasyarat Sistem & Persiapan Lingkungan
Sebelum memulai implementasi, pastikan environment Anda memenuhi standar produksi berikut:
- OS: Ubuntu 22.04 LTS / Debian 12 (Fresh Install dengan hak akses
rootatausudo). - Web Server: Nginx (versi stabil terbaru dari repository resmi Nginx, bukan versi bawaan distro lama).
- PHP: PHP 8.2 / 8.3 dengan PHP-FPM.
- Database: MariaDB 10.11+ / MySQL 8.0.
- Network: Akses SSH menggunakan SSH Key (password authentication dinonaktifkan sepenuhnya).
Lakukan pembaruan sistem awal:
sudo apt update && sudo apt upgrade -y
sudo apt install ufw fail2ban curl git ufw -y
5. Panduan Implementasi Langkah demi Langkah
Langkah 1: Hardening Kernel Linux via sysctl.conf
Buat file konfigurasi khusus untuk optimasi kernel guna menahan serangan DoS/SYN Flood.
sudo nano /etc/sysctl.d/99-security-hardening.conf
Isi dengan konfigurasi berikut:
# Melindungi dari SYN Flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# Mengabaikan ICMP Ping (Opsional, cegah network mapping)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Mengabaikan paket sumber route (Source Routing)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Melindungi dari IP Spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Log martian packets (Paket dengan alamat mustahil)
net.ipv4.conf.all.log_martians = 1
# Batasi memori ukuran max socket buffer
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
Terapkan perubahan kernel secara instan:
sudo sysctl --system
Langkah 2: Konfigurasi UFW (Uncomplicated Firewall)
Atur kebijakan default UFW untuk menolak semua koneksi masuk dan mengizinkan semua keluar, lalu buka port esensial saja.
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Izinkan SSH (ubah port jika Anda menggunakan custom port, misal 2222)
sudo ufw allow 22/tcp
# Izinkan HTTP dan HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Aktifkan UFW
sudo ufw enable
Langkah 3: Konfigurasi Fail2ban Tingkat Lanjut untuk Nginx & SSH
Buat file konfigurasi lokal baru untuk Fail2ban.
sudo nano /etc/fail2ban/jail.local
Isi file dengan konfigurasi berikut:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = ufw
backend = systemd
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 60
bantime = 600
Restart layanan Fail2ban:
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
Langkah 4: Hardening Konfigurasi Nginx & PHP-FPM
Buka file konfigurasi utama Nginx untuk memperketat keamanan global.
sudo nano /etc/nginx/nginx.conf
Sesuaikan blok http dengan parameter berikut:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
# Sembunyikan versi Nginx
server_tokens off;
# Batasi ukuran body request untuk mencegah serangan Buffer Overflow / Large Payload
client_max_body_size 10M;
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
# Timeouts untuk mencegah Slowloris Attack
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 15 15;
send_timeout 10;
# Rate Limiting Zone (10MB memori untuk menyimpan state IP, max 10 request per detik per IP)
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Log Format
log_format security_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';
access_log /var/log/nginx/access.log security_log;
error_log /var/log/nginx/error.log warn;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
[!TIP] Pengaturan
client_body_timeoutdanclient_header_timeoutyang singkat sangat efektif mematikan koneksi dari skrip serangan Slowloris yang mencoba menggantung koneksi HTTP.
Langkah 5: Konfigurasi Virtual Host Nginx dengan Rate Limiting & Security Headers
Buat atau sesuaikan file konfigurasi server block domain Anda:
sudo nano /etc/nginx/sites-available/production-app.conf
Gunakan konfigurasi berikut secara lengkap:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root /var/www/html/public;
index index.php index.html index.htm;
# SSL/TLS Hardening (Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Terapkan Rate Limit
limit_req zone=req_limit_per_ip burst=20 nodelay;
limit_conn conn_limit_per_ip 20;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Security: Batasi eksekusi PHP pada direktori tertentu jika diperlukan
fastcgi_read_timeout 60;
}
# Cegah akses ke file tersembunyi (.git, .env, dll)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
Uji konfigurasi Nginx dan lakukan reload:
sudo nginx -t
sudo systemctl reload nginx
6. Bedah Kode & Penjelasan Detail Baris Kunci
-
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;Membuat zona memori bersama sebesar 10 Megabita untuk melacak alamat IP ($binary_remote_addr). Setiap IP dibatasi maksimal 10 request per detik (10r/s). Jika terlampaui, request akan dimasukkan ke antrean atau langsung ditolak. -
burst=20 nodelayParameterburstmengizinkan lonjakan sesaat hingga 20 request melebihi batas rate per detik. Penambahannodelaymemastikan bahwa request yang berada dalam batas burst dilayani seketika tanpa penundaan waktu (latency delay), sementara request setelahnya langsung memunculkan status HTTP 503. -
add_header Strict-Transport-Security ...Header HSTS memaksa browser klien untuk hanya berkomunikasi melalui protokol HTTPS yang aman selama durasi satu tahun (31536000detik), menutup celah serangan SSL Stripping. -
location ~ /\. { deny all; }Blok ekspresi reguler ini memblokir total seluruh akses publik ke direktori atau file yang diawali dengan titik (seperti.git,.env,.htaccess), yang sering menjadi sasaran peretas untuk mencuri kredensial database.
7. Skenario Produksi & Studi Kasus Dunia Nyata
Kasus: Serangan HTTP Flood & Botnet Scraper pada E-Commerce
Sebuah platform e-commerce mengalami lonjakan traffic abnormal hingga 150.000 request/detik pada endpoint pencarian produk (/search?q=...), yang menyebabkan database MySQL mengalami kelebihan beban (connection pool exhaustion) dan server down.
Langkah Mitigasi Eksekusi Lapangan:
- Edge Offloading: Mengaktifkan Under Attack Mode di Cloudflare untuk memaksa semua pengunjung melewati tantangan JavaScript (JS Challenge).
- Nginx Micro-Caching: Untuk request yang berhasil lolos ke server origin, Nginx dikonfigurasi untuk melakukan fast caching pada hasil pencarian berulang menggunakan
proxy_cacheatau FastCGI cache. - Fail2ban Custom Rule: Membuat filter Fail2ban khusus untuk menangkap IP yang mengakses URI
/searchlebih dari 50 kali dalam rentang waktu 10 detik, kemudian memblokirnya di level firewall UFW secara otomatis.
8. Common Pitfalls, Anti-Patterns & Solusi
-
Kesalahan #1: Mengabaikan Header
X-Forwarded-Fordi belakang Cloudflare / Load Balancer- Dampak: Nginx menganggap semua request berasal dari IP Cloudflare, sehingga rate limiting memblokir IP Load Balancer alih-alih IP asli pengunjung.
- Solusi: Gunakan modul
realipNginx:set_real_ip_from 173.245.48.0/20; # ... (tambahkan IP range Cloudflare lainnya) real_ip_header CF-Connecting-IP;
-
Kesalahan #2: Mengatur
bantimeFail2ban Terlalu Singkat- Dampak: Bot penyerang otomatis kembali melakukan brute force setelah beberapa menit.
- Solusi: Terapkan sistem incremental ban time di Fail2ban agar durasi blokir berlipat ganda bagi penyerang berulang.
-
Kesalahan #3: Tidak Melakukan Tes Konfigurasi (
nginx -t) sebelum Reload- Dampak: Server mengalami downtime total saat layanan web direstart akibat kesalahan sintaks kecil.
- Solusi: Selalu jalankan
sudo nginx -t && sudo systemctl reload nginxdalam satu baris perintah.
9. Benchmark, Metrik Kinerja & Tuning Performa
Untuk menguji ketahanan server setelah dilakukan hardening, gunakan tool pengujian beban seperti wrk atau k6.
Contoh pengujian menggunakan wrk dengan 400 koneksi paralel selama 30 detik:
wrk -t12 -c400 -d30s https://example.com/
Interpretasi Hasil Metrik:
- Requests/sec: Menunjukkan seberapa tinggi throughput web server menangani koneksi.
- Latency Distribution: Pastikan latency rata-rata di bawah 50ms di bawah beban normal. Jika lonjakan latency tinggi terjadi bersamaan dengan error 502/504, sesuaikan kapasitas worker PHP-FPM (
pm.max_children) dan ukuran memori buffer Nginx.
10. Checklist Penerapan Produksi & Kesimpulan
Sebelum merilis infrastruktur ke lingkungan produksi publik, pastikan seluruh item dalam checklist berikut telah terpenuhi:
- Autentikasi SSH berbasis password dinonaktifkan sepenuhnya (hanya menggunakan SSH Key).
- UFW aktif dengan prinsip default deny incoming.
- Fail2ban dikonfigurasi dan berjalan aktif memantau SSH, Nginx HTTP Auth, dan Rate Limit.
- Parameter kernel
sysctl.confdiperbarui untuk menahan SYN Flood. - Nginx menyembunyikan versi server (
server_tokens off). - Rate limiting (
limit_req_zone) diterapkan pada endpoint sensitif (login, pencarian, API). - Header keamanan HTTP (HSTS, CSP, X-Frame-Options) terpasang sempurna.
- Sertifikat SSL/TLS menggunakan konfigurasi cipher modern (TLS 1.2 & 1.3).
Melalui pendekatan komprehensif dari tingkat kernel OS hingga lapisan web server dan WAF, infrastruktur web Anda kini memiliki fondasi pertahanan berlapis yang tangguh terhadap ancaman siber modern.