리눅스 서버를 운영하며 로그를 살펴보면, 전 세계에서 수많은 IP가 내 서버의 SSH 포트(22번 등)로 접속하기 위해 끊임없이 로그인을 시도하는 것을 볼 수 있습니다. 이를 **무차별 대입 공격(Brute-force Attack)**이라고 합니다.
비밀번호를 아무리 어렵게 설정해도 수만 번의 시도가 반복되면 서버 자원이 낭비되고 보안 위협이 커집니다. 오늘은 이러한 공격을 실시간으로 감시하고, 일정 횟수 이상 실패하면 해당 IP를 자동으로 차단해 주는 든든한 파수꾼, Fail2Ban의 설치 및 설정법을 알아보겠습니다.
1. Fail2Ban이란 무엇인가?
Fail2Ban은 로그 파일을 분석하여 악의적인 활동을 하는 IP를 찾아내고, 방화벽(UFW, iptables 등)을 통해 해당 IP의 접속을 일정 시간 동안 금지(Ban)시키는 보안 프레임워크입니다.
1.1 주요 작동 방식
- 로그 모니터링: SSH, Nginx, MySQL 등 서비스의 로그 파일을 실시간으로 읽습니다.
- 패턴 매칭: 'Password fail' 같은 특정 실패 패턴이 반복되는지 확인합니다.
- 자동 차단: 설정된 횟수(예: 5회)를 초과하면 해당 IP를 방화벽 규칙에 추가하여 차단합니다.
2. Fail2Ban 설치 및 기본 설정
2.1 설치하기
우분투 환경에서는 패키지 매니저를 통해 간단히 설치할 수 있습니다.
sudo apt update
sudo apt install fail2ban -y
2.2 설정 파일 관리 (.local 파일 생성)
Fail2Ban의 기본 설정 파일은 /etc/fail2ban/jail.conf입니다. 하지만 업데이트 시 초기화될 수 있으므로, 복사본인 .local 파일을 만들어 수정하는 것이 관례입니다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
3. 핵심 보안 정책 설정 (jail.local)
설정 파일 내의 [DEFAULT] 섹션에서 전역 정책을 결정합니다.
- ignoreip: 차단에서 제외할 IP (본인의 PC IP를 등록하여 본인이 차단되는 것을 방지하세요).
- bantime: 차단할 시간 (예: 1h는 1시간, -1은 영구 차단).
- findtime: 실패 횟수를 계산할 시간 범위 (예: 10m 동안 5번 실패 시 차단).
- maxretry: 허용되는 최대 실패 횟수.
3.1 SSH 보호 활성화 예시
파일 하단의 [sshd] 섹션을 찾아 아래와 같이 활성화합니다.
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5
bantime = 1d
(위 설정은 10분 내에 5번 로그인 실패 시 해당 IP를 하루 동안 차단합니다.)
4. 서비스 실행 및 상태 확인
설정을 마쳤다면 서비스를 재시작하여 적용합니다.
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
4.1 현재 차단된 IP 목록 확인
Fail2Ban이 열일하고 있는지 확인해 봅시다.
# SSH 서비스에 대한 차단 상태 확인
sudo fail2ban-client status sshd
명령어를 실행하면 현재 감시 중인 IP 수와 실제로 차단된(Banned) IP 목록이 나타납니다.
4.2 실수로 차단된 내 IP 해제하기
만약 본인이 차단되었다면 다른 네트워크에서 접속하여 아래 명령어로 해제할 수 있습니다.
sudo fail2ban-client set sshd unbanip [내IP주소]
5. 결론: 자동화된 보안의 힘
Fail2Ban은 관리자가 잠든 사이에도 서버를 공격으로부터 지켜주는 가장 효율적인 보안 도구입니다. UFW 방화벽이 성벽이라면, Fail2Ban은 성벽을 넘으려는 침입자를 감시하고 포획하는 경비병과 같습니다.