[Ubuntu] GeoIP와 Fail2Ban을 이용해 해외 IP 차단으로 SSH 보안 강화하기 🌍🔒
![[Ubuntu] GeoIP와 Fail2Ban을 이용해 해외 IP 차단으로 SSH 보안 강화하기 🌍🔒](/content/images/size/w1920/2024/12/ubuntu_thumb.png)
1. GeoIP와 Fail2Ban을 사용하는 이유
서버를 안전하게 운영하기 위해 SSH 보안은 필수이다. 특히 해외 IP를 통한 무차별 대입 공격을 방지하기 위해 GeoIP와 Fail2Ban을 활용하면 효과적이다.
- GeoIP: IP 주소를 기반으로 국가를 식별하여 특정 국가의 IP를 차단.
- Fail2Ban: 비정상적인 로그인 시도를 감지하고 해당 IP를 자동으로 차단.
이 두 가지를 결합하면 SSH 보안을 한층 더 강화할 수 있다.
2. GeoIP 설치 및 설정 🌐
1) GeoIP 데이터베이스 설치
GeoIP는 MaxMind에서 제공하는 GeoLite2 데이터베이스를 사용한다. GeoIP 패키지와 데이터베이스를 설치한다.
sudo apt update
sudo apt install -y geoip-bin geoip-database
2) GeoIP 데이터 확인
GeoIP를 사용하여 특정 IP가 어느 국가에서 오는지 확인한다.
geoiplookup 8.8.8.8
출력 예시:
GeoIP Country Edition: US, United State
3. Fail2Ban 설치 및 설정 🛡️
1) Fail2Ban 설치
Fail2Ban을 설치하여 SSH 보안을 강화한다.
sudo apt install -y fail2ban
2) SSH 보호 기본 설정
Fail2Ban의 기본 설정 파일을 편집한다.
sudo vim /etc/fail2ban/jail.local
다음 내용을 추가한다:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = -1
findtime = 60
action = iptables[name=SSH, port=ssh, protocol=tcp]
geoipfilter[allowed_countries=KR]
enabled = true
: 해당 Jail을 활성화.port = ssh
: SSH 서비스 포트(기본 22번, SSH포트는 변경하는게 국룰).maxretry
: 실패 시도 허용 횟수( 5회).bantime
: -1(영구차단).findtime
: 시도하는 동안 시간(초).allowed_countries=KR
: 한국 IP만 허용.
4. GeoIP와 Fail2Ban 통합 🌍➕🛡️
1) GeoIP 차단 스크립트 작성
Fail2Ban에서 특정 국가의 IP를 차단하는 GeoIP 필터를 추가해야 한다.
sudo vi /etc/fail2ban/action.d/geoip-ban.conf
다음 내용을 추가한다:
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = bash -c 'if ! geoiplookup <ip> | grep -q "KR"; then iptables -I fail2ban-<name> 1 -s <ip> -j DROP; fi'
actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP
[Init]
allowed_countries = KR
actionban
: 접속 시도 IP가 한국(KR)이 아닌 경우iptables
를 사용해 해당 IP를 차단한다.geoiplookup
: 접속 시도 IP의 GeoIP 데이터를 확인한다.grep -q "KR"
: 한국(KR) 국가 코드와 일치하지 않으면 차단 규칙을 추가한다.
5. Fail2Ban 및 SSH 서비스 재시작 🔄
1) Fail2Ban 재시작
Fail2Ban을 재시작하여 설정을 적용한다.
sudo systemctl restart fail2ban
2) Fail2Ban 상태 확인
Fail2Ban이 제대로 작동하고 있는지 확인한다.
sudo fail2ban-client status
출력 예시:
Status
|- Number of jail: 1
`- Jail list: sshd
7. 테스트 및 유지보수 🔍
1) 로그 확인
Fail2Ban의 로그를 확인하여 GeoIP 차단이 작동하고 있는지 확인한다.
sudo tail -f /var/log/fail2ban.log
2) 차단된 IP 해제
특정 IP를 수동으로 해제하려면 다음 명령을 실행한다.
sudo fail2ban-client unban <IP>
3) GeoIP 자동 업데이트
GeoIP는 주기적으로 업데이트해야 할 필요가 있다.
sudo vi /etc/cron.monthly/geoIpUpdate
다음의 자동화 스크립트를 구현한다.
#!/bin/bash
# 변수 정의
TMP_DIR="/tmp/geoip_update"
GEOIP_URL="http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz"
GEOIP_FILE="GeoIP.dat.gz"
TARGET_DIR="/usr/share/GeoIP"
TARGET_FILE="${TARGET_DIR}/GeoIP.dat"
# 임시 디렉토리 생성
mkdir -p $TMP_DIR
cd $TMP_DIR
# GeoIP 데이터 다운로드
if wget -q -O $GEOIP_FILE $GEOIP_URL; then
echo "$(date): GeoIP database downloaded successfully."
# 압축 해제
if gzip -d $GEOIP_FILE; then
echo "$(date): GeoIP database decompressed."
# 기존 파일 백업 및 새 파일 이동
[ -f $TARGET_FILE ] && mv -f $TARGET_FILE ${TARGET_FILE}.bak
mv -f GeoIP.dat $TARGET_FILE
echo "$(date): GeoIP database updated successfully."
else
echo "$(date): Failed to decompress GeoIP database."
fi
else
echo "$(date): Failed to download GeoIP database."
fi
# 임시 디렉토리 정리
rm -rf $TMP_DIR
이후, 실행 권한을 부여한다.
sudo chmod +x /etc/cron.monthly/geoIpUpdate
작동 방식
- 임시 디렉토리 사용:
/tmp/geoip_update
에서 작업을 진행해 시스템을 깨끗하게 유지.- 작업 후 디렉토리를 삭제하여 불필요한 파일을 남기지 않음.
- 로그 출력:
- 각 단계에서 성공 여부를 확인하며, 실패 시 메시지를 출력.
- 안전한 파일 교체:
- 새 데이터를 성공적으로 다운로드하고 압축 해제한 후에만 기존 데이터를 교체.
- 기존 데이터를
.bak
로 백업해 문제가 발생했을 때 복구 가능.
실행 테스트
수동으로 스크립트를 실행하여 동작을 확인한다:
sudo /etc/cron.monthly/geoIpUpdate
결과 로그 확인
업데이트 결과를 확인하려면 아래 명령을 실행한다:
cat /usr/share/GeoUP/GeoUP.dat
ls -lh /usr/share/GeoUP/
7. 결론 🏁
GeoIP와 Fail2Ban을 활용하면 SSH 보안을 획기적으로 강화할 수 있다. 특정 국가의 IP 차단과 자동화된 비정상 접속 차단으로 관리 편의성과 보안성을 모두 확보할 수 있다.
댓글