📑 Daftar Isi
- Pendahuluan
- Gejala — Apa yang Terjadi?
- Root Cause — Apa yang Salah?
- 1. Distributed Automated Attack
- 2. Multi-Vector Attack
- 3. Server Mulai Overload (503 Error)
- 4. User Agent & Referrer Palsu
- Cara Membaca Log Apache — Step by Step
- Step-by-Step Solution — Mengamankan Server cPanel + CloudLinux
- Langkah 1: Identifikasi & Blok IP Brute Force
- Langkah 2: Rate Limiting di Apache
- Langkah 3: Konfigurasi CloudLinux Limits
- Langkah 4: Install & Konfigurasi ModSecurity Rules
- Langkah 5: Konfigurasi CloudLinux PHP Selector
- Langkah 6: Monitor & Verifikasi
- Pro Tips & Warnings
- FAQ
- Q: Kenapa status code berubah dari 200 ke 500 ke 503?
- Q: Bagaimana membedakan bot attack dan traffic manusia asli?
- Q: Apakah blok IP via CSF permanen?
- Q: Apakah CloudLinux bisa melindungi dari serangan ini?
- Kesimpulan
Pendahuluan
Suatu sore sekitar jam 4 sore, saya lagi santai nongkrong di ruang NOC sambil ngopi. Monitoring Telegram bunyi — tapi bukan notifikasi error biasa. Bunyinya lebih kayak alarm: “Server load meningkat drastis, response time naik 300%”. Saya langsung buka terminal dan jalankan tail -f di access log salah satu client.
Yang saya lihat bikin bulu kuduk berdiri. Bukan karena error-nya parah — tapi karena polanya terlalu rapi. Ratusan request POST datang dari 9 IP berbeda dalam hitungan detik, menargetkan endpoint yang berbeda-beda: /wp-login.php, /api/comments, /api/subscribe, /api/news. User agent-nya pun beragam — ada Chrome, Firefox, Safari, bahkan mobile browser. Referrer-nya dari Google, Bing, Yahoo.
Tapi justru kerapian inilah yang mencurigakan. Manusia asli tidak akan secepat ini mengirim request ke 4 endpoint berbeda dari IP yang berbeda. Ini bukan manusia — ini bot yang dirancang untuk menyerang server Anda dari banyak sisi sekaligus.
Gejala — Apa yang Terjadi?
Log access Apache menunjukkan aktivitas mencurigakan dari 9 IP berbeda:
10.0.0.1 - - [20/Jul/2026:16:43:55 +0700] "POST /api/comments HTTP/1.1" 200 0 "https://www.bing.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.1 - - [20/Jul/2026:16:43:55 +0700] "POST /api/subscribe HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.3 - - [20/Jul/2026:16:43:56 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36"
10.0.0.4 - - [20/Jul/2026:16:43:56 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36 Edg/10.0.0.2"
10.0.0.5 - - [20/Jul/2026:16:43:56 +0700] "POST /api/comments HTTP/1.1" 500 384 "https://www.yahoo.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.5 - - [20/Jul/2026:16:43:56 +0700] "POST /api/news HTTP/1.1" 200 0 "https://www.yahoo.com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
10.0.0.4 - - [20/Jul/2026:16:43:57 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.5 - - [20/Jul/2026:16:43:57 +0700] "POST /api/comments HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36"
10.0.0.4 - - [20/Jul/2026:16:43:57 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.6 - - [20/Jul/2026:16:43:57 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
10.0.0.1 - - [20/Jul/2026:16:43:58 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.7 Safari/537.36"
10.0.0.3 - - [20/Jul/2026:16:43:58 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.bing.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.8 - - [20/Jul/2026:16:43:58 +0700] "POST /api/news HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15"
10.0.0.4 - - [20/Jul/2026:16:43:58 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.3 - - [20/Jul/2026:16:43:58 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
10.0.0.8 - - [20/Jul/2026:16:43:58 +0700] "POST /api/comments HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.1 - - [20/Jul/2026:16:43:59 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.yahoo.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.7 Safari/537.36"
10.0.0.5 - - [20/Jul/2026:16:43:59 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.5 - - [20/Jul/2026:16:43:59 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.bing.com/" "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.4 - - [20/Jul/2026:16:43:59 +0700] "POST /api/comments HTTP/1.1" 500 384 "https://www.yahoo.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.7 Safari/537.36"
10.0.0.9 - - [20/Jul/2026:16:43:59 +0700] "POST /api/news HTTP/1.1" 500 384 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.8 - - [20/Jul/2026:16:43:59 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.yahoo.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.9 - - [20/Jul/2026:16:43:59 +0700] "POST /api/comments HTTP/1.1" 500 384 "https://www.yahoo.com/" "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.1 - - [20/Jul/2026:16:43:59 +0700] "POST /api/comments HTTP/1.1" 500 384 "https://www.google.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.4 - - [20/Jul/2026:16:43:59 +0700] "POST /api/news HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.4 - - [20/Jul/2026:16:44:03 +0700] "POST /api/news HTTP/1.1" 503 807 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.4 - - [20/Jul/2026:16:44:11 +0700] "POST /api/comments HTTP/1.1" 503 807 "https://www.yahoo.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.5 - - [20/Jul/2026:16:44:13 +0700] "POST /api/news HTTP/1.1" 503 807 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36"
10.0.0.5 - - [20/Jul/2026:16:44:14 +0700] "POST /api/comments HTTP/1.1" 503 807 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.4 - - [20/Jul/2026:16:44:06 +0700] "POST /api/comments HTTP/1.1" 503 807 "https://www.google.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.7 Safari/537.36"
10.0.0.4 - - [20/Jul/2026:16:44:09 +0700] "POST /api/comments HTTP/1.1" 503 807 "-" "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.4 - - [20/Jul/2026:16:44:07 +0700] "POST /api/subscribe HTTP/1.1" 503 807 "https://www.yahoo.com/" "Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36"
10.0.0.5 - - [20/Jul/2026:16:44:11 +0700] "POST /api/subscribe HTTP/1.1" 503 807 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/121.0"
10.0.0.6 - - [20/Jul/2026:16:44:01 +0700] "POST /api/news HTTP/1.1" 500 384 "https://www.bing.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.2 Safari/537.36 Edg/10.0.0.2"
10.0.0.5 - - [20/Jul/2026:16:44:09 +0700] "POST /api/comments HTTP/1.1" 503 807 "https://www.bing.com/" "Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36"
10.0.0.4 - - [20/Jul/2026:16:44:14 +0700] "POST /api/comments HTTP/1.1" 503 807 "https://www.bing.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/10.0.0.7 Safari/537.36"
Gejala-gejalanya:
- 9 IP berbeda menyerang dalam waktu bersamaan (16:43:55 — 16:44:14, hanya 19 detik)
- 4 endpoint berbeda menjadi target:
/wp-login.php,/api/comments,/api/subscribe,/api/news - Status code berubah: dari
200(berhasil) →500(error internal) →503(server overload) seiring berjalannya serangan - User agent beragam: Chrome, Firefox, Safari, Mobile — menunjukkan bot yang mensimulasikan berbagai browser
- Referrer palsu: Google, Bing, Yahoo — untuk menutupi jejak serangan
Root Cause — Apa yang Salah?
1. Distributed Automated Attack
Serangan ini menggunakan 9 IP berbeda secara simultan. Ini bukan brute force biasa dari satu IP — ini adalah distributed attack yang dirancang untuk:
- Menghindari rate limiting per IP (karena setiap IP hanya mengirim beberapa request)
- Membebani server dari banyak sisi sekaligus
- Membuat deteksi menjadi lebih sulit (setiap IP terlihat “normal” secara individual)
2. Multi-Vector Attack
Serangan ini tidak hanya menargetkan satu endpoint. Ada 4 target berbeda:
/wp-login.php— brute force login WordPress/api/comments— mencoba menambahkan spam comment atau mencari vulnerability di API/api/subscribe— mencoba exploit email subscription (bisa untuk email bombing)/api/news— mencoba exploit news API (bisa untuk injection atau data theft)
Ini disebut multi-vector attack — serangan yang menargetkan beberapa titik lemah sekaligus untuk memaksimalkan dampak.
3. Server Mulai Overload (503 Error)
Perhatikan evolusi status code dalam log:
- 16:43:55 — 16:43:59: Semua request return
200(berhasil). Server masih kuat - 16:43:59 — 16:44:01: Mulai muncul
500(Internal Server Error). Server mulai kesulitan - 16:44:03 — 16:44:14: Banyak
503(Service Unavailable). Server sudah overloaded
Error 503 artinya server sudah tidak bisa melayani request — Apache atau PHP-FPM sudah mencapai batas maksimum proses/koneksi. Ini adalah tanda bahwa serangan sudah berhasil membebani server.
4. User Agent & Referrer Palsu
Bot ini menggunakan user agent dan referrer yang beragam untuk meniru traffic manusia asli. Tapi ada pola yang bisa kita deteksi:
- User agent terlalu “bersih” — tidak ada cookie, session, atau header tambahan yang biasanya ada di browser asli
- Referrer tidak konsisten — IP yang sama bisa berganti referrer dari Google ke Bing ke Yahoo dalam hitungan detik
- Timing terlalu seragam — request datang dengan interval yang sangat konsisten (1-2 detik), bukan pola acak seperti manusia asli
Cara Membaca Log Apache — Step by Step
Format Log Apache
Format standar Apache Combined Log Format adalah:
%h - - %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"
| Field | Contoh | Arti |
%h |
10.0.0.1 |
Source IP address (client) |
- |
- |
Remote log name (biasanya kosong) |
- |
- |
Remote user (kosong untuk non-auth) |
%t |
[20/Jul/2026:16:43:55 +0700] |
Waktu akses (format CLF) |
%r |
"POST /api/comments HTTP/1.1" |
Request line: Method + Path + Protocol |
%>s |
200 |
Status code HTTP |
%b |
0 |
Size response dalam bytes |
%{Referer}i |
"https://www.google.com/" |
Halaman asal (referrer) |
%{User-Agent}i |
"Mozilla/5.0 ..." |
User agent browser/client |
Membaca Request Spesifik
Mari kita bongkar satu baris log secara detail:
10.0.0.3 - - [20/Jul/2026:16:43:56 +0700] "POST /wp-login.php HTTP/1.1" 200 0 "https://www.google.com/" "Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36"
| Bagian | Nilai | Arti |
| Source IP | 10.0.0.3 |
IP yang melakukan request |
| Timestamp | [20/Jul/2026:16:43:56 +0700] |
20 Juli 2026, jam 16:43:56, timezone GMT+7 |
| Method | POST |
HTTP method — mengirim data ke server |
| Path | /wp-login.php |
Endpoint WordPress login |
| Protocol | HTTP/1.1 |
Versi HTTP yang digunakan |
| Status | 200 |
Response berhasil (login form ditampilkan atau attempt dicatat) |
| Size | 0 |
Response body 0 bytes (redirect atau kosong) |
| Referrer | https://www.google.com/ |
Dari Google — ini palsu untuk menutupi jejak |
| User Agent | Chrome/120... Mobile Safari/537.36 |
Browser Android — ini juga palsu |
Menghitung Serangan dari Log
Untuk melihat seberapa parah serangan, jalankan command berikut:
# Hitung jumlah request per IP
awk '{print $1}' /usr/local/apache/logs/domlogs/client-a.com-ssl_log |
sort | uniq -c | sort -rn | head -n 10
# Output:
# 15423 10.0.0.1
# 12847 10.0.0.2
# 9834 10.0.0.3
# Hitung jumlah request per endpoint
awk '{print $7}' /usr/local/apache/logs/domlogs/client-a.com-ssl_log |
sort | uniq -c | sort -rn | head -n 10
# Output:
# 12432 /wp-login.php
# 8721 /api/comments
# 6543 /api/subscribe
# 5432 /api/news
# Hitung distribusi status code
awk '{print $9}' /usr/local/apache/logs/domlogs/client-a.com-ssl_log |
sort | uniq -c | sort -rn
# Output:
# 34521 200
# 8721 500
# 6543 503
Step-by-Step Solution — Mengamankan Server cPanel + CloudLinux
Mengubah config Apache, firewall, atau CloudLinux bisa memutus akses website di server. Sebelum melanjutkan:
- Backup config yang ada —
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak - Pastikan Anda punya akses console/SSH — jika config salah, website down dan Anda perlu akses langsung
- Test config sebelum restart — selalu jalankan
apachectl configtest - Jangan blok IP internal secara permanen — IP bisa berubah
Langkah 1: Identifikasi & Blok IP Brute Force
Pertama, identifikasi IP yang melakukan serangan dan blok via firewall:
# Hitung IP dengan request terbanyak
awk '{print $1}' /usr/local/apache/logs/domlogs/client-a.com-ssl_log |
sort | uniq -c | sort -rn | head -n 20 > /tmp/attacker-ips.txt
cat /tmp/attacker-ips.txt
# Blok IP dengan CSF (cPanel Firewall)
csf -d 10.0.0.1 "Brute force attack - multi-vector"
csf -d 10.0.0.2 "Brute force attack - multi-vector"
csf -d 10.0.0.3 "Brute force attack - multi-vector"
csf -d 10.0.0.4 "Brute force attack - multi-vector"
csf -d 10.0.0.5 "Brute force attack - multi-vector"
csf -d 10.0.0.6 "Brute force attack - multi-vector"
csf -d 10.0.0.8 "Brute force attack - multi-vector"
csf -d 10.0.0.9 "Brute force attack - multi-vector"
# Restart CSF
csf -r
Langkah 2: Rate Limiting di Apache
Tambahkan rate limiting langsung di Apache config. Untuk cPanel, edit /etc/httpd/conf.d/rate-limit.conf:
# Rate limiting per IP
<IfModule mod_ratelimit.c>
<Location "/wp-login.php">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 5
</Location>
<Location "/api/">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 10
</Location>
</IfModule>
Atau menggunakan ModSecurity (lebih efektif untuk cPanel):
# Tambahkan di /etc/httpd/conf.d/mod_security.conf
SecRule REQUEST_URI "@beginsWith /wp-login.php"
"id:1001,phase:1,deny,status:429,
setenv:wp-login-rate-limit,
msg:'WP Login Rate Limit'"
Langkah 3: Konfigurasi CloudLinux Limits
Di CloudLinux, pastikan LVE limits tidak terlalu tinggi untuk mencegah satu account membebani server:
# Cek LVE limits untuk semua user
lveinfo --period=1M
# Set limits untuk user yang terdampak
lvectl set-user client-a --maxmem=512M --maxcpu=50 --maxio=50000
# Cek current usage
lveinfo --period=1h --sort=memusage | head -20
Pastikan MySQL/MariaDB tidak kehabisan koneksi:
# Cek jumlah koneksi aktif
mysql -e "SHOW STATUS LIKE 'Threads_connected';"
# Cek max connections
mysql -e "SHOW VARIABLES LIKE 'max_connections';"
# Jika terlalu tinggi, kurangi di /etc/my.cnf
# max_connections = 100
# wait_timeout = 60
# interactive_timeout = 60
Langkah 4: Install & Konfigurasi ModSecurity Rules
ModSecurity adalah Web Application Firewall (WAF) yang bisa mendeteksi dan memblokir serangan di level HTTP:
# Cek apakah ModSecurity terinstall
apachectl -M | grep security
# Jika belum, install via EasyApache (cPanel)
# WHM → EasyApache → Apache → Include → mod_security
# Aktifkan rules OWASP ModSecurity Core Rule Set
# WHM → ModSecurity → Configure → Enable OWASP CRS
Rules OWASP CRS akan otomatis mendeteksi:
- Brute force pada login page
- SQL injection via API
- Cross-site scripting (XSS)
- Path traversal attempts
Langkah 5: Konfigurasi CloudLinux PHP Selector
Pastikan PHP execution limits tidak terlalu tinggi:
# Cek PHP limits untuk user
cat /home/client-a/public_html/.user.ini 2>/dev/null
# Set recommended limits di /opt/cpanel/ea-php*/root/etc/php.ini
max_execution_time = 30
max_input_time = 60
memory_limit = 256M
post_max_size = 8M
upload_max_filesize = 5M
Langkah 6: Monitor & Verifikasi
Setelah semua konfigurasi diterapkan, monitor log secara real-time:
# Monitor serangan yang masih berlangsung
tail -f /usr/local/apache/logs/domlogs/client-a.com-ssl_log |
grep -E '429|503|rate.limit'
# Cek IP yang sudah diblokir
csf -g 10.0.0.1
# Cek jumlah request per menit (harus menurun)
watch -n 5 'tail -1000 /usr/local/apache/logs/domlogs/client-a.com-ssl_log |
awk "{print $4}" | cut -d: -f1-3 | uniq -c | tail -5'
Pro Tips & Warnings
- Gunakan CSF (ConfigServer Security & Firewall) — CSF lebih mudah digunakan di cPanel dibanding iptables langsung. Install via WHM → Plugin
- Aktifkan ModSecurity — WAF bisa mendeteksi serangan yang tidak terlihat dari log biasa (SQL injection, XSS, dll)
- Gunakan CloudLinux CageFS — CageFS mengisolasi setiap user sehingga serangan dari satu account tidak bisa mempengaruhi account lain
- Monitor LVE statistics — CloudLinux LVE menunjukkan resource usage per user. Jika ada user yang menggunakan resource berlebihan, bisa jadi tanda compromised account
- Gunakan Imunify360 — Solusi berbayar tapi sangat efektif untuk melindungi server dari brute force, malware, dan serangan lainnya
- Backup config sebelum edit — selalu backup
/etc/httpd/conf/httpd.confdan config lainnya
FAQ
Q: Kenapa status code berubah dari 200 ke 500 ke 503?
Evolusi status code menunjukkan server mulai overload: 200 = server masih kuat melayani request, 500 = PHP/MySQL mulai kesulitan (error internal), 503 = Apache sudah mencapai batas maksimum proses dan menolak request baru. Jika Anda melihat banyak 503, segera blok IP attacker karena server sudah tidak bisa menangani beban.
Q: Bagaimana membedakan bot attack dan traffic manusia asli?
Perhatikan polanya: (1) Bot menggunakan user agent beragam tapi tidak konsisten, (2) Referrer berganti-ganti terlalu cepat, (3) Timing request terlalu seragam (1-2 detik interval), (4) Request datang ke banyak endpoint sekaligus, (5) Tidak ada cookie atau session yang di-cache. Manusia asli biasanya konsisten dalam user agent dan referrer.
Q: Apakah blok IP via CSF permanen?
Tidak permanen. CSF akan auto-unblock setelah timeout (default 3600 detik = 1 jam). Anda bisa cek daftar IP yang diblokir dengan csf -g [IP] dan unblock manual dengan csf -dr [IP]. Untuk blok permanen, gunakan csf -d [IP] "alasan" — IP akan tetap diblokir meskipun server restart.
Q: Apakah CloudLinux bisa melindungi dari serangan ini?
CloudLinux membantu dengan LVE (Lightweight Virtual Environment) yang membatasi resource per user. Tapi CloudLinux tidak secara langsung memblokir serangan — ia memastikan satu user tidak bisa menghabiskan semua resource server. Untuk memblokir serangan, Anda tetap perlu firewall (CSF), WAF (ModSecurity), dan rate limiting.
Kesimpulan
Log Apache adalah sumber informasi pertama yang harus Anda cek ketika server terasa lambat atau error. Dengan memahami format log — mulai dari source IP, timestamp, request method, status code, hingga user agent — Anda bisa mengenali pola serangan sejak dini dan mengambil langkah pencegahan sebelum server benar-benar down.
Dari log yang saya analisis, serangan ini menggunakan multi-vector approach: menargetkan 4 endpoint berbeda dari 9 IP secara simultan. Bot berusaha menghindari deteksi dengan user agent dan referrer yang beragam. Tapi pola timing yang terlalu seragam dan perubahan status code dari 200 → 500 → 503 memberitahu kita bahwa ini adalah serangan terkoordinasi yang sudah berhasil membebani server.
Pelajaran terbesar: jangan hanya melihat satu baris log. Lihat polanya. Satu request POST ke /wp-login.php mungkin terlihat normal. Tapi 9 IP yang menyerang 4 endpoint dalam 19 detik dengan status code yang berubah — itu adalah pola yang harus segera ditangani.
Author: NOC Engineer — ditulis berdasarkan pengalaman menangani multi-vector attack di server cPanel + CloudLinux production.