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