무작위 공격 방지를 위해 Fail2Ban 도입하기

Hansu Park·2023년 11월 9일
0
post-thumbnail

Fail2Ban은 로그파일을 스캔하여, 로그인 시도를 많이 실패하는 IP 주소(아마 브루트포스 공격일 것이다.)를 차단하는 프로그램이다. 기본적으로 /var/log/auth.log를 필터링하여 ssh 접속을 감시한다.

서버 운영 중 무작위포트에 대한 공격이 지속적으로 들어왔고 Fail2Ban을 이용하여 접속하려는 IP들을 밴하고자 하였다. 근본적인 해결책은 아니기에 적용 후에도 문제가 된다면 WAF 등을 도입해볼 계획이다.

설치 방법

# DOWNLOAD NEWER RELEASE AND INSTALL MANUALLY
# 압축파일 깃헙에서 가져옴
sudo wget https://github.com/fail2ban/fail2ban/archive/0.11.2.tar.gz 
# 압축 해제
sudo tar xzf 0.11.2.tar.gz  
# 만들어진 디렉터리로 이동
sudo cd /etc/fail2ban-0.11.2/
# 코드 실행하여 /etc/fail2ban 생성 
sudo python setup.py install 

systemctl enable fail2ban 로 등록
systemctl start fail2ban로 시작

구성요소

Server

fail2ban은 client-server 구조로 이루어져 있다. 서버는 멀티스레드이며 소켓을 받아 명령을 실행한다.

Client

서버 구성, 동작을 하기 위한 명령어들을 보낸다.
사용자들은 이를 통해 fail2ban의 기능들을 설정하고 이용한다.

fail2ban-client start: 실행
fail2ban-client version: 버전확인
fail2ban-client status: 상태 확인 (동작하고 있는 필터링들 확인)
fail2ban-client status {필터 이름}: 필터 이름이 얼마나 감지했고, 어떤 동작들이 발생했는지 확인

Jail 동작방식

실제로 아이피들을 밴하는 방법이다. 사용자가 지정한 로그 파일들을 대상으로 필터링을 하여, 필터링 규칙에 맞는 (브루트 포스 공격을 하는) IP를 감지한 후 차단한다.

추가로 감지 이후 커스텀 액션이라는 원하는 동작을 실행할 수 있다. (이메일 전송 등)

/etc/fail2ban 에 설정들이 들어가있다.

필터링 방법

로깅 파일을 통해 차단할 IP 주소를 결정한다. /etc/fail2ban/filter.d/에서 regax를 이용하여 차단할 IP를 결정한다. 해당 경로를 가보면 mysql, mongodb, haproxy 등등 다양한 로깅 파일들에 대한 설정들이 이미 작성되어 있는 것을 알 수 있다.

e.g. mysqld-auth.conf

# Fail2Ban filter for unsuccesful MySQL authentication attempts
#
#
# To log wrong MySQL access attempts add to /etc/my.cnf in [mysqld]:
# log-error=/var/log/mysqld.log
# log-warnings = 2
#
# If using mysql syslog [mysql_safe] has syslog in /etc/my.cnf

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

_daemon = mysqld

failregex = ^%(__prefix_line)s(?:(?:\d{6}|\d{4}-\d{2}-\d{2})[ T]\s?\d{1,2}:\d{2}:\d{2} )?(?:\d+ )?\[\w+\] (?:\[[^\]]+\] )*Access denied for user '[^']+'@'<HOST>' (to database '[^']*'|\(using password: (YES|NO)\))*\s*$

ignoreregex =

# DEV Notes:
#
# Technically __prefix_line can equate to an empty string hence it can support
# syslog and non-syslog at once.
# Example:
# 130322 11:26:54 [Warning] Access denied for user 'root'@'127.0.0.1' (using password: YES)
#
# Authors: Artur Penttinen
#          Yaroslav O. Halchenko

차단

/etc/fail2banjail.conf, jail.local 이 있다. (local은 없으면 conf를 복사하여 만들자.) conf는 건드리지 않고, local을 커스텀하여 원하는 차단 규칙을 생성한다. (conf는 일종의 기본설정이고 local은 사용자의 상황에 따라 커스텀한 설정이라고 생각하면 된다.)

문법 (차단할 규칙 이름)

옵션 = 값 로 구성된다.
(차단할 규칙 이름 같은 필터 파일이 filter.d에 있다면 이를 필터로 사용한다.)
+) 옵션을 적지 않으면, 상단의 [DEFAULT] 규칙이 적용된다.

findtime: 1d
bantime: 7d
backend: auto
등이 적용되어 있다.

예시

[mysqld-auth]

enabled  = true
port     = 3306
logpath  = /var/log/mysql/error.log

옵션
enabled: 활성화 여부를 결정한다.
기본값: false (ssh에 대한 필터링은 기본 값으로 활성화가 되어있다.)
logpath: 검사할 로그 파일 경로이다.
action: 차단과 더불어 실행할 동작 설정한다.
backend: 서버로써 리소스를 가져오는 방식을 설정한다. (?)

  • 잘 모르겠으니 권장하는 auto로 설정하였다.
    bantime: 차단할 시간 설정
    maxenty: 특정 횟수 이상이면 차단할 로그인 시도 횟수
    findtime: 로그인 시도 추적하는 시간 간격
    filter: 필터 파일의 위치

등이 있다.

시간설정은 1h, 1d 등으로도 가능하며, 너무 길게 잡을 경우 무관한 사용자가 차단될 수도 있으니 시스템 성격, 대상이 되는 프로세스 등에 따라 잘 결정해야한다. (낮은 버전에서는 사용할 수 없다, 0.11.2에서는 동작을 확인하였다.) 또한 너무나 많은 사용자를 밴하고 있다면 메모리 사용량이 증가하니 유의하는 것이 좋다.

로그 기록을 grep을 이용해 확인해본 결과 일반적으로 3일동안 같은 IP로 공격하였다. 최대 6개월 동안 같은 IP로 공격하기도 하였다.

관련 정보

로그 기록을 grep해본 결과 대략 3일동안 같은 IP로 공격하였다.
가장 긴 경우는 6개월 동안 같은 IP로 공격하기도 했다.
mongodb는 로그를 확인해봤을 때, 별다른 공격이 확인되지 않아 추가하지 않았다.

기타

파이썬으로 구현되어 있어 파이썬 설치가 필요하다.

참고

0개의 댓글