웹 서버를 운영하다 보면 비정상적으로 많은 요청을 보내는 IP, 즉 공격자 IP(attacker IP) 를 빠르게 식별하고 차단해야 하는 상황이 자주 발생합니다. Nginx access.log를 기반으로 공격자 IP를 추출하는 방법과 이를 자동화 스크립트로 정리하는 방법 그리고 Nginx 설정에서 차단하는 방법을 정리하였습니다.
반복 분석을 줄이기 위해 요청 수 기준 + HTTP 응답 코드 기준을 함께 출력하는 스크립트를 작성합니다.
스크립트 작성
vim deny_ip.sh
#!/bin/bash
# 텍스트 출력의 색상 정의
C_DEFAULT="\033[0m"
C_RED="\033[1;31m"
# 스크립트 인수의 기본값
RANK="${1:-10}"
LOGLINE="${2:-10000}"
LOGFILE="${3:-/var/log/nginx/access.log}"
# 요청 횟수(request count)별 상위 IP 주소 표시
echo -e "\n${C_RED}Top ${RANK} IP Addresses by Request Count${C_DEFAULT}"
echo -e "---------------------------------------"
# 로그 파일에서 고유 IP 주소 추출 및 계산
tail -n ${LOGLINE} ${LOGFILE} | awk '{print $1}' | sort | uniq -c | sort -nr | head -n ${RANK}
# HTTP 응답 코드별 상위 IP 주소 표시(HTTP response code)
echo -e "\n${C_RED}Top ${RANK} IP Addresses by HTTP Response Code${C_DEFAULT}"
echo -e "--------------------------------------------"
# HTTP 응답 코드와 함께 고유 IP 주소 추출 및 계산
tail -n ${LOGLINE} ${LOGFILE} | awk '{print $1, $9}' | sort | uniq -c | sort -nr | head -n ${RANK}
echo -e "\n"
실행 권한 부여
chmod +x deny_ip.sh
스크립트 실행 방법
./deny_ip.sh 10 10000 /var/log/nginx/access.log
access
이 결과는 주어진 로그 파일에서 상위 IP 주소 및 HTTP 응답 코드를 요청 횟수 순으로 보여줍니다. RANK, LOGLINE, LOGFILE을 필요에 따라 조절하여 원하는 결과를 얻을 수 있습니다.