Fail2ban 설정 가이드 (SSH / Nginx 최소 보안 기준)¶
Fail2ban은 SSH/Nginx 등 서비스 로그를 분석하여 반복적인 인증 실패/비정상 접근을 시도하는 IP를
방화벽 규칙(firewalld/nftables/iptables 등)으로 자동 차단하는 Host 기반 침입 방지 도구(IPS) 임.
외부에 서비스가 노출된 서버에서는 포트 스캔/계정 탐색/무차별 대입 시도가 상시 발생하므로 기본 보안 구성요소로 Fail2ban 적용을 권장함.
공개키 인증을 사용하더라도 포트 스캔 및 인증 시도 단계의 공격을 완전히 차단할 수 없으므로 외부에 SSH 포트를 노출하는 서버에서는 Fail2ban 적용을 권장함.
단, 방화벽에서 SSH가 192.168.0.0/24 (특정 서버 내부 네트워크)에만 허용된 상태라면, 즉, 외부로 공개되지 않는 SSH 접근이면 SSH brute force를 맞는 구조가 아니므로, Fail2ban 우선순위는 높지 않음
1. Fail2ban 적용 목적¶
- SSH 비밀번호 대입 공격 차단.
- 포트 스캔 및 서비스 탐지 단계 공격 완화.
- 서버 자원 낭비 및 로그 오염 방지.
- SSH 보안 수준 강화.
- (선택) Nginx 기반 서비스에 대한 인증 시도/스캐닝 완화.
공개키 인증을 사용하더라도 Fail2ban 적용을 권장함.
2. 사전 보안 전제 (중요)¶
Fail2ban은 보조 수단이며, 아래 SSH 하드닝이 선행되어야 함.
2.1 SSH 최소 하드닝 권장 설정¶
/etc/ssh/sshd_config 에서 다음 항목을 확인/적용 권장.
# 비밀번호 인증 비활성화 (권장)
PasswordAuthentication no
# Root 직접 로그인 비활성화 (권장)
PermitRootLogin no
# 공개키 인증 사용
PubkeyAuthentication yes
# 한 SSH 연결 세션에서 허용되는 인증 시도 횟수 제한
MaxAuthTries 3
적용 후 SSH 재시작.
sudo systemctl restart sshd
위 설정 없이 Fail2ban만 적용하는 것은 보안적으로 효과가 제한적임.
3. Fail2ban 설치 (Rocky Linux)¶
Rocky Linux 기준 설치 명령은 다음과 같음.
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalld
설치 후 버전 확인.
fail2ban-client --version
4. 설정 파일 구성 원칙 (운영 베스트 프랙티스)¶
Fail2ban은 기본 설정 파일을 직접 수정하지 않으며,
jail.local 또는 jail.d/*.conf 파일로 설정을 오버라이드하는 방식이 권장됨.
/etc/fail2ban/jail.conf: 기본 설정(수정 금지)/etc/fail2ban/jail.local: 로컬 오버라이드(권장)/etc/fail2ban/jail.d/*.conf: jail 단위 설정 분리(선택)
⚠️ jail.conf를 통째로 복사하여 jail.local을 만드는 방식은 권장하지 않음.
(업데이트 시 충돌/불필요한 기본값 고정/설정 오염 위험)
5. 기본 설정 파일 준비 (jail.local 생성)¶
/etc/fail2ban/jail.local 파일을 생성/편집함.
sudo vi /etc/fail2ban/jail.local
6. 공통 기본 설정 (jail.local)¶
/etc/fail2ban/jail.local 상단에 기본 정책을 정의함.
[DEFAULT]
# 신뢰할 IP(내부망/관리자 IP)는 반드시 추가 권장
ignoreip = 127.0.0.1/8 192.168.0.0/24
# 정책 기본값
bantime = 10m
findtime = 10m
maxretry = 10
# Rocky Linux(systemd/journald) 환경에서 권장
backend = systemd
banaction = firewallcmd-rich-rules
ignoreip 설정 전
ip addr
서버 NIC의 CIDR 를 우선 확인 후 내부망 대역은 실제 네트워크 CIDR에 맞게 설정해야 함 (예: /24, /23 등).
설정 의미는 다음과 같음.
ignoreip: 차단 대상에서 제외할 IP(관리망/내부망/운영자 IP).maxretry: 허용 실패 횟수.findtime: 실패 횟수 집계 시간.bantime: 차단 시간.backend: systemd/journald 기반 로그 수집 방식 (Rocky/Ubuntu 공통. systemd 기반 로그 수집 권장).
운영 환경에서는
ignoreip에 관리자가 접속하는 고정 IP 또는 내부망 CIDR을 반드시 추가하는 것을 권장함. Gateway 또는 Reverse Proxy 서버에서는 내부망 CIDR(예: 192.168.0.0/24)을 반드시 ignoreip에 포함해야 함. 내부 사용자 트래픽이 빈번한 환경에서 Fail2ban이 내부 IP를 차단할 경우 사내 전체 접속 장애가 발생할 수 있음. Gateway/Reverse Proxy 서버는 내부 CIDR을 ignoreip에 반드시 포함 권장함. 내부망 SSH만 허용하더라도, 운영자가 외부에서 VPN/우회 경로로 접속할 수 있는 환경이라면 관리자 공인 IP를 ignoreip에 추가 권장함.
7. SSH 보호 설정 (jail.local)¶
/etc/fail2ban/jail.local에 SSH jail을 활성화함.
[sshd]
enabled = true
port = ssh
backend = systemd
port = ssh: /etc/services의 ssh(기본 22) 사용. SSH 포트를 변경했다면 숫자로 명시 권장(예: 2222).
8. Nginx 최소 보호 설정 (권장)¶
Nginx 기반 서비스가 외부에 노출되어 있다면, 아래 jail을 추가하여 인증 반복 시도/스캐닝을 완화할 수 있음.
8.1 Nginx 로그 경로 확인 (사전 조건)¶
일반적인 기본 경로는 다음과 같음.
- Access Log:
/var/log/nginx/access.log - Error Log:
/var/log/nginx/error.log
Nginx 설정에서 로그 경로가 다르면 logpath를 환경에 맞게 조정 필요.
Reverse Proxy/LB가 앞단에 있으면 access.log에 실제 클라이언트 IP가 기록되는지 확인 필요함.
(모든 요청이 내부 IP로 찍히면 Fail2ban이 내부 IP를 차단해 장애를 유발할 수 있음)
8.2 Nginx HTTP Auth 보호 (nginx-http-auth)¶
Basic Auth 등 인증 실패가 반복되는 경우 차단.
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
8.3 Nginx 스캐닝/봇 완화 (선택: nginx-badbots)¶
의심스러운 User-Agent 또는 반복 스캐닝 패턴을 완화.
[nginx-badbots]
enabled = true
filter = nginx-badbots
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 10m
bantime = 12h
실제 운영에서는 오탐(정상 크롤러/모니터링)이 발생할 수 있으므로
적용 후 로그 및 차단 현황을 확인하며 조정하는 것을 권장함.
⚠️ nginx-badbots 적용 시 주의 사항
- Googlebot, Bingbot 등 정상 검색 엔진 차단 가능성
- OpenAI SearchBot 등 합법 크롤러 차단 가능성
- 모니터링 서비스(Uptime Robot 등) 차단 가능성
- 내부 보안 스캐너/CI 헬스체크 차단 가능성
- SEO 색인 실패 및 검색 노출 저하 가능성
9. recidive jail 추가¶
여러 번 밴되는 IP 를 장시간 또는 영구 차단 recidive는 다른 jail에서 반복적으로 차단된 IP를 장기 차단하기 위한 2차 방어 레이어임.
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = firewallcmd-rich-rules
findtime = 24h # 24 시간 안에
maxretry = 3 # 3번 이상 다른 jail 에서 ban 되면
bantime = 24h # 24 시간 차단.
/var/log/fail2ban.log가 존재하지 않으면 /etc/fail2ban/fail2ban.conf의 logtarget 설정을 확인/조정 필요함.
10. Fail2ban 서비스 실행 및 활성화¶
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
11. Fail2ban 동작 확인¶
현재 Fail2ban 상태 확인.¶
sudo fail2ban-client status
SSH jail 상태 확인.¶
sudo fail2ban-client status sshd
sudo fail2ban-client status recidive
firewalld 연동 확인¶
sudo firewall-cmd --permanent --list-rich-rules
- Fail2ban이 밴하면 여기에 자동으로 rich rule이 추가됨.
Nginx jail 상태 확인(활성화한 경우).¶
sudo fail2ban-client status nginx-http-auth
sudo fail2ban-client status nginx-badbots
- 차단된 IP 확인 가능함.
12. 방화벽 연동 확인 (Rocky Linux)¶
Fail2ban은 방화벽과 연동되어 동작함.
Rocky Linux는 보통 firewalld(백엔드 nftables) 구성을 사용함.
방화벽 규칙 확인(환경에 따라 다를 수 있음).
sudo firewall-cmd --permanent --list-rich-rules
firewalld를 사용하지 않는 경우(iptables 직접 사용 등), 환경에 맞게 연동 상태를 확인 필요.
13. 차단 해제 방법 (필요 시)¶
특정 IP 차단 해제.¶
sudo fail2ban-client set sshd unbanip <IP_ADDRESS>
Nginx jail에서 차단된 IP 해제(예: nginx-badbots).¶
sudo fail2ban-client set nginx-badbots unbanip <IP_ADDRESS>
14. 주의 사항¶
- SSH 포트 변경 시
[sshd]의port항목도 반드시 수정 필요. - 로그 경로(
/var/log/secure,/var/log/nginx/*.log)는 배포판/설정에 따라 달라질 수 있음. - Docker 환경에서 Fail2ban은 호스트 로그 기준으로 동작하는 것이 일반적이며, 컨테이너 내부 로그만으로는 탐지가 제한될 수 있음.
- Fail2ban은 WAF를 대체하지 않으며, 애플리케이션 레벨(L7) 방어는 별도(WAF/Rate limit 등) 고려 필요.
15. 처음 적용하는 경우를 위한 안전 가이드 (중요)¶
본 설정은 Fail2ban을 처음 적용하는 사용자를 기준으로 작성된 문서가 아니므로,
실제 운영 서버에 처음 적용할 경우 아래 절차를 반드시 선행할 것을 권장함.
Fail2ban은 설정 오류 시 관리자 본인 IP가 차단되어 SSH 접속이 불가능해질 수 있음.
15.1 작업 전 필수 준비 사항¶
- 이미 접속된 SSH 세션은 절대 종료하지 말 것
- 가능하면 2개 이상의 SSH 세션을 유지한 상태로 작업
- 클라우드 환경인 경우, 콘솔(KVM/Serial Console) 접근 가능 여부 확인 권장
15.2 관리자 공인 IP 확인 (필수)¶
Fail2ban 적용 전, 현재 접속 중인 관리자의 공인 IP를 확인함.
curl ifconfig.me
출력된 IP 주소는 반드시 ignoreip 항목에 추가해야 함.
예시:
ignoreip = 127.0.0.1/8 203.xxx.xxx.xxx
ignoreip미설정 상태에서 Fail2ban을 활성화할 경우
관리자가 스스로를 차단하는 사고가 발생할 수 있음.
15.3 처음 적용 시 권장 초기 완화 설정¶
처음 적용하는 경우, 아래와 같이 차단 정책을 완화하여 시작하는 것을 권장함.
[DEFAULT]
bantime = 10m
findtime = 10m
maxretry = 10
- 초기에는 차단 조건을 느슨하게 설정
- 1~2일 운영 후 정상 동작 확인
- 이후 점진적으로 강화 권장
15.4 Fail2ban 적용 순서 권장안¶
처음 적용 시 다음 순서를 권장함.
- Fail2ban 설치
- SSH jail만 활성화
- 1~2일 이상 정상 동작 확인
- 이후 Nginx jail 추가 적용
SSH + Nginx jail을 동시에 처음 적용할 경우
차단 원인 분석이 어려워질 수 있음.
15.5 실수로 관리자 IP가 차단된 경우 대응¶
SSH 접속이 가능한 상태라면, 아래 명령으로 즉시 차단 해제 가능함.
sudo fail2ban-client set sshd unbanip <ADMIN_IP>
Fail2ban으로 인해 SSH 접속이 완전히 불가능해진 경우,
콘솔 접근 후 Fail2ban 서비스를 중지함.
sudo systemctl stop fail2ban
15.6 운영 안정화 이후 권장 강화 정책¶
운영이 안정화되면 아래와 같이 강화하는 것을 권장함.
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
16. 운영 관점 요약¶
- SSH가 내부망으로만 제한된 환경에서는 Fail2ban은 2차 방어 수단의 성격을 가짐.
- Fail2ban은 필수 보안 구성 요소이지만, 단독 보안 솔루션은 아님
- SSH 키 인증 + Root 로그인 차단이 선행되어야 효과적
- 처음 적용 시에는 보수적 설정 → 점진적 강화가 원칙
- Reverse Proxy / Docker / Cloud 환경에서는 로그 흐름을 반드시 고려해야 함