개요
오늘은 Ubuntu 서버에서 Fail2Ban을 사용하여 외부의 악의적인 트래픽으로부터 서버를 안전하게 지키는 방법에 대해 기록해보려고 한다.
서버를 운영하다 보면 무차별 대입 공격으로부터 서버를 보호하는 것이 얼마나 중요한지 느껴질거다.
이번 포스팅에서는 Fail2ban
에 대해서 간단하게 짚고 넘어가고,
아래와 같은 시나리오를 기준으로 실습을 진행할 에정이다.
- 웹 서버를 운영 중이라고 가정함.
- 운영 중인 서버에 fail2ban을 도입하여 30분 이내에 SSH 로그인 5번 실패 발생 시 해당 IP를 24시간 동안 차단하도록 함.
1. Fail2Ban 이란?
Fail2Ban은 서버에 대한 무차별 대입 공격을 방지하기 위한 보안 도구이다.
로그 파일을 모니터링하여 지정된 횟수 이상으로 실패한 로그인 시도가 발생하면 해당 IP 주소를 일정 시간 동안 차단한다.
이를 통해 SSH, FTP, HTTP 등의 다양한 서비스의 보안을 강화할 수 있다.
2. Fail2Ban 설치
Fail2Ban을 설치하자.
sudo apt-get update -y
sudo apt-get install -y fail2ban
설치가 완료되면 /etc/fail2ban
디렉토리에 설정 파일들이 생성된다.
3. Fail2Ban 상태 확인
설치 후 Fail2Ban 서비스가 정상 실행 중인지 확인
sudo systemctl status fail2ban
만약 실행 중이 아니라면 서비스를 시작하고, 부팅 시 자동으로 시작되도록 설정하자.
sudo systemctl enable --now fail2ban
4. 설정 파일 구성 이해하기
fail2ban의 주요 설정 파일은 다음과 같다.
파일명 | 설명 |
---|---|
/etc/fail2ban/fail2ban.conf |
fail2ban의 전역 설정 파일입니다. 직접 수정하는 것보다 .local 파일을 만들어 오버라이드하는 것이 좋습니다. |
/etc/fail2ban/jail.conf |
기본 차단 규칙(Jail)들이 정의된 파일입니다. 이 파일도 직접 수정하지 않습니다. |
/etc/fail2ban/filter.d/ |
로그에서 실패 패턴을 감지하는 필터들이 저장된 디렉토리입니다. SSH의 경우 sshd.conf 필터가 사용됩니다. |
/etc/fail2ban/action.d/ |
차단 시 실행할 액션들이 정의된 디렉토리입니다. |
fail2ban 설정을 업데이트할 때는 덮어쓰기를 방지하기 위해 jail.conf
파일을 jail.local
파일로 복사하여 수정해주자.
jail.local
파일의 설정이 jail.conf
파일의 설정을 덮어쓴다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
마찬가지로, fail2ban.conf
의 설정을 변경하고 싶다면 fail2ban.local
파일을 만들어 사용하자.
(이번 시나리오에서는 주로 jail.local
을 수정함.)
기본 설정 파일을 직접 수정하는 대신 로컬 설정 파일을 생성하여 수정하는 것이 좋다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
4-1. jail.local
파일 수정 (차단 규칙 정의)
이제 jail.local
파일을 열어 SSH 관련 설정을 수정하자.
sudo nano /etc/fail2ban/jail.local
파일 내에서 [sshd]
또는 [ssh]
섹션을 찾자. (배포판이나 fail2ban 버전에 따라 섹션 이름이 다를 수 있음.)
해당 섹션을 아래와 같이 수정하거나, 없다면 추가해주자. 주석(#
) 처리된 부분을 참고하여 값을 변경하고,
enabled = true
로 설정하여 SSH 감옥을 활성화시키자.
[sshd]
# 이 감옥을 활성화하려면 true로 설정합니다.
enabled = true
# 필터 파일 경로 (기본값으로 두어도 무방합니다)
filter = sshd
# 액션 (기본적으로 iptables를 사용한 차단입니다)
# multiport는 여러 포트를 한 번에 차단합니다.
# action = %(action_)s 그냥 두거나, 좀 더 명시적으로 하려면 아래와 같이 할 수 있습니다.
# action = %(action_mw)s # 차단 및 whois 정보와 함께 메일 알림
# action = %(action_mwl)s # 차단 및 whois 정보와 로그와 함께 메일 알림
# 기본 차단 액션:
action = %(action_Default)s
# 로그 파일 경로 (시스템에 따라 다를 수 있습니다)
# Debian/Ubuntu: /var/log/auth.log
# RHEL/CentOS/Rocky/Alma: /var/log/secure
# journalctl을 사용하는 시스템의 경우: backend = systemd
# logpath = /var/log/auth.log # Debian/Ubuntu의 예시
# logpath = /var/log/secure # RHEL 계열의 예시
# 대부분의 최신 시스템에서는 backend 설정을 통해 자동으로 감지합니다.
# backend = auto 로 두거나, 명시적으로 backend = systemd (systemd 저널 사용 시)
# 여기에 핵심 설정을 합니다:
# maxretry: 최대 실패 횟수
maxretry = 5
# findtime: 이 시간(초 단위) 내에 maxretry 횟수만큼 실패하면 차단
# 30분 = 30 * 60 = 1800초
findtime = 1800
# bantime: 차단 시간(초 단위)
# 24시간 = 24 * 60 * 60 = 86400초
bantime = 86400
# port: 감시할 포트 (기본 SSH 포트는 22)
# 여러 포트를 사용한다면 콤마로 구분: port = ssh,2222
port = ssh
# 무시할 IP 주소 (예: 자신의 고정 IP)
#ignoreip = 127.0.0.1/8 ::1 192.168.1.100
주요 설정 값 설명
enabled = true
: sshd 감옥을 활성화합니다.filter = sshd
:/etc/fail2ban/filter.d/sshd.conf
필터를 사용합니다. 이 필터는 SSH 로그인 실패 패턴을 정의합니다.action = %(action_Default)s
: 기본 차단 액션을 사용합니다. 일반적으로 iptables 또는 firewalld를 사용하여 IP를 차단합니다.logpath
: SSH 로그인 시도 로그 파일의 경로입니다.- Debian/Ubuntu 계열:
/var/log/auth.log
- RHEL/CentOS/Rocky/AlmaLinux 계열:
/var/log/secure
- 최신 시스템에서는
backend = systemd
설정을 사용하면 journalctl을 통해 로그를 자동으로 읽어오므로 logpath를 명시하지 않아도 될 수 있습니다.jail.conf
파일 상단에backend = auto
또는backend = systemd
관련 주석이나 설정이 있는지 확인해보세요. 만약 backend 설정이 있다면 logpath는 주석 처리해도 됩니다.
- Debian/Ubuntu 계열:
maxretry = 5
: 5번의 로그인 실패를 허용합니다.findtime = 1800
: 30분 (1800초) 이내에 maxretry 횟수만큼 실패하면 차단합니다.bantime = 86400
: 24시간 (86400초) 동안 IP를 차단합니다.port = ssh
: SSH 서비스 포트(기본값 22)를 감시합니다. SSH 포트를 변경하여 사용 중이라면 해당 포트 번호로 수정해야 합니다 (예: port = 2222).
logpath 와 backend 에 대한 추가 설명
jail.conf
파일 상단에 backend 라는 설정이 있을 수 있습니다.backend = auto
: fail2ban이 로그 소스를 자동으로 감지하려고 시도합니다.backend = systemd
: systemd 저널에서 로그를 읽어옵니다. 이 경우 logpath는 필요 없습니다.backend = file
: 특정 로그 파일을 직접 지정할 때 사용하며, 이 경우 logpath가 필요합니다.
- 만약 sshd 섹션에 backend 설정이 없다면, 전역 backend 설정을 따르거나 기본값(auto 또는 file)으로 동작합니다.
- 로그 파일 경로가 확실하지 않거나 systemd 저널을 사용한다면, sshd 섹션에 backend = systemd 를 명시적으로 추가하고 logpath를 주석 처리하거나 삭제하는 것이 좋습니다.
예시(systemd
저널 사용 시)
[sshd]
enabled = true
filter = sshd
action = %(action_Default)s
backend = systemd # 이 부분을 추가하거나 확인
maxretry = 5
findtime = 1800
bantime = 86400
port = ssh
# logpath = /var/log/auth.log # backend = systemd 사용 시 주석 처리 또는 삭제
수정이 완료되면 파일을 저장하고 닫아주자.
5. fail2ban 서비스 재시작 및 상태 확인
변경된 설정을 적용하기 위해 fail2ban
서비스 재시작
sudo systemctl restart fail2ban
서비스 정상 실행 중인지 확인
sudo systemctl status fail2ban
로그를 통해 오류가 없는지도 확인해보자.
sudo journalctl -u fail2ban -f
5. 테스트하기
다른 IP 주소를 가진 컴퓨터나 가상 머신에서 일부러 SSH 로그인을 여러 번 실패시켜 보자.
- 5번 실패하면 해당 IP가 차단되어야 한다.
- 차단된 후에는 SSH 접속이 불가능해야 한다.
주의: 테스트 시 실제 사용하는 IP가 차단되지 않도록 주의하고, 테스트용 IP를 사용하자.
만약 실수로 자신의 IP가 차단되었다면 아래 "차단된 IP 확인 및 해제 방법"을 참고하여 해제할 수 있다.
6. 차단된 IP 확인 및 해제 방법
차단된 IP 확인
fail2ban-client
명령어를 사용하여 특정 감옥(jail)의 상태를 확인할 수 있다.
sudo fail2ban-client status sshd
위 명령을 실행하면 sshd 감옥에 의해 현재 차단된 IP 목록을 볼 수 있다.
차단된 IP 해제
특정 IP 주소를 차단 해제하려면 다음 명령어를 사용한다.
sudo fail2ban-client set sshd unbanip IP_ADDRESS
IP_ADDRESS
부분에 해제하려는 실제 IP 주소를 입력해주자.
(예: sudo fail2ban-client set sshd unbanip 192.168.0.123
)
7. 추가 팁
7-1. ignoreip 설정
jail.local
파일의 [DEFAULT]
섹션이나 각 감옥 섹션에 ignoreip
를 설정하여 특정 IP 주소나 대역이 fail2ban
에 의해 차단되지 않도록 설정할 수 있다.
자신의 고정 IP, 내부 네트워크 IP 등을 추가하면 유용할거다.
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 your.home.fixed.ip.address