FAIL2BAN을 설치하여 서버를 좀더 안전하게 만드는 방법
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 -yapt-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 = truefilter = nginx-limit-reqport = http,httpslogpath = /var/log/nginx/*error*.logfindtime = 60bantime = 7200maxretry = 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 = trueport = http,httpsfilter = wordpressaction = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]logpath = /var/log/nginx/*access*.logmaxretry = 6findtime = 86400bantime = 72000
워드프레스 접근제어까지 생성후,
만든 jail을 테스트 하고 에러가 없다면, 재시작 합니다. (경고문은 무시)
fail2ban-client -dservice 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-reqiptables -L -n
Fail2ban 작동확인 테스트해보기.
아파치 벤치마크툴로 wp-login 및 xmlrpc 에대해 테스트를 해보겠습니다. 먼저 아파치 벤치마크툴 설치는 아래와 같습니다.
apt-get install apache2-utils -y
기본컨넥션 1개로 100개의 요청을 보냈습니다.
ab -n 100 -c 1 https://yourdomain.com/wp-login.phpab -n 100 -c 1 https://yourdomain.com/xmlrpc.php
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 상태를 보겠습니다.
제 생각에는 fail2ban을 설치하지 않고 사용하시는분들은 드물겠지만, 혹시라도 설치를 하지 않았다면, 꼭 설치해서 안전하게 운영하길 바랍니다.
이 게시글이 문제가 될 시, 삭제 하겠습니다.
댓글 없음:
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.