서버 보안의 기초: Fail2ban을 이용한 SSH 무차별 대입 공격 차단법
서버 보안의 기초: Fail2ban을 이용한 SSH 무차별 대입 공격 차단법
리눅스 기반 클라우드 서버(AWS EC2, GCP, Ubuntu 등)를 처음 생성하면 외부 인터넷에 오픈되는 기본 포트 중 하나가 바로 SSH(22번 포트)입니다. 서버를 생성한 지 불과 몇 시간만 지나도 무차별 대입 공격(Brute Force Attack)이나 사전 공격(Dictionary Attack) 형태의 자동화된 봇(Bot) 스캔 작업이 수천 번씩 들어오는 것을 경험할 수 있습니다.
이러한 무차별 무작위 접근을 방치하면 서버 리소스가 낭비될 뿐만 아니라 계정 암호가 뚫려 인프라 전체가 위험에 노출될 수 있습니다. 이때 가장 효과적이면서도 가볍게 적용할 수 있는 첫 번째 보안 솔루치가 바로 Fail2ban입니다. 이번 글에서는 Fail2ban의 동작 원리와 설치, 그리고 SSH 접속 차단 설정 방법까지 체계적으로 살펴보겠습니다.

1. Fail2ban이란 무엇인가?
Fail2ban은 시스템 로그 파일(예: /var/log/auth.log 또는 /var/log/secure)을 실시간으로 감시하다가, 일정 시간 내에 지정된 횟수 이상 로그인에 실패한 IP를 감지하여 방화벽(iptables, ufw, firewalld 등) 규칙에 자동으로 차단 등록을 수행하는 프레임워크입니다.
Fail2ban이 제공하는 주요 이점은 다음과 같습니다.
- 자동화된 공격 차단: 사람의 개입 없이 악성 공격 봇의 접근을 실시간 차단합니다.
- 시스템 리소스 보호: 무수한 무차별 대입 시도로 발생하는 CPU 및 메모리 낭비를 줄입니다.
- 유연한 정책 설정: 차단 시간, 시도 횟수 제한, 감지 시간 범위를 서비스 성격에 맞게 조정할 수 있습니다.
- 다양한 서비스 지원: SSH뿐만 아니라 FTP, Nginx, Apache, Postfix 등 다양한 로그 패턴을 지원합니다.
2. Ubuntu/Debian 환경에서 Fail2ban 설치하기
Fail2ban은 대부분의 리눅스 패키지 관리자에서 기본으로 제공하므로 간편하게 설치할 수 있습니다.
우분투(Ubuntu) 기준 패키지 목록을 갱신하고 설치를 진행합니다.
# 패키지 목록 업데이트 및 설치
sudo apt update
sudo apt install fail2ban -y
# 패키지 설치 후 서비스 상태 확인
sudo systemctl status fail2ban
설치가 완료되면 Fail2ban 데몬이 자동으로 백그라운드에서 동작을 시작합니다.
3. Fail2ban 설정 파일 구성하기 (jail.local)
Fail2ban의 기본 설정 파일은 /etc/fail2ban/jail.conf에 위치해 있습니다. 하지만 패키지 업데이트 시 이 파일이 덮어씌워질 수 있으므로, 커스텀 설정을 위해 /etc/fail2ban/jail.local 파일을 별도로 생성하여 관리하는 것이 올바른 가이드라인입니다.
설정 파일 생성 및 편집
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT] 및 [sshd] 섹션 설정
파일 내부에서 SSH 차단 정책과 관련된 핵심 항목을 설정합니다.
[DEFAULT]
# 차단에서 제외할 IP (본인 관리자 IP 등록 권장)
ignoreip = 127.0.0.1/8 ::1
# 감지 기준 시간 (초 단위, 600초 = 10분)
findtime = 600
# 로그인 실패 허용 횟수
maxretry = 5
# IP 차단 유지 시간 (초 단위, 3600초 = 1시간 / -1로 설정 시 영구 차단)
bantime = 3600
[sshd]
# SSH 서비스 활성화 여부
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
각 파라미터의 상세한 역할은 다음과 같습니다.
- ignoreip: 의도치 않게 관리자 본인 IP가 차단되는 불상사를 막기 위해 백업 IP나 로컬 IP를 지정합니다.
- findtime: 지정한 시간 동안의 로그인 실패 기록을 추적합니다.
- maxretry: findtime 동안 maxretry 횟수를 초과해 실타하면 해당 IP를 즉시 차단합니다.
- bantime: 차단된 IP가 접속할 수 없도록 격리하는 시간입니다. 반복 공격을 막기 위해 24시간(86400) 이상으로 길게 지정하는 것이 좋습니다.
4. 설정 적용 및 동작 상태 확인
설정 파일 수정이 완료되었다면 Fail2ban 서비스를 재시작하여 변경 사항을 반영합니다.
# 서비스 재시작
sudo systemctl restart fail2ban
# SSH 감시 감옥(Jail) 상태 확인
sudo fail2ban-client status sshd
상태 명령어를 실행하면 현재 감시 중인 서비스 항목, 차단된 총 IP 개수(Currently banned), 차단된 IP 목록(Banned IP list)을 한눈에 확인할 수 있습니다.
5. 차단된 IP 해제 방법 (관리자 실수 조치)
만약 관리자가 비밀번호를 여러 번 틀려 본인 IP가 차단되었거나, 정상 사용자가 차단된 경우에는 아래 명령어로 특정 IP의 차단을 해제할 수 있습니다.
# 차단 해제 구문
sudo fail2ban-client set sshd unbanip [해제할_IP_주소]
# 예시
sudo fail2ban-client set sshd unbanip 192.168.1.50
요약 및 서버 보안 추가 팁
Fail2ban을 구축하는 것은 서버 보안의 첫 걸음이자 가장 효율적인 방어 장치입니다. 서버를 보다 안전하게 관리하기 위해서는 아래 보안 정책도 함께 적용하는 것을 추천합니다.
- SSH 기본 포트 변경: 표준 포트인 22번 대신 임의의 높은 포트(예: 22222번)로 변경하여 무작위 스캔 봇의 90% 이상을 사전에 차단합니다.
- 비밀번호 로그인 비활성화: SSH Key(공개키/개인키) 인증 방식을 사용하고 PasswordAuthentication no 설정을 적용합니다.
- root 계정 직접 로그인 금지: PermitRootLogin no 설정으로 일반 계정 접속 후 sudo 권한을 획득하도록 구성합니다.
서버 보안은 거창한 도구를 도입하는 것보다, 기본 설정과 모니터링을 지속해서 관리하는 것에서 시작됩니다. 지금 운영 중인 서버에 Fail2ban을 바로 적용해 보세요.