fail2ban과 리눅스 방화벽을 연동하여 SSH 무차별 대입 공격을 자동으로 차단하고 서버 보안을 강화하는 실전 설정 방법과 모니터링 기법을 완벽 해설합니다.
서버 관리자라면 누구나 한 번쯤 경험해봤을 SSH 로그인 시도 공격.
매일 수백, 수천 번의 무차별 대입 공격이 서버를 노리고 있습니다.
이런 공격으로부터 서버를 보호하는 가장 효과적인 방법이 바로 fail2ban과 리눅스 방화벽 연동입니다.
fail2ban이란? 서버 보안의 필수 도구
fail2ban은 로그 파일을 실시간으로 모니터링하여 의심스러운 활동을 감지하고, 자동으로 IP를 차단하는 오픈소스 보안 도구입니다.
주로 SSH, HTTP, FTP 등의 서비스에 대한 무차별 대입 공격을 방어하는 데 사용됩니다.
fail2ban의 핵심 기능
실시간 로그 분석
- 지정된 로그 파일을 지속적으로 모니터링
- 정규식을 통한 패턴 매칭으로 공격 시도 감지
- 임계값 초과 시 자동 IP 차단
다양한 방화벽 연동
- iptables, firewalld, pf 등 다양한 방화벽 지원
- 유연한 차단 규칙 설정
- 임시/영구 차단 옵션
알림 및 로깅
- 이메일, Slack 등 다양한 알림 방식 지원
- 상세한 차단 로그 기록
- 통계 및 분석 데이터 제공
무차별 대입 공격의 위험성과 대응 필요성
2025년 서버 보안 위협 현황
최근 보안 업계 보고서에 따르면, SSH 무차별 대입 공격은 여전히 가장 빈번한 서버 공격 유형 중 하나입니다.
특히 클라우드 환경의 확산으로 인해 공격자들의 타겟이 더욱 늘어나고 있는 상황입니다.
공격 패턴과 특징
공격 유형 | 특징 | 대응 방안 |
---|---|---|
저강도 지속형 | 하루 수십 회 시도 | 임계값 기반 차단 |
고강도 집중형 | 짧은 시간 수백 회 시도 | 실시간 자동 차단 |
분산형 공격 | 여러 IP에서 동시 시도 | 패턴 분석 기반 차단 |
사전 공격 | 일반적인 패스워드 시도 | 강력한 패스워드 정책 |
fail2ban 설치와 기본 설정
설치 과정
Ubuntu/Debian 계열
sudo apt update
sudo apt install fail2ban
CentOS/RHEL 계열
sudo yum install epel-release
sudo yum install fail2ban
서비스 시작과 자동 시작 설정
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo systemctl status fail2ban
기본 설정 파일 구조
fail2ban의 설정은 주로 /etc/fail2ban/
디렉토리에 위치합니다.
중요한 파일들을 살펴보겠습니다.
주요 설정 파일
jail.conf
: 기본 jail 설정 (수정 금지)jail.local
: 사용자 정의 jail 설정 (권장)filter.d/
: 로그 패턴 정의 파일들action.d/
: 차단 액션 정의 파일들
SSH brute force 방어를 위한 jail 설정
jail.local 파일 생성과 설정
기본 설정을 복사하여 사용자 정의 설정을 만듭니다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
SSH 보안 강화 설정
[DEFAULT]
# 기본 차단 시간 (초)
bantime = 3600
# 관찰 시간 (초)
findtime = 600
# 최대 시도 횟수
maxretry = 3
# 무시할 IP 목록
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
[sshd]
enabled = true
port = ssh,22
filter = sshd
logpath = /var/log/auth.log
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=admin@yourdomain.com]
maxretry = 3
bantime = 7200
findtime = 300
고급 SSH 보안 설정
더 강력한 보안을 위한 추가 설정입니다.
[sshd-ddos]
enabled = true
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 2
bantime = 86400
findtime = 120
[sshd-aggressive]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 1
bantime = 604800
findtime = 600
iptables와 fail2ban 연동 설정
iptables 연동의 이점
iptables는 리눅스의 기본 방화벽으로, fail2ban과의 연동을 통해 강력한 패킷 필터링 기능을 제공합니다.
연동을 통해 얻을 수 있는 주요 이점들을 살펴보겠습니다.
성능상 이점
- 커널 레벨에서의 패킷 처리
- 높은 처리 속도와 효율성
- 시스템 리소스 절약
fail2ban iptables 연동 구성도
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 공격자 IP │───▶│ fail2ban │───▶│ iptables │
│ │ │ │ │ │
│ 123.456.789.10 │ │ 로그 분석 및 │ │ IP 차단 규칙 │
│ 987.654.321.20 │ │ 패턴 매칭 │ │ 자동 생성 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
↓
┌─────────────────┐
│ 차단된 IP 목록 │
│ │
│ - 123.456.*.* │
│ - 987.654.*.* │
└─────────────────┘
iptables 액션 설정
/etc/fail2ban/action.d/iptables-multiport.conf
파일을 확인하고 필요시 수정합니다.
[Definition]
actionstart = iptables -N f2b-<name>
iptables -A f2b-<name> -j RETURN
iptables -I <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck = iptables -n -L <chain> | grep -q 'f2b-<name>[ \t]'
actionban = iptables -I f2b-<name> 1 -s <ip> -j <blocktype>
actionunban = iptables -D f2b-<name> -s <ip> -j <blocktype>
firewalld와 fail2ban 연동 실전 예제
firewalld 연동의 장점
firewalld는 동적 방화벽 관리를 제공하여 서비스 재시작 없이 규칙 변경이 가능합니다.
최신 리눅스 배포판에서 기본적으로 사용되는 방화벽 솔루션입니다.
firewalld fail2ban 연동 설정
[DEFAULT]
banaction = firewallcmd-ipset
banaction_allports = firewallcmd-allports
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
action = firewallcmd-ipset[name=sshd, bantime=3600]
maxretry = 3
bantime = 3600
findtime = 600
firewalld 서비스 확인
fail2ban이 firewalld와 올바르게 연동되었는지 확인하는 방법입니다.
# firewalld 상태 확인
sudo firewall-cmd --state
# fail2ban zone 확인
sudo firewall-cmd --list-all
# 차단된 IP 확인
sudo firewall-cmd --list-sources
로그 분석과 실시간 모니터링 구현
로그인 시도 감지 패턴
fail2ban은 정규식을 사용하여 로그 패턴을 분석합니다.
SSH 관련 주요 패턴들을 살펴보겠습니다.
기본 SSH 필터 패턴
# 인증 실패 패턴
^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error|failed) for .* from <HOST>
# 잘못된 사용자 패턴
^%(__prefix_line)s(?:error: )?Illegal user .* from <HOST>
# 연결 시도 패턴
^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers
실시간 모니터링 스크립트
서버 상태를 실시간으로 모니터링하는 스크립트를 작성해보겠습니다.
#!/bin/bash
# fail2ban_monitor.sh
echo "=== fail2ban 실시간 모니터링 ===="
echo "현재 시간: $(date)"
echo
# 활성화된 jail 목록
echo "📋 활성화된 Jail 목록:"
sudo fail2ban-client status
echo
echo "🚫 차단된 IP 현황:"
for jail in $(sudo fail2ban-client status | grep "Jail list:" | cut -d: -f2 | sed 's/,/ /g'); do
jail=$(echo $jail | xargs) # 공백 제거
if [ -n "$jail" ]; then
banned=$(sudo fail2ban-client status $jail | grep "Banned IP list:" | cut -d: -f2)
echo "[$jail]: $banned"
fi
done
echo
echo "📊 최근 1시간 SSH 로그인 시도:"
tail -1000 /var/log/auth.log | grep "$(date +"%b %d %H")" | grep "authentication failure" | wc -l
알림 설정과 보안 정책 수립
이메일 알림 설정
공격 감지 시 즉시 알림을 받을 수 있도록 설정합니다.
[DEFAULT]
# SMTP 설정
destemail = admin@yourdomain.com
sendername = Fail2Ban Alert
sender = fail2ban@yourdomain.com
# 메일 액션 설정
action = %(action_mwl)s
[sshd]
enabled = true
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=%(destemail)s]
Slack 웹훅 연동
더 빠른 알림을 위한 Slack 연동 설정입니다.
# /etc/fail2ban/action.d/slack-notify.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -X POST -H 'Content-type: application/json' --data '{"text":"🚨 IP <ip> has been banned from <name> jail"}' <slack_webhook_url>
actionunban = curl -X POST -H 'Content-type: application/json' --data '{"text":"✅ IP <ip> has been unbanned from <name> jail"}' <slack_webhook_url>
보안 정책 체크리스트
항목 | 권장 설정 | 현재 설정 | 상태 |
---|---|---|---|
SSH 포트 변경 | 2222 등 | 22 | ❌ |
키 인증 사용 | enabled | password | ❌ |
root 로그인 금지 | no | yes | ❌ |
fail2ban 활성화 | enabled | enabled | ✅ |
강력한 패스워드 | 복합 문자 | 확인 필요 | ⚠️ |
성능 최적화와 문제 해결
성능 최적화 팁
로그 순환 설정
# /etc/logrotate.d/fail2ban
/var/log/fail2ban.log {
weekly
missingok
rotate 4
compress
notifempty
create 640 root root
postrotate
systemctl reload fail2ban
endscript
}
메모리 사용량 최적화
[DEFAULT]
# 데이터베이스 최적화
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400
# 로그 레벨 조정
loglevel = INFO
일반적인 문제와 해결책
문제 1: fail2ban 서비스가 시작되지 않음
# 설정 파일 문법 확인
sudo fail2ban-client -t
# 로그 확인
sudo journalctl -u fail2ban -f
문제 2: IP가 차단되지 않음
# jail 상태 확인
sudo fail2ban-client status sshd
# 필터 테스트
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
실무 보안 팁과 고급 활용법
화이트리스트 관리
신뢰할 수 있는 IP 대역을 화이트리스트로 등록합니다.
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
your.trusted.ip.address
지역별 IP 차단
특정 국가의 IP를 차단하는 방법입니다.
# GeoIP 데이터베이스 설치
sudo apt install geoip-database geoip-bin
# 국가별 IP 목록 생성
geoiplookup 1.2.3.4
자동 차단 해제 스크립트
정해진 시간 후 자동으로 IP 차단을 해제하는 스크립트입니다.
#!/bin/bash
# auto_unban.sh
LOG_FILE="/var/log/fail2ban_auto_unban.log"
UNBAN_TIME=86400 # 24시간
while IFS= read -r line; do
IP=$(echo $line | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b")
BAN_TIME=$(echo $line | grep -oE "[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}")
if [ -n "$IP" ] && [ -n "$BAN_TIME" ]; then
CURRENT_TIME=$(date +%s)
BAN_TIMESTAMP=$(date -d "$BAN_TIME" +%s)
if [ $((CURRENT_TIME - BAN_TIMESTAMP)) -gt $UNBAN_TIME ]; then
sudo fail2ban-client set sshd unbanip $IP
echo "$(date): Automatically unbanned $IP" >> $LOG_FILE
fi
fi
done < /var/log/fail2ban.log
2025년 서버 보안 트렌드와 대응 방안
새로운 공격 패턴
AI 기반 공격
- 머신러닝을 활용한 패스워드 추측
- 행동 패턴 분석을 통한 우회 시도
- 분산 공격 네트워크 활용
대응 방안
- 더 강화된 임계값 설정
- 행동 패턴 분석 기반 필터링
- AI 기반 보안 솔루션 연동
클라우드 환경에서의 고려사항
클라우드 서비스 사용 시 추가로 고려해야 할 사항들입니다.
AWS 환경
- Security Group과 fail2ban 연동
- CloudWatch를 통한 로그 수집
- Lambda를 활용한 자동화
Docker 컨테이너 환경
- 컨테이너별 개별 설정
- 호스트 시스템과의 연동
- 오케스트레이션 도구와의 통합
마무리와 지속적인 보안 관리
무차별 대입 공격 차단은 서버 보안의 기본이자 핵심입니다.
fail2ban과 리눅스 방화벽의 연동을 통해 강력한 방어체계를 구축할 수 있습니다.
핵심 포인트 요약
설정 관리
- 정기적인 설정 검토와 업데이트
- 로그 분석을 통한 공격 패턴 파악
- 알림 시스템을 통한 실시간 대응
지속적인 모니터링
- 일일 보안 상태 점검
- 주간/월간 보안 리포트 작성
- 새로운 위협에 대한 대응 방안 수립
fail2ban 설정은 한 번 구성하고 끝나는 것이 아닙니다.
지속적인 모니터링과 개선을 통해 서버의 보안을 유지해야 합니다.
정기적으로 로그를 분석하고, 새로운 공격 패턴에 대응할 수 있도록 설정을 업데이트하는 것이 중요합니다.
서버 보안은 기술적인 설정뿐만 아니라 지속적인 관심과 노력이 필요한 영역입니다.
이 가이드를 통해 구축한 방어 시스템을 바탕으로, 안전하고 안정적인 서버 운영을 이어가시기 바랍니다.
참고 문서
같이 읽으면 좋은 글
포트 포워딩: 원리, 설정 방법, 실전 활용 및 보안 팁까지 완전정리
포트 포워딩 설정으로 외부 접속을 안전하게 구성하는 2025년 최신 가이드와 보안 대책까지 한번에 정리했습니다.포트 포워딩의 기본 개념과 원리포트 포워딩이란?포트 포워딩(Port Forwarding)은 공
notavoid.tistory.com
ClamAV란? 동작 원리부터 설치·활용 가이드까지 오픈소스 백신 완벽 정리
ClamAV는 시스코 시스템즈에서 지원하는 오픈소스 크로스플랫폼 바이러스 검사 소프트웨어로,서버 보안과 이메일 보안에 특화된 무료 백신 솔루션입니다.리눅스 서버 환경에서 보안을 담당하고
notavoid.tistory.com
nftables로 리눅스 방화벽 구성하기 - iptables 대체 가이드
리눅스 시스템 관리자와 보안 전문가들에게 방화벽 구성은 필수적인 업무입니다.오랫동안 iptables가 리눅스 방화벽의 표준으로 사용되어 왔지만, 최근 nftables가 차세대 방화벽 솔루션으로 주목
notavoid.tistory.com
'linux' 카테고리의 다른 글
firewalld vs iptables: 리눅스 방화벽 관리 도구의 차이점과 실전 활용 가이드 (0) | 2025.07.22 |
---|---|
nftables로 리눅스 방화벽 구성하기 - iptables 대체 가이드 (0) | 2025.06.15 |
CentOS Amazon Linux SSL 인증서 자동갱신 설정 방법 - Certbot Nginx Cron 완벽 가이드 (0) | 2025.06.01 |
.bashrc와 .zshrc를 활용한 터미널 환경 최적화 완벽 가이드 (0) | 2025.05.26 |
awk, sed, xargs를 활용한 실무 예제 모음: 리눅스 텍스트 처리 마스터 가이드 (0) | 2025.05.25 |