본문 바로가기
DBMS(DataBase Management System)/PostgreSQL

[PostgreSQL 16] Fail2Ban으로 비밀번호 무차별 대입 공격 차단 하기

by 연구자 공학코드 2025. 9. 11.

공지사항

  1. 제가 운영하는 IT·SI·SM 전문가 커뮤니티 아이티프로(https://cafe.naver.com/itpro)에 가입하시면 IT 개발 노하우와 SI 구축 및 사업관리 노하우, 솔루션 정보를 제공받으실 수 있습니다.

  2. 제가 운영하는 개발자 커뮤니티 코어큐브(https://cafe.naver.com/ewsncube)에 가입하시면 컴퓨터 관련 학습 자료와 질의응답을 제공받으실 수 있습니다.

728x90
반응형

PostgreSQL 16을 DB 서버로 운영할 때는 무차별 대입 공격에 대한 대비책이 있어야 한다. Fail2Ban은 무차별 대입 공격에 대응할 수 있는 좋은 수단 중 하나이다. Fail2Ban은 일정 횟수 만큼 인증에 실패(Fail)했을 때 접근을 차단(Ban)하는 동작을 수행하는 프로그램이다. Fail2Ban에 PostgreSQL 16 관련 차단 정책을 설정하는 방법은 아래와 같다.

설정 환경

  • Ubuntu 22.04
  • PostgreSQL 16
  • Fail2Ban 1.1.0

PostgreSQL 설정

설치된 PostgreSQL의 설정파일을 아래와 같이 vi 에디터로 연다.

vi /etc/postgresql/16/main/postgresql.conf

Fail2Ban이 인증 실패를 PostgreSQL의 로그를 통해 알 수 있도록 아래와 같이 설정한다. 설정 값은 환경에 따라 다를 수 있다.

log_connections = on
log_disconnections = on
logging_collector 
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,client=%h '
log_directory = '/var/log/postgresql/'

로그 포맷을 설정하는 화면
로그 수집을 설정하는 화면
로그 디렉토리를 설정하는 화면

설정한 것을 PostgreSQL에 적용하기 위하여 아래의 명령어를 입력하여 PostgreSQL을 재시작한다.

sudo systemctl restart postgresql

Fail2Ban 설정

아래의 명령어를 입력하여 Fail2Ban의 필터 설정 파일을 vi 에디터로 생성하면서 연다.

sudo vi /etc/fail2ban/filter.d/postgres.conf

아래와 같이 PostgreSQL의 로그를 읽어오도록 설정한다.

[Definition]
failregex =  \[\d+\]: \[\d+-\d+\] user=(.*),db=(.*),client=<HOST> FATAL:  password authentication failed for user ".*"$
ignoreregex =

필터 설정 값이 입력된 화면

아래의 명령어를 입력하여 Fail2Ban의 액션 설정 파일을 vi 에디터로 생성하면서 연다.

sudo vi /etc/fail2ban/action.d/postgres.conf

아래와 같이 ban과 unban 상황 때 수행할 명령어를 입력한다.

[Definition]
actionban = /sbin/iptables -A FORWARD -s <ip> -j DROP
            /sbin/iptables -A INPUT -s <ip> -j DROP

actionunban = /sbin/iptables -D FORWARD -s <ip> -j DROP
              /sbin/iptables -D INPUT -s <ip> -j DROP

액션 설정 값이 입력된 화면

아래와 같이 Fail2Ban의 감옥(jail) 설정 파일을 연다.

sudo vi /etc/fail2ban/jail.conf

아래와 같이 PostgreSQL의 규칙을 입력한다.

[postgres]
enabled  = true
port     = all    
filter   = postgres
logpath  = /var/log/postgresql/*
maxretry = 5
findtime = 60
bantime  = 300
datepattern = ^%%Y-%%m-%%d %%H:%%M:%%S UTC

감옥 설정 규칙이 입력된 화면

설정한 값들이 Fail2Ban에 적용되도록 Fail2Ban 서비스를 재시작한다.

sudo systemctl restart fail2ban

차단된 내역 확인하기

아래의 명령어를 입력하여 Fail2Ban의 동작을 확인한다.

sudo fail2ban-client status postgres

0건이 집계된 화면

몇 분 지났더니 2건의 실패가 집계되었다. PostgreSQL과 같은 DB 서버는 외부망에 직접 노출시키지 않고 내부망에서도 최대한 제한된 경로로 접근할 수 있도록 구축하는 것이 안전한다.

2건이 집계된 화면

참고문서

  1. "postgresql 로그인 실패 횟수에 따른 접속 제한 설정", 흰색남자, 2023년 8월 10일. @원문보기
  2. "Postgres fail2ban configuration, custom actions", rc9000/pg-fail2ban.md, GitHub. @원문보기
  3. "무차별 대입 공격", onlyJoon, 2024년 7월 25일. @원문보기
728x90
반응형

댓글