본문 바로가기
Infra2025년 6월 22일7분 읽기

Fail2ban으로 SSH 브루트포스 공격 차단하기

YS
김영삼
조회 483

SSH 브루트포스 공격이란

SSH 브루트포스 공격은 자동화된 봇이 다양한 사용자명/비밀번호 조합을 반복 시도하여 서버에 무단 접근하려는 공격입니다. 인터넷에 노출된 SSH 서버는 하루에 수천 건의 공격을 받습니다. Fail2ban은 로그 파일을 모니터링하여 반복 실패한 IP를 자동으로 방화벽에서 차단합니다.

설치 및 기본 설정

# 설치
sudo apt update && sudo apt install fail2ban -y

# 서비스 시작
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# 기본 설정을 복사하여 로컬 설정 파일 생성
# (jail.conf는 업데이트 시 덮어씌워지므로 jail.local 사용)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

SSH Jail 설정

# /etc/fail2ban/jail.local

[DEFAULT]
# 기본 설정
bantime  = 1h          # 차단 시간
findtime = 10m         # 감시 시간 윈도우
maxretry = 5           # 최대 시도 횟수
banaction = iptables-multiport
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24  # 화이트리스트

# 이메일 알림 (선택)
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mwl)s  # 메일 + whois + 로그

[sshd]
enabled  = true
port     = ssh,2222            # SSH 포트 (변경했다면 추가)
filter   = sshd
logpath  = /var/log/auth.log   # Debian/Ubuntu
#logpath = /var/log/secure     # CentOS/RHEL
maxretry = 3
bantime  = 24h
findtime = 10m

# 점진적 차단 (재범자)
[sshd-aggressive]
enabled  = true
port     = ssh
filter   = sshd[mode=aggressive]
logpath  = /var/log/auth.log
maxretry = 1
bantime  = 7d
findtime = 30d

핵심 명령어

# 상태 확인
sudo fail2ban-client status
sudo fail2ban-client status sshd

# 차단된 IP 목록
sudo fail2ban-client get sshd banned

# 수동 IP 차단/해제
sudo fail2ban-client set sshd banip 203.0.113.100
sudo fail2ban-client set sshd unbanip 203.0.113.100

# Fail2ban 로그 확인
sudo tail -f /var/log/fail2ban.log

# 필터 테스트 (정규식 확인)
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

커스텀 필터 작성

# /etc/fail2ban/filter.d/nginx-login.conf
# Nginx 로그인 페이지 브루트포스 차단

[Definition]
failregex = ^<HOST> -.*"POST /api/auth/login HTTP.*" (401|403)
            ^<HOST> -.*"POST /login HTTP.*" (401|403)
ignoreregex =

# /etc/fail2ban/jail.local에 추가
[nginx-login]
enabled  = true
port     = http,https
filter   = nginx-login
logpath  = /var/log/nginx/access.log
maxretry = 10
bantime  = 1h
findtime = 5m

Recidive Jail — 재범자 강력 차단

# 여러 번 차단된 IP를 장기 차단
[recidive]
enabled  = true
filter   = recidive
logpath  = /var/log/fail2ban.log
bantime  = 4w          # 4주 차단
findtime = 1d          # 1일 내
maxretry = 3           # 3번 차단되면
banaction = iptables-allports  # 모든 포트 차단

Fail2ban + nftables (최신 방식)

# /etc/fail2ban/jail.local
[DEFAULT]
banaction = nftables-multiport
banaction_allports = nftables-allports

# nftables 규칙 확인
sudo nft list ruleset | grep -A 5 f2b

# iptables 규칙 확인 (레거시)
sudo iptables -L f2b-sshd -n --line-numbers

보안 강화 추가 조치

조치설정효과
SSH 키 인증만 허용PasswordAuthentication no브루트포스 원천 차단
루트 로그인 금지PermitRootLogin no공격 대상 제거
SSH 포트 변경Port 2222자동화 봇 회피
접속 IP 제한AllowUsers user@IP화이트리스트
MaxAuthTries 제한MaxAuthTries 3연결당 시도 제한
# /etc/ssh/sshd_config 보안 설정
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
AllowUsers deploy admin

# 적용
sudo systemctl restart sshd
  • Fail2ban은 SSH뿐 아니라 Nginx, Apache, Postfix 등 다양한 서비스에 적용할 수 있습니다
  • SSH 키 인증으로 전환하면 브루트포스가 원천 차단되므로, Fail2ban과 함께 사용하면 가장 효과적입니다
  • ignoreip에 자신의 IP를 반드시 추가하여 자가 차단을 방지하세요
  • bantime.increment 옵션을 사용하면 반복 범죄자의 차단 시간이 자동으로 늘어납니다

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록