본문 바로가기
시스템(Linux)

Fail2ban 완전 정복(브루트 포스 공격, Brute Force Attack) 자동 차단 도구

by forward error correction Circle 2026. 3. 9.
반응형

Ⅰ. Fail2ban이란?

 서버 로그 파일을 실시간으로 모니터링하다가 특정 패턴(로그인 실패 등)이 설정한 횟수를 초과하면 해당 IP를 방화벽에 자동 등록해 차단하는 오픈소스 침입 방지 도구입니다. Python으로 작성되었으며, iptables / nftables / firewalld 등 기존 방화벽과 연동해 동작합니다.
브루트 포스 공격 중 SSH 패스워드 스프레이, 딕셔너리 공격에 대한 가장 실용적인 자동 방어 도구입니다.

Ⅱ. Fail2ban 동작 원리

 ⅰ. Fail2ban 동작 흐름

    [공격자]           
         │
         │ SSH 로그인 실패 반복
         ↓
[/var/log/auth.log]  ← 1) 로그 파일 실시간 감시
        │
        ↓ 2) 정규식 필터로 실패 패턴 감지
[Filter (정규식)]
        │
        ↓ 3) findtime 내 maxretry 초과 여부 판단
[Jail (판단 엔진)]
        │
        ↓ 4) 임계값 초과 시 Action 실행
[Action (iptables/nftables)]
        │
        ↓ 5) 공격 IP 방화벽 차단 (bantime 동안)
[차단 해제] ← 6) bantime 만료 후 자동 해제

 

 ⅱ.  Fail2ban 핵심 3요소 

   1) Filter: 로그에서 찾을 악성 패턴 (정규식)
   2) Jail: 어떤 서비스, 몇 번 실패, 얼마나 차단할지 설정
   3) Action: 차단 방법 (iptables, nftables, firewalld 등)

Ⅲ. Fail2ban 설치

# CentOS / RHEL / Rocky Linux
dnf install epel-release -y
dnf install fail2ban -y

# Ubuntu / Debian
apt update && apt install fail2ban -y

# 서비스 시작 및 자동 실행 등록
systemctl enable fail2ban --now

# 상태 확인
systemctl status fail2ban
fail2ban-client status

Ⅳ. Fail2ban 설정 파일 구조

Fail2ban의 설정 파일은 .conf(기본값) / .local(사용자 커스텀) 이중 구조입니다.

/etc/fail2ban/
├── fail2ban.conf       ← 전역 설정 (수정 금지)
├── fail2ban.local      ← 전역 커스텀 (여기서 수정)
├── jail.conf           ← jail 기본값 (수정 금지)
├── jail.local          ← jail 커스텀 (★ 핵심 설정 파일)
├── jail.d/             ← 서비스별 개별 jail 파일
│   └── sshd.local
└── filter.d/           ← 서비스별 정규식 필터
    ├── sshd.conf
    ├── nginx-http-auth.conf
    └── apache-auth.conf

 ※ 반드시 .conf가 아닌 .local 파일에 설정하세요. 패키지 업데이트 시 .conf는 덮어써지지만 .local은 유지됩니다.

Ⅴ. Fail2ban 핵심 설정 파라미터

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local

 

파라미터  의미 기본값 권장값
bantime 차단 지속 시간 10분(600) 1일(1d) 이상
findtime 실패 횟수 카운트 시간 범위 10분(600) 1일(1d) 
maxretry 허용 실패 횟수 5회 3~5회 
banaction 차단 방식 iptables-multiport nftables (최신 시스템) 
ignoreip 차단 예외 IP 127.0.0.1/8 관리자 IP 추가 필수

Ⅵ. Fail2ban 실전 설정 — SSH 브루트포스 차단

 ⅰ. 기본 설정 (jail.local)

[DEFAULT]
# 관리자 IP는 절대 차단하지 않도록 예외 처리 (필수!)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 [관리자 공인IP]

bantime  = 1d          # 1일 차단
findtime = 1d          # 1일 내
maxretry = 5           # 5회 실패 시 차단

