서버 운영 중 가장 자주 마주치는 보안 이벤트 중 하나가 브루트포스(무차별 대입) 공격입니다. 공격자는 자동화 도구를 이용해 짧은 시간 안에 수천 번의 로그인 시도를 반복하며, 이 흔적은 Nginx 액세스 로그에 그대로 남습니다.
Nginx의 기본 Combined Log Format에서 브루트포스는 다음과 같은 패턴으로 나타납니다.
203.0.113.42 - - [10/May/2024:03:21:05 +0000] "POST /wp-login.php HTTP/1.1" 401 152 "-" "python-requests/2.28.0"
203.0.113.42 - - [10/May/2024:03:21:06 +0000] "POST /wp-login.php HTTP/1.1" 401 152 "-" "python-requests/2.28.0"
203.0.113.42 - - [10/May/2024:03:21:07 +0000] "POST /wp-login.php HTTP/1.1" 401 152 "-" "python-requests/2.28.0"
주목해야 할 특징:
python-requests, curl, Nikto 등 자동화 도구grep 'POST /wp-login.php' /var/log/nginx/access.log | grep ' 401 ' \
| awk '{print $1}' | sort | uniq -c | sort -rn | head -20
출력 예시:
3241 203.0.113.42
87 198.51.100.7
12 192.0.2.100
한 IP에서 수천 건이 나온다면 브루트포스로 판단할 수 있습니다.
grep '203.0.113.42' /var/log/nginx/access.log \
| awk '{print $4}' | cut -d: -f1-3 | sort | uniq -c
정상 사용자는 분당 수 건이지만, 봇은 분당 수백 건이 기록됩니다.
grep -v 'Mozilla\|Chrome\|Safari\|Firefox' /var/log/nginx/access.log \
| awk '{print $12}' | sort | uniq -c | sort -rn | head -20
브루트포스 공격은 특정 경로에 집중됩니다.
| 경로 | 공격 유형 |
|---|---|
/wp-login.php | WordPress 관리자 계정 탈취 |
/admin, /administrator | 관리자 패널 무단 접근 |
/api/auth, /api/login | API 인증 엔드포인트 공격 |
/xmlrpc.php | WordPress XML-RPC 악용 |
/.env, /config.php | 설정 파일 노출 시도 |
/etc/nginx/nginx.conf 또는 사이트 설정 파일에 추가:
geo $blocked_ip {
default 0;
203.0.113.42 1;
198.51.100.7 1;
}
server { if ($blocked_ip) { return 403; } }
location = /wp-login.php {
allow 192.168.1.0/24;
deny all;
}
http {
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
}
server { location = /wp-login.php { limit_req zone=login burst=3 nodelay; } }
분당 5회를 초과하는 요청은 503으로 자동 차단됩니다.
/etc/fail2ban/filter.d/nginx-bruteforce.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =
/etc/fail2ban/jail.local:
[nginx-bruteforce]
enabled = true
filter = nginx-bruteforce
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 60
bantime = 3600
1분 내 10회 이상 시도한 IP를 1시간 차단합니다.
커맨드라인 없이 로그 파일만 업로드하면 위 분석을 자동으로 수행합니다.
브루트포스 공격은 자동화 도구로 진행되기 때문에 로그에 매우 규칙적인 패턴을 남깁니다. 핵심은 같은 IP에서 짧은 시간 내 반복되는 고정 경로 요청을 탐지하는 것입니다. Nginx Rate Limiting과 Fail2Ban을 조합하면 대부분의 자동화 공격을 사전에 차단할 수 있습니다.