← 블로그 목록
작성일: 2026-05-10 Nginx보안브루트포스

Nginx 액세스 로그로 브루트포스 공격 탐지하기

서버 운영 중 가장 자주 마주치는 보안 이벤트 중 하나가 브루트포스(무차별 대입) 공격입니다. 공격자는 자동화 도구를 이용해 짧은 시간 안에 수천 번의 로그인 시도를 반복하며, 이 흔적은 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" `

주목해야 할 특징:

  • 같은 IP에서 같은 경로짧은 간격 반복 요청
  • 응답 코드 401(인증 실패) 또는 403(접근 거부)
  • User-Agent가 python-requests, curl, Nikto 등 자동화 도구

grep으로 빠르게 의심 IP 찾기

1. 특정 경로에 대한 401 응답 집계

`bash 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에서 수천 건이 나온다면 브루트포스로 판단할 수 있습니다.

2. 분당 요청 수로 자동화 봇 확인

`bash grep '203.0.113.42' /var/log/nginx/access.log \ | awk '{print $4}' | cut -d: -f1-3 | sort | uniq -c `

정상 사용자는 분당 수 건이지만, 봇은 분당 수백 건이 기록됩니다.

3. User-Agent 기준으로 봇 트래픽 분리

`bash grep -v 'Mozilla\|Chrome\|Safari\|Firefox' /var/log/nginx/access.log \ | awk '{print $12}' | sort | uniq -c | sort -rn | head -20 `


공격 대상 경로 유형

브루트포스 공격은 특정 경로에 집중됩니다.

경로공격 유형
-----------------
/wp-login.phpWordPress 관리자 계정 탈취
/admin, /administrator관리자 패널 무단 접근
/api/auth, /api/loginAPI 인증 엔드포인트 공격
/xmlrpc.phpWordPress XML-RPC 악용
/.env, /config.php설정 파일 노출 시도

Nginx에서 즉각 차단하는 방법

특정 IP 차단

/etc/nginx/nginx.conf 또는 사이트 설정 파일에 추가:

`nginx geo $blocked_ip { default 0; 203.0.113.42 1; 198.51.100.7 1; }

server { if ($blocked_ip) { return 403; } } `

wp-login.php 접근 IP 제한

`nginx location = /wp-login.php { allow 192.168.1.0/24; deny all; } `

요청 속도 제한 (Rate Limiting)

`nginx 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으로 자동 차단됩니다.


Fail2Ban으로 자동 차단 자동화

/etc/fail2ban/filter.d/nginx-bruteforce.conf:

`ini [Definition] failregex = ^ .* "POST /wp-login.php ignoreregex = `

/etc/fail2ban/jail.local:

`ini [nginx-bruteforce] enabled = true filter = nginx-bruteforce logpath = /var/log/nginx/access.log maxretry = 10 findtime = 60 bantime = 3600 ``

1분 내 10회 이상 시도한 IP를 1시간 차단합니다.


LogTrace로 빠르게 분석하기

커맨드라인 없이 로그 파일만 업로드하면 위 분석을 자동으로 수행합니다.

  • 의심 IP 자동 탐지 및 요청 횟수 정렬
  • User-Agent 분류 (브라우저 / 봇 / 스캐너)
  • 공격 패턴별 MITRE ATT&CK 매핑 (T1110 브루트포스 등)
  • 시간대별 공격 집중 구간 시각화

정리

브루트포스 공격은 자동화 도구로 진행되기 때문에 로그에 매우 규칙적인 패턴을 남깁니다. 핵심은 같은 IP에서 짧은 시간 내 반복되는 고정 경로 요청을 탐지하는 것입니다. Nginx Rate Limiting과 Fail2Ban을 조합하면 대부분의 자동화 공격을 사전에 차단할 수 있습니다.