# 이메일 알림 (선택)
destemail = admin@example.com
action = %(action_mw)s  # 차단 + 이메일 발송

[sshd]
enabled  = true
port     = 22           # SSH 포트 변경 시 함께 수정
logpath  = /var/log/auth.log      # Ubuntu/Debian
# logpath = /var/log/secure       # CentOS/RHEL
maxretry = 3
bantime  = 1d

 

 ⅱ. 고급 설정 — recidive jail (상습 공격자 장기 차단)
상습 공격자(차단됐다가 해제 후 또 공격하는 IP)를 4주 장기 차단하는 강화 설정입니다.

# /etc/fail2ban/jail.d/sshd-hardening.conf

[sshd]
enabled  = true
maxretry = 3
findtime = 1d
bantime  = 1d

# Recidive: 1주일 내 3번 차단된 IP → 4주 차단
[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s   # 모든 포트 차단
bantime  = 4w
findtime = 1w
maxretry = 3

※ recidive의 findtime은 반드시 sshd의 bantime보다 길어야 작동합니다.

Ⅶ. Fail2ban 주요 명령어

 ⅰ. 전체 jail 목록 확인

fail2ban-client status

 ⅱ. 특정 jail 상세 상태 (차단된 IP 목록 포함)

fail2ban-client status sshd


ⅲ. IP 수동 차단

fail2ban-client set sshd banip 1.2.3.4

 

ⅳ. IP 차단 해제 (실수로 관리자 IP 차단 시)

fail2ban-client set sshd unbanip 1.2.3.4


ⅴ. 실시간 Fail2ban 로그 모니터링

tail -f /var/log/fail2ban.log


ⅵ. 차단 이력 확인

grep "Ban" /var/log/fail2ban.log | tail -20


ⅶ. 설정 변경 후 재시작

systemctl restart fail2ban


ⅷ. 설정 문법 검사 (재시작 전 확인)

fail2ban-client --test

Ⅷ. SSH 외 다양 서비스에 적용

Fail2ban은 로그 파일이 있는 모든 서비스에 적용 가능합니다.

# Nginx 로그인 실패 차단
[nginx-http-auth]
enabled  = true
logpath  = /var/log/nginx/error.log
maxretry = 5

# Apache 로그인 실패 차단
[apache-auth]
enabled  = true
logpath  = /var/log/apache2/error.log
maxretry = 5

# WordPress 로그인 차단 (wp-login.php 보호)
[wordpress]
enabled  = true
logpath  = /var/log/nginx/access.log
maxretry = 3
bantime  = 1d

# FTP 차단
[vsftpd]
enabled  = true
port     = ftp,ftp-data,ftps,ftps-data
logpath  = /var/log/vsftpd.log
maxretry = 5

Ⅸ. Fail2ban 를 사용한 브루트 포스 공격 실제 차단 흐름

공격자가 SSH 로그인 3회 실패
         ↓
Fail2ban이 /var/log/auth.log에서 패턴 감지
         ↓
findtime(1일) 내 maxretry(3회) 초과 확인
         ↓
iptables에 자동 DROP 규칙 추가
iptables -A f2b-sshd -s 1.2.3.4 -j REJECT
         ↓
bantime(1일) 후 자동 해제
         ↓
recidive jail: 1주일 내 3번 차단 → 4주 차단

Ⅹ. Fail2ban 한계점 및 보완 방법

Fail2ban은 강력하지만 단독으로는 완벽하지 않습니다.

한계 보완 방법
분산 IP 공격(패스워드 스프레이) 탐지 어려움 IP 화이트리스트 기반 접근 제한 병행
IPv6 차단 설정 별도 필요 banaction6 설정 추가
관리자 IP 실수 차단 시 서버 접근 불가 ignoreip에 관리자 IP 반드시 등록
클라우드 환경에서 NAT IP 차단 시 다수 피해 클라우드 보안 그룹과 병행 사용

 

반응형