← 전체 목록
병원홈페이지보안

Nginx rate limiting으로 로그인 brute force 공격을 서버 단에서 차단합니다

ℹ️ 본 글은 정보 제공 목적이며, 광고·제휴 링크가 포함될 수 있습니다.

Nginx rate limiting으로 로그인 시도 제한을 설정한 건 fail2ban을 우회하는 분산 IP 공격으로 wp-login.php에 초당 50건 이상 요청이 들어올 때입니다. fail2ban은 동일 IP를 잡지만, 여러 IP에서 분산 공격하면 잡지 못합니다. Nginx에서 요청 자체를 제한하면 IP와 무관하게 특정 URL로의 과도한 요청을 차단할 수 있습니다.

rate limiting 기본 설정

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곳 인프라 전담)