Ubuntu 22.04에서 Fail2ban으로 SSH 무차별 대입 공격을 차단하는 방법

안녕하세요. 지구 IDC 기술팀입니다.

오늘은 Ubuntu 22.04에서 Fail2ban으로 SSH 무차별 대입 공격을 차단하는 방법을 알아보겠습니다. Fail2ban은 SSH 인증 실패 로그를 감시하다가 같은 IP에서 일정 횟수 이상 로그인에 실패하면 해당 IP의 SSH 접속을 일정 시간 차단합니다.

이 문서에서는 Fail2ban 설치, SSH jail 설정, 관리자 IP 예외 처리, 설정 검사, 차단 현황 확인과 오차단 해제까지 단계별로 설명합니다. Fail2ban은 취약한 비밀번호를 안전하게 바꾸어 주는 도구가 아니므로 SSH 공개키 인증과 보안 업데이트를 함께 적용하는 것이 중요합니다.

적용 환경

문서 적용 기준
항목 기준
운영체제 Ubuntu 22.04 LTS
SSH 서버 openssh-server, 서비스명 ssh.service, 기본 포트 TCP 22
Fail2ban Ubuntu 22.04 저장소의 fail2ban 패키지, 서비스명 fail2ban.service
로그 입력 rsyslog가 기록하는 /var/log/auth.log
예시 값 서버 203.0.113.10, 관리자 접속 IP 198.51.100.20

이 문서에서 알아볼 내용

  • SSH 인증 실패 로그와 현재 방화벽 상태 확인
  • Fail2ban과 rsyslog 설치 및 서비스 활성화
  • SSH 전용 jail과 관리자 IP 예외 설정
  • 설정 문법과 필터 일치 여부 검사
  • 차단된 IP 확인, 수동 차단 해제와 로그 점검
  • SSH 포트 변경 환경과 자주 발생하는 오류 해결
  • 설정 비활성화와 완전 제거 방법

작업 전 준비사항

Fail2ban 설정을 시작하기 전에 현재 SSH 세션을 유지하고, 호스팅 콘솔이나 KVM 등 서버에 직접 접근할 수 있는 복구 수단을 확인합니다. 관리자가 접속하는 공인 IP가 고정되어 있다면 ignoreip에 등록하여 오차단 위험을 줄일 수 있습니다.

운영체제 버전, 현재 접속 IP와 SSH 수신 포트를 확인합니다.

cat /etc/os-release
printf '%s\n' "$SSH_CONNECTION"
sudo ss -lntp | grep sshd

원격 세션에서 SSH_CONNECTION의 첫 번째 값은 일반적으로 클라이언트 IP입니다. 프록시, VPN 또는 점프 호스트를 통과한다면 서버 로그에 실제로 기록되는 IP를 기준으로 예외 처리해야 합니다.

SSH 서비스와 인증 로그 확인

Fail2ban은 SSH 서버 자체를 대신하는 프로그램이 아니라 인증 실패 기록을 읽어 방화벽 차단 규칙을 추가합니다. 먼저 OpenSSH 서비스가 실행 중인지 확인합니다.

sudo systemctl is-active ssh.service
sudo systemctl status ssh.service --no-pager
sudo journalctl -u ssh.service -n 30 --no-pager

Ubuntu 22.04의 일반적인 서버 구성에서는 rsyslog가 SSH 인증 기록을 /var/log/auth.log에 저장합니다. 파일 존재 여부와 최근 로그를 확인합니다.

sudo test -f /var/log/auth.log && echo "auth.log exists"
sudo tail -n 30 /var/log/auth.log

파일이 없더라도 다음 단계에서 rsyslog를 설치하고 시작할 수 있습니다. 로그인 실패가 발생했는데도 인증 기록이 전혀 보이지 않는다면 Fail2ban 설정 전에 SSH와 로그 수집 상태부터 해결해야 합니다.

Fail2ban 설치

패키지 목록을 갱신한 뒤 Fail2ban과 인증 로그를 기록할 rsyslog를 설치합니다.

sudo apt update
sudo apt install -y fail2ban rsyslog

rsyslog를 즉시 시작하고 부팅 시 자동 실행되도록 설정합니다.

