본문 바로가기

리눅스

[draft] Nginx 액세스 로그에서 공격자 IP 추출 및 차단 자동화 방법

Nginx 액세스 로그에서 공격자 IP(attacker ip) 추출 및 차단 자동화 방법

웹 서버를 운영하다 보면 비정상적으로 많은 요청을 보내는 IP, 즉 공격자 IP(attacker IP) 를 빠르게 식별하고 차단해야 하는 상황이 자주 발생합니다. Nginx access.log를 기반으로 공격자 IP를 추출하는 방법과 이를 자동화 스크립트로 정리하는 방법 그리고 Nginx 설정에서 차단하는 방법을 정리하였습니다.

1. Nginx 액세스 로그에서 요청이 많은 IP 확인하기

가장 기본적인 방법은 최근 로그에서 요청 횟수가 많은 IP를 집계하는 것입니다.

tail -n 10000 /var/log/nginx/access.log \
  | awk '{print $1}' \
  | sort \
  | uniq -c \
  | sort -nr \
  | head -n 10
    554 111.111.111.111
    210 222.222.222.222
     57 222.222.222.223
     56 222.222.222.224
     50 222.222.222.225
     48 222.222.222.226
     48 222.222.222.227
     45 222.222.222.228
     44 222.222.222.229
     44 222.222.222.230

2. HTTP 4xx 응답 기준으로 공격자 IP 추출

단순 요청 수뿐 아니라 403/404/429 등 4xx 응답을 유발하는 IP는 공격 가능성이 더 높습니다.

grep -E " 4[0-9]{2} " /var/log/nginx/access.log \
| awk '{print $1}' \
| sort \
| uniq -c \
| sort -n

3. Nginx에서 공격자 IP 차단 설정

추출한 공격자 IP는 Nginx 설정에서 바로 차단할 수 있습니다.

Nginx 환경 설정

server {
    ...
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}
  • deny : 명확한 공격자 IP
  • allow : 내부망/신뢰 네트워크
  • deny all : 기본 차단(화이트리스트 방식)

4. 공격자 IP 분석 자동화 스크립트 작성

반복 분석을 줄이기 위해 요청 수 기준 + 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을 필요에 따라 조절하여 원하는 결과를 얻을 수 있습니다.

더보기
---

deny_ip.sh 스크립트 생성

vim deny_ip.sh
#!/bin/bash

# define colors
C_DEFAULT="\033[0m"
C_BLACK="\033[30m"
C_RED="\033[1;31m"
C_GREEN="\033[32m"
C_YELLOW="\033[33m"
C_BLUE="\033[34m"
C_PURPLE="\033[35m"
C_CYAN="\033[36m"
C_WHITE="\033[0;37m"
C_BG_BLACK="\033[40m"
C_BG_RED="\033[41m"
C_BG_GREEN="\033[42m"
C_BG_YELLOW="\033[43m"
C_BG_BLUE="\033[44m"
C_BG_PURPLE="\033[45m"
C_BG_CYAN="\033[46m"
C_BG_LIGHTGRAY="\033[47m"

RANK="${1:-10}"
LOGLINE="${2:-10000}"
LOGFILE="${3:-/var/log/nginx/access.log}"

echo -e "\n${C_RED}Count\tIP${C_DEFAULT}"
tail -n ${LOGLINE} ${LOGFILE} | awk '{printf ("%5s\t\n", $1)}' | sort | uniq -c | sort -nr | head -n ${RANK}
echo -e "\n${C_RED}Count\tIP\t\tHTTP Code${C_DEFAULT}"
tail -n ${LOGLINE} ${LOGFILE} | awk '{printf ("%5s\t%s\n", $1, $9)}' | sort | uniq -c | sort -nr | head -n ${RANK}
echo -e "\n"

deny_ip.sh 실행

./deny_ip.sh
access
./deny_ip.sh 5 10 /var/nginx/access.log
---

Nginx 로그 분석은 단순하지만 매우 강력한 보안 도구입니다.

 

참고URL

- NGINX Docs : Module ngx_stream_access_module