Nginx 기본 DDoS 방어 설정

먼저 nginx 전역 환경설정 파일 nginx.conf 에서 limit_req_zone (단일 IP주소에서 들어오는 요청의 처리 속도를 제한하는 데 사용)을 http 블록안에 설정합니다.

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

적용할 가상호스트 파일을 열고, 아래와 같이 별도의 로그기록과, xmrpc와 wp-login 요청 스탬프 기록을 위한 nginx 설정을 추가합니다. 설정변경후에는 nginx -t 로 문법오류검사와 nginx -s reload 로 설정을 다시 불러오기를 합니다. 아래 설정만으로는 DDoS 공격을 완화할뿐 강력한 공격에는 무리입니다.

access_log   /var/log/nginx/yourdomain.com.access.log;
error_log    /var/log/nginx/yourdomain.com.error.log;

location ~ (wp-login|xmlrpc)\.php {
	limit_req   zone=one  burst=1 nodelay;
	include fastcgi_params;
	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	limit_req_status 444;
}

Fail2ban 설치 및 환경설정 | Ubuntu 18.04

이제 fail2ban을 설치하고, wp-login.php 와 xmlrpc 을 보호하기 위해 Jail 필터를 구성해 봅니다.

apt-get update && apt-get upgrade -y
apt-get install fail2ban
/lib/systemd/systemd-sysv-install enable fail2ban

nginx-limit-req.conf, wordpress.conf 환경설정 필터 파일 만들기. [ 표현식 참조 ]

nano /etc/fail2ban/filter.d/nginx-limit-req.conf
[Definition]
failregex = ^ \[error\] \d+#\d+: .*limiting requests.*, client: <HOST>, server: \S+, request: "POST /xmlrpc.php.*$
            ^ \[error\] \d+#\d+: .*limiting requests.*, client: <HOST>, server: \S+, request: .*$

ignoreregex = 
nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "(GET|POST) /wp-login.php
            ^<HOST> .* "(GET|POST) /xmlrpc.php

필터 설정화일 정규식 실행 테스트

fail2ban-regex /var/log/nginx/yourdomain.com.error.log /etc/fail2ban/filter.d/nginx-limit-req.conf

jail 폴더 만들기

mkdir -p /etc/fail2ban/jail.d

nginx-limit-req, WordPress jail 만들기

nano /etc/fail2ban/jail.d/nginx-limit-req.conf
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
port = http,https
logpath = /var/log/nginx/*error*.log
findtime = 60
bantime = 7200
maxretry = 3

위 설정을 보면 필터를 활성화하고, 필터명 nginx-limit-req, 감시 포트는 80,443, 로그경로는 가상호스트 파일에 /var/log/nginx/yourdomain.com.error.log;로 설정 해놨기때문에 여러 가상호스트가 생성되더라도 패스를 참조할수 있게 했습니다. 규칙은 동일한 IP에서 1분동안 3번실패하면 7200초(2시간)동안 차단되게 됩니다. 차단시간이 음수(-1)일경우 영구 차단됩니다.
ignoreip = 127.0.0.1/8 192.168.0.0/24 와같이 추가적으로 화이트 IP를 지정할수 있습니다.

nano /etc/fail2ban/jail.d/wordpress.conf
[wordpress]
enabled  = true
port     = http,https
filter   = wordpress
action   = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath  = /var/log/nginx/*access*.log
maxretry = 6
findtime  = 86400
bantime  = 72000

워드프레스 접근제어까지 생성후,
만든 jail을 테스트 하고 에러가 없다면, 재시작 합니다. (경고문은 무시)

fail2ban-client -d
service fail2ban restart

nginx 가상호스트에는 아래와 같은 형식으로 로그기록을 변경한다.

access_log   /var/log/nginx/yourdomain.com.access.log;
error_log    /var/log/nginx/yourdomain.com.error.log;

fail2ban 상태 확인, 규칙들을 봅니다. iptables 에서도 확인이 가능합니다.

fail2ban-client status nginx-limit-req
iptables -L -n

Fail2ban 작동확인 테스트해보기.

아파치 벤치마크툴로 wp-login 및 xmlrpc 에대해 테스트를 해보겠습니다. 먼저 아파치 벤치마크툴 설치는 아래와 같습니다.

apt-get install apache2-utils -y

기본컨넥션 1개로 100개의 요청을 보냈습니다.

ab -n 100 -c 1 https://yourdomain.com/wp-login.php
ab -n 100 -c 1 https://yourdomain.com/xmlrpc.php
xmlrpc 요청
밴IP에서 목록확인 성공

Baned IP 지우기

테스트한 내 서버IP를 지우거나, 원치않는IP가 있을경우 아래의 명령어로 간단히 IP 삭제가 가능합니다.

fail2ban-client set jail명 unbanip IP주소

차단 IP 직접 로그 및 DB에서 확인해보기

fail2ban 로그파일 경로는 /var/log/fail2ban.log 에 저장된다. 로그로테이트 설정파일 경로는 /etc/logrotate.d 에 위치합니다. 로그에서 직접 확인은 아래의 명령어로 가능합니다.

cat /var/log/fail2ban.log | grep "] Ban" | awk '{print $NF}' | sort | uniq -c | sort -n

차단IP들은 fail2ban의 sqlite3의 DB에 저장됩니다. 우분투에 기본설치 되어 있지 않으니, 확인시 설치가 필요합니다. dbfile 확인은 fail2ban-client get dbfile 명령어로 확인, 테이블 확인은 sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 .table , sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 .schema, 차단된IP 출력은 아래명령어로 가능합니다.

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select distinct ip from bans;"

FAIL2BAN이 얼마나 많은 일은 하고 있는지 마지막으로 제가 사용중인 인스턴스중 sshd 상태를 보겠습니다.

놀라울 정도로 많은 계정탈취 시도가 있습니다. / 서버 업타임 271일 동안의 기록…

제 생각에는 fail2ban을 설치하지 않고 사용하시는분들은 드물겠지만, 혹시라도 설치를 하지 않았다면, 꼭 설치해서 안전하게 운영하길 바랍니다.


참조 URL : https://blog.kinsdayz.com/2020/06/14/fail2ban%ec%9d%84-%ec%84%a4%ec%b9%98%ed%95%98%ec%97%ac-%ec%84%9c%eb%b2%84%eb%a5%bc-%ec%a2%80%eb%8d%94-%ec%95%88%ec%a0%84%ed%95%98%ea%b2%8c-%eb%a7%8c%eb%93%9c%eb%8a%94-%eb%b0%a9%eb%b2%95/

이 게시글이 문제가 될 시, 삭제 하겠습니다.