DDoS(Distributed Denial of Service) 공격은 대량의 요청으로 서비스를 마비시키는 공격입니다. 웹 서버 로그를 분석하면 공격 초기 단계에서 이상 징후를 포착하고 대응할 수 있습니다.
단시간 내 대량의 정상 요청처럼 보이는 트래픽:
`` 203.0.113.42 - - [10/Oct/2024:14:00:01 +0000] "GET / HTTP/1.1" 200 1234 203.0.113.42 - - [10/Oct/2024:14:00:01 +0000] "GET / HTTP/1.1" 200 1234 203.0.113.42 - - [10/Oct/2024:14:00:01 +0000] "GET / HTTP/1.1" 200 1234 ... (초당 수백~수천 건) `
연결을 느리게 유지하여 서버 리소스 고갈:
` 198.51.100.7 - - [10/Oct/2024:14:00:00 +0000] "GET / HTTP/1.1" 408 - 198.51.100.7 - - [10/Oct/2024:14:00:30 +0000] "GET / HTTP/1.1" 408 - `
응답 코드 408(Request Timeout)이 반복됩니다.
무거운 쿼리나 API 엔드포인트만 집중 공격:
` 192.0.2.100 - - [10/Oct/2024:14:00:01 +0000] "POST /api/search HTTP/1.1" 200 4821 192.0.2.100 - - [10/Oct/2024:14:00:02 +0000] "POST /api/search HTTP/1.1" 200 4821 ... (같은 경로 반복) `
`bash awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-4 | sort | uniq -c | sort -rn | head -20 `
출력 예시:
` 15432 [10/Oct/2024:14:00 1234 [10/Oct/2024:14:01 1102 [10/Oct/2024:13:59 `
평소 분당 1,000건인데 갑자기 15,000건 → DDoS 의심
단일 IP가 아닌 수천 개 IP에서 동시 공격:
`bash awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-4 | uniq -c | awk '$1 > 100' | wc -l `
100건 이상 요청한 분:초 단위 구간이 많으면 분산 공격입니다.
`nginx http { limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=addr:10m; }
server { location / { limit_req zone=general burst=20 nodelay; limit_conn addr 10; } } `
: IP당 초당 10 요청: 일시적으로 20건까지 허용: IP당 최대 10개 연결DDoS 패턴을 감지하여 자동 차단:
/etc/fail2ban/filter.d/nginx-req-limit.conf:
`ini [Definition] failregex = limiting requests, excess: . by zone ., client: `
/etc/fail2ban/jail.local:
`ini [nginx-req-limit] enabled = true filter = nginx-req-limit logpath = /var/log/nginx/error.log maxretry = 5 findtime = 60 bantime = 3600 `
CDN을 사용하면 로그에 CDN IP만 기록됩니다. 실제 클라이언트 IP는 CF-Connecting-IP 헤더에 있습니다.
`nginx log_format cloudflare '$http_cf_connecting_ip - $remote_user [$time_local] ...'; access_log /var/log/nginx/access.log cloudflare; ``
DDoS는 초당 요청 수, 동일 IP 반복, 408 타임아웃 증가 패턴으로 탐지할 수 있습니다. Nginx Rate Limiting과 Fail2Ban을 조합하면 소규모 공격은 자동 차단 가능하지만, 대규모 봇넷 공격은 CDN/WAF 서비스 없이는 방어가 어렵습니다.