Nginx rate limiting으로 로그인 시도 제한을 설정한 건 fail2ban을 우회하는 분산 IP 공격으로 wp-login.php에 초당 50건 이상 요청이 들어올 때입니다. fail2ban은 동일 IP를 잡지만, 여러 IP에서 분산 공격하면 잡지 못합니다. Nginx에서 요청 자체를 제한하면 IP와 무관하게 특정 URL로의 과도한 요청을 차단할 수 있습니다.
sudo nano /etc/nginx/nginx.conf
http {} 블록에 추가:
# 로그인 요청 제한 존 정의 (IP당 분당 5회)
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# XML-RPC 요청 제한 존 (IP당 분당 2회)
limit_req_zone $binary_remote_addr zone=xmlrpc:10m rate=2r/m;
sudo nano /etc/nginx/sites-available/default
server {
# wp-login.php 요청 제한
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
limit_req_status 429;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# xmlrpc.php 요청 제한 (또는 완전 차단)
location = /xmlrpc.php {
limit_req zone=xmlrpc burst=1 nodelay;
limit_req_status 429;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
sudo nginx -t && sudo systemctl reload nginx
# 429 응답(Too Many Requests) 확인
sudo grep " 429 " /var/log/nginx/access.log | tail -20
# 차단 빈도 통계
sudo awk '$9==429 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
burst=3은 순간적으로 3번까지 허용하고 이후 rate(분당 5회)를 초과하면 429를 반환합니다. 정상 사용자는 로그인 시도가 드물므로 이 설정이 실제 사용자에게 영향을 주는 경우는 거의 없습니다.
AI가 초안을 생성하고, 의료기관 인프라 운영자가 1차 데이터 기반으로 최종 검수·승인합니다.
작성·검수: WavePix 운영자 (의료기관 3곳 인프라 전담)