서버 운영을 시작하면 수많은 외부 공격에 직면하게 됩니다. SSH 브루트포스 공격, 웹 애플리케이션을 겨냥한 무차별 로그인 시도, 포트 스캐닝 등은 일상적인 위협입니다. 이러한 위협을 방치하면 결국 시스템 침투로 이어질 수 있습니다. Fail2Ban은 이러한 문제를 해결해주는, 가볍고 강력한 리눅스 기반 침입 방지 솔루션입니다.

Fail2Ban은 의심스러운 IP를 자동으로 탐지하여 차단해줍니다. 이를 통해 관리자는 별다른 수고 없이도 서버를 보호할 수 있습니다.

Fail2Ban 설치 방법

Fail2Ban은 대부분의 리눅스 배포판에서 패키지로 제공되고 있어 설치가 매우 간단합니다.

Ubuntu/Debian 계열

sudo apt update
sudo apt install fail2ban

설치가 완료되면 서비스 시작 및 부팅 시 자동 시작 설정을 합니다.

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Fail2Ban Overview

Fail2Ban 기본 설정 방법

Fail2Ban은 /etc/fail2ban/jail.conf 파일을 기본 설정 파일로 사용하지만, 이 파일을 직접 수정하지 않고 /etc/fail2ban/jail.local 파일을 생성하여 커스터마이징하는 것이 권장됩니다.

jail.local 파일 생성:

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

주요 설정 항목: - bantime: 차단 기간 (초 단위) - findtime: 공격 시도로 간주할 시간 범위 (초 단위) - maxretry: 허용되는 최대 실패 시도 수

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log

실제 적용 사례 예시

1. SSH 브루트포스 차단

위와 같이 [sshd] jail을 설정하면, 로그인 실패가 5회 이상 발생하면 해당 IP가 1시간 동안 차단됩니다.

2. Apache 로그인 공격 차단

[apache-auth]
enabled = true
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3

웹서버에 대한 인증 실패가 3번 발생하면 차단합니다.

Fail2Ban 모니터링 방법

Fail2Ban이 제대로 작동하고 있는지 모니터링하는 방법은 여러 가지가 있습니다.

1. fail2ban-client를 통한 상태 확인

특정 jail (예: sshd)의 상태를 확인할 수 있습니다.

sudo fail2ban-client status sshd

출력 예시:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed: 15
|  `- File list:    /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned: 3
   `- Banned IP list: 192.168.1.100

2. 로그 파일 모니터링

Fail2Ban의 동작 내역은 /var/log/fail2ban.log 파일에 기록됩니다.

tail -f /var/log/fail2ban.log

이를 통해 실시간으로 차단 및 해제 이벤트를 모니터링할 수 있습니다.

Fail2Ban 작동 원리

  1. 로그 모니터링: Fail2Ban은 설정된 로그 파일을 지속적으로 감시합니다. (예: /var/log/auth.log, /var/log/apache2/error.log)

  2. 필터 적용: 특정 패턴(로그인 실패, 인증 오류 등)을 필터로 감지합니다.

  3. 조치 실행: 설정된 maxretry를 초과하면, 해당 IP에 대해 iptables를 통해 차단하거나, firewall-cmd, nftables 같은 방화벽 명령어를 실행합니다.

  4. 자동 해제: bantime이 경과하면 차단을 자동으로 해제합니다.

Fail2Ban은 모듈화된 구조로 다양한 서비스(jail)별로 독립적인 감시 및 차단 설정이 가능해, 단순한 SSH 보호를 넘어 다양한 서비스에 대한 보안을 강화할 수 있습니다.

SSH 공격에 대한 영구 차단 설정 방법

SSH 공격자는 단호하게 다루는 것이 중요합니다. Fail2Ban에서는 bantime-1로 설정하면 영구적으로 차단할 수 있습니다.

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
bantime = -1
findtime = 600
maxretry = 5

이렇게 설정하면, SSH 인증 실패가 5번 이상 발생한 IP는 영구적으로 차단되어 서버 접근이 불가능해집니다.

[고급 팁] Fail2Ban의 기본 차단 동작 이해하기

Fail2Ban에서는 action을 별도로 정의하지 않아도 기본적으로 작동합니다. 그 이유는 기본 설정이 iptables를 이용하는 차단 명령어를 포함하고 있기 때문입니다.

  • 별도로 action을 지정하지 않으면, [DEFAULT] 섹션의 action = %(action_)s 설정이 적용됩니다.
  • %(action_)s는 내부적으로 iptables 명령어를 사용하여 악성 IP를 차단하는 동작을 수행합니다.
  • 따라서 action을 따로 작성하지 않아도 iptables에 의해 IP 차단이 이루어집니다.

기본 차단 명령 예시 (action_.conf 참조)

iptables -I INPUT -s <ip> -j REJECT

즉, Fail2Ban이 자동으로 iptables를 제어하여 공격 IP를 차단하게 되는 것입니다.

주의: - 만약 UFW, firewalld 등 다른 방화벽 도구를 사용하고 싶다면, action을 명시적으로 설정해야 합니다. - 또한, 차단 규칙은 서버가 재부팅되면 사라질 수 있으므로, 부팅 시 Fail2Ban 서비스가 자동으로 시작되도록 설정해두는 것이 좋습니다.


추가로 다양한 필터를 직접 만들어 적용하거나, email 경고 설정 등 고급 설정도 가능합니다.


서버를 인터넷 세상에 노출한 순간부터 보안은 결코 선택이 아니라 필수입니다.
한순간의 방심이 치명적인 결과를 초래할 수 있습니다.
Fail2Ban은 그러한 위협을 미리 차단하는 든든한 방패가 되어 줄 것입니다.
지금 이 순간에도 누군가는 당신의 서버를 노리고 있다는 사실을 잊지 마십시오.