sudo systemctl enable --now rsyslog.service
sudo systemctl is-active rsyslog.service

설치된 Fail2ban 버전과 주요 설정 디렉터리를 확인합니다.

fail2ban-client --version
dpkg -s fail2ban | grep -E '^(Package|Version|Status):'
sudo ls -ld /etc/fail2ban /etc/fail2ban/jail.d

SSH jail 설정

다음 예시는 10분 동안 SSH 인증에 5회 실패한 IP를 1시간 동안 차단합니다. 198.51.100.20은 예시 관리 IP이므로 실제 고정 공인 IP로 변경하거나, 고정 IP가 없다면 해당 값만 제거하십시오.

sudo tee /etc/fail2ban/jail.d/sshd.local > /dev/null <<'EOF'
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
bantime = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
backend = auto
EOF
주요 설정값의 의미
설정 의미
ignoreip 차단하지 않을 IP 또는 CIDR 목록입니다. 실제 관리 IP를 정확히 확인해 입력합니다.
bantime = 1h 조건을 충족한 IP를 1시간 동안 차단합니다.
findtime = 10m 현재 시점부터 이전 10분 동안의 실패 기록을 집계합니다.
maxretry = 5 집계 기간 안에 5회 실패하면 차단합니다.
port = ssh 서비스 데이터베이스의 기본 SSH 포트인 TCP 22를 차단 대상으로 사용합니다.
logpath Fail2ban이 감시할 Ubuntu 인증 로그 파일입니다.

SSH 포트를 변경한 서버

SSH가 2222번 포트에서 수신한다면 port = ssh를 실제 포트 번호로 변경합니다.

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
backend = auto

여러 SSH 포트를 동시에 운영한다면 쉼표로 구분할 수 있습니다. Fail2ban의 포트 설정은 차단 규칙의 대상 포트를 지정하는 값이며, SSH 데몬의 실제 수신 포트를 변경하지는 않습니다.

설정 검사와 서비스 시작

서비스를 시작하기 전에 Fail2ban 전체 설정을 검사합니다.

sudo fail2ban-client -t

검사 결과에 오류가 없을 때 Fail2ban을 시작하고 부팅 시 자동 실행되도록 설정합니다.

sudo systemctl enable --now fail2ban.service
sudo systemctl is-active fail2ban.service
sudo systemctl status fail2ban.service --no-pager

서비스가 시작되지 않으면 다음 로그에서 잘못된 파일 경로, 설정 항목 또는 방화벽 명령 오류를 확인합니다.

sudo journalctl -u fail2ban.service -b --no-pager
sudo tail -n 100 /var/log/fail2ban.log

Fail2ban SSH 차단 작동 확인

먼저 Fail2ban 서버와 활성화된 jail 목록을 확인합니다.

sudo fail2ban-client ping
sudo fail2ban-client status
sudo fail2ban-client status sshd

status 결과의 Jail list에 sshd가 표시되어야 합니다. status sshd에서는 현재 실패 수, 누적 실패 수, 현재 차단 수와 차단 IP 목록을 확인할 수 있습니다.

실제 로그가 SSH 필터와 일치하는지 안전하게 검사합니다. 이 명령은 로그를 분석할 뿐 방화벽에 차단 규칙을 추가하지 않습니다.

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Fail2ban이 생성한 방화벽 체인이 있는지 확인합니다. Ubuntu 환경의 iptables 명령이 nftables 호환 백엔드를 사용하는 경우에도 다음 명령으로 규칙을 확인할 수 있습니다.

sudo iptables -S | grep -E 'f2b-sshd|fail2ban'
sudo nft list ruleset | grep -E 'f2b-sshd|fail2ban'

운영 중 차단 현황 확인과 해제

현재 차단된 IP 확인

sudo fail2ban-client status sshd
sudo fail2ban-client get sshd banip

특정 IP 차단 해제

예시 IP 198.51.100.20의 차단을 해제하려면 서버 콘솔이나 아직 연결된 다른 관리 세션에서 다음 명령을 실행합니다.

sudo fail2ban-client set sshd unbanip 198.51.100.20
sudo fail2ban-client status sshd

설정 변경 후 다시 적용

설정 파일을 수정한 뒤에는 먼저 문법을 검사하고 서비스를 다시 불러옵니다.

sudo fail2ban-client -t
sudo fail2ban-client reload
sudo fail2ban-client status sshd

설정이 복잡하게 변경되었거나 jail 재시작이 필요한 경우에는 Fail2ban 서비스를 재시작할 수 있습니다.

sudo systemctl restart fail2ban.service
sudo systemctl is-active fail2ban.service

SSH 보안 권장사항

  • 관리 계정에는 충분히 긴 고유 비밀번호를 사용하고 가능하면 SSH 공개키 인증으로 전환합니다.
  • 공개키 로그인을 검증한 뒤 비밀번호 인증 비활성화를 검토합니다.
  • root 직접 로그인을 허용하기보다 sudo 권한이 있는 일반 관리 계정을 사용합니다.
  • SSH와 Fail2ban 패키지의 보안 업데이트를 정기적으로 적용합니다.
  • 가능하다면 UFW, 클라우드 보안 그룹 또는 라우터 ACL에서 SSH 접근 원본 IP를 제한합니다.
  • Fail2ban 로그와 차단 통계를 주기적으로 검토하여 잘못된 필터링이나 지속 공격 여부를 확인합니다.

자주 발생하는 오류와 해결 방법

Fail2ban SSH jail 오류 진단표
증상 가능한 원인 확인 방법 해결 방법
Fail2ban 서비스가 시작되지 않음 설정 문법 오류, 존재하지 않는 로그 경로 또는 방화벽 명령 오류 fail2ban-client -t, journalctl -u fail2ban 오류에 표시된 파일과 줄을 수정하고 로그 파일 및 rsyslog 상태 확인
sshd jail이 목록에 없음 enabled = true 누락, 파일 확장자 또는 섹션명 오류 fail2ban-client status, 설정 파일 내용 확인 /etc/fail2ban/jail.d/sshd.local[sshd] 섹션 수정 후 reload
로그인 실패가 누적되지 않음 /var/log/auth.log 미생성, 다른 로그 경로 또는 필터 불일치 tail, journalctl -u ssh, fail2ban-regex rsyslog를 시작하고 SSH 실패 로그가 auth.log에 기록되는지 먼저 확인
차단 수는 증가하지만 SSH 접속이 계속 가능함 잘못된 SSH 포트, 방화벽 action 적용 실패, 프록시를 통한 다른 경로 ss -lntp, iptables -S, Fail2ban 로그 port 값을 실제 SSH 포트로 맞추고 방화벽 명령 오류 해결
관리자 IP가 차단됨 실제 접속 IP와 ignoreip 값이 다르거나 프록시·VPN 사용 서버 로그와 SSH_CONNECTION, jail 상태 확인 콘솔에서 unbanip 실행 후 실제 원본 IP를 예외 목록에 등록
설정 변경이 반영되지 않음 reload 누락 또는 다른 .local 파일의 중복 설정 grep -Rnifail2ban-client get 명령 중복 값을 정리하고 설정 검사 후 reload 또는 서비스 재시작

현재 적용값 확인

sudo fail2ban-client get sshd maxretry
sudo fail2ban-client get sshd findtime
sudo fail2ban-client get sshd bantime
sudo fail2ban-client get sshd ignoreip
sudo fail2ban-client get sshd logpath

실시간 로그 확인

sudo tail -f /var/log/auth.log /var/log/fail2ban.log

SSH 실패 기록이 auth.log에 들어오지만 Fail2ban 로그에 매치나 차단 기록이 없다면 필터 검사 결과와 적용 중인 jail 값을 비교하십시오.

원상복구와 Fail2ban 제거

SSH jail만 비활성화

이 문서에서 만든 설정 파일을 백업 이름으로 변경한 뒤 설정을 검사하고 Fail2ban을 다시 시작합니다.

sudo mv /etc/fail2ban/jail.d/sshd.local \
  /etc/fail2ban/jail.d/sshd.local.disabled
sudo fail2ban-client -t
sudo systemctl restart fail2ban.service
sudo fail2ban-client status

다른 설정 파일에서 SSH jail을 활성화하지 않았다면 Jail list에서 sshd가 사라집니다.

모든 차단 해제 후 서비스 중지

sudo fail2ban-client unban --all
sudo systemctl disable --now fail2ban.service

Fail2ban 패키지 완전 제거

sudo apt purge -y fail2ban
sudo apt autoremove -y

관련 지구 IDC 기술자료

공식 참고자료

작성에 참고한 공식 문서
기관 문서 확인 내용 조회일
Fail2ban Project Fail2ban 공식 저장소 인증 실패 로그 감시와 방화벽 기반 IP 차단 동작
Ubuntu Manpages jail.conf(5) ignoreip, bantime, findtime, maxretry, backend와 jail 설정 방식
Ubuntu Manpages fail2ban-client(1) 설정 검사, 상태 조회, reload, 차단 IP 확인과 해제 명령
Ubuntu Packages fail2ban 패키지 정보 Ubuntu 22.04 Jammy의 Fail2ban 패키지 제공 여부와 패키지 설명
Canonical Ubuntu release cycle Ubuntu 22.04 LTS의 표준 보안 유지보수 기간

자주 묻는 질문

Fail2ban을 설치하면 SSH 공격이 완전히 차단되나요?

아닙니다. 동일 IP의 반복 실패를 지연시키는 방어 수단이지만 분산된 여러 IP를 사용하는 공격이나 탈취된 정상 인증 정보까지 막지는 못합니다. 공개키 인증, 강한 계정 정책, 접근 원본 제한과 보안 업데이트를 함께 적용해야 합니다.

UFW를 사용 중이어도 Fail2ban을 설치할 수 있나요?

가능합니다. UFW는 기본 방화벽 정책을 관리하고 Fail2ban은 인증 실패에 따라 동적 차단 규칙을 추가할 수 있습니다. 적용 후에는 fail2ban-client status sshd와 실제 방화벽 규칙을 함께 확인하십시오.

관리 IP가 유동 IP이면 ignoreip를 어떻게 설정해야 하나요?

매번 바뀌는 IP를 넓은 CIDR로 예외 처리하면 공격자까지 차단 대상에서 제외될 수 있습니다. VPN의 고정 출구 IP, 점프 호스트 또는 서버 콘솔을 준비하고, 필요한 경우 차단 임계값을 운영 환경에 맞게 조정하는 방법이 더 안전합니다.

SSH 공개키 인증만 사용해도 Fail2ban이 필요한가요?

비밀번호 인증을 완전히 비활성화하면 비밀번호 추측 공격의 실질적인 성공 가능성은 크게 낮아집니다. 그래도 불필요한 반복 접속과 로그 증가를 줄이거나 잘못된 공개키 시도를 제한하려는 경우 Fail2ban을 보조 수단으로 사용할 수 있습니다.

차단 시간을 영구로 설정해도 되나요?

영구 차단은 재할당된 공인 IP의 정상 사용자까지 장기간 차단하거나 차단 목록을 계속 늘릴 수 있습니다. 일반 서버에서는 적절한 유한 차단 시간을 사용하고, 반복 공격자는 방화벽 정책이나 접근 허용 목록으로 별도 관리하는 편이 안전합니다.

마무리

오늘은 Ubuntu 22.04에서 Fail2ban을 설치하고 SSH 인증 실패 로그를 기준으로 반복 공격 IP를 자동 차단하는 방법을 설명드렸습니다. 설정 후에는 fail2ban-client status sshd, Fail2ban 로그와 방화벽 규칙을 함께 확인해야 실제 차단 상태를 정확히 판단할 수 있습니다.

관리 IP 예외와 SSH 포트를 실제 환경에 맞게 설정하고, 오차단에 대비해 서버 콘솔 접근 수단을 유지하십시오. Fail2ban만으로 SSH 보안을 끝내지 말고 공개키 인증과 접근 원본 제한을 함께 적용하는 것이 좋습니다.

오늘 준비한 내용은 여기까지입니다. 다음에도 서버 운영에 도움이 되는 기술정보로 인사드리겠습니다.

  • 0 사용자에게 유용한 정보 제공
이 답변이 도움이 되었나요?
« Back