피드로 돌아가기
Dev.toSecurity
원문 읽기
자체 호스팅 서비스를 운영하는 팀이 Fail2ban을 도입해 SSH, Nginx, Vaultwarden에 대한 brute-force 공격 및 악성 봇 스캔을 자동화된 IP 차단으로 차단
Guide to Secure Your Self-Hosted Stacks like Nginx, SSH, & Vaultwarden with Fail2ban
AI 요약
Context
SSH(포트 22)와 HTTPS(포트 443)를 인터넷에 노출하는 순간 botnet과 자동화 스크립트의 brute-force 공격, 취약점 탐사, 비밀번호 매니저 침입 시도가 지속적으로 발생한다. 서버 로그의 악성 접근을 수동으로 모니터링하고 IP를 일일이 차단하는 것은 현실적으로 불가능하다.
Technical Solution
- SSH 보호 구성:
[sshd]jail을 활성화하여/var/log/auth.log를 모니터링하고 brute-force 시도 탐지 - Vaultwarden 맞춤 필터 구성: 정규식을 통해 "Username or password is incorrect" 로그 문자열 매칭으로 3회 실패 시 1시간 차단
- Nginx 웹 서버 보호 다층화:
[nginx-http-auth](인증 실패 감지),[nginx-bad-status](400/401/403/404/405/444 상태코드),[nginx-botsearch](악성 봇 패턴 탐사)로 구분 - Recidive 초장기 차단 정책: Fail2ban 자체 로그(
/var/log/fail2ban.log)를 모니터링하여 하루 내 2회 이상 다른 jail에서 차단된 IP를 4주간 격리 - 커스텀 필터 작성:
/etc/fail2ban/filter.d/디렉토리에 Vaultwarden과 Nginx Bad Status 정규식 필터를 별도 파일로 구성하여 관리
Key Takeaway
Fail2ban의 핵심은 정규식 기반 로그 매칭과 동적 방화벽 규칙 업데이트를 조합해 공격 패턴별로 차등 차단하는 것이다. jail.local 오버라이드 방식과 recidive 같은 재귀적 차단 메커니즘을 활용하면 단일 서버에서도 다층 방어 체계를 갖출 수 있다.
실천 포인트
자체 호스팅 인프라를 운영하는 DevOps 팀은 Fail2ban의 jail 구성 파일에서 `maxretry`, `bantime`, `findtime` 파라미터를 서비스별로 차등 설정(예: Vaultwarden 3회 실패 1시간 차단 vs Nginx Bad Status 15회 실패 10주 차단)하면 정상 사용자의 오탈자를 용인하면서도 스캔 공격을 조기에 격리할 수 있다. 또한 `.local` 파일로 기본 설정을 오버라이드하면 패키지 업데이트 시 커스텀 설정이 보존되므로 운영 안정성이 향상된다.