[Ubuntu] GeoIP와 Fail2Ban을 이용해 해외 IP 차단으로 SSH 보안 강화하기 🌍🔒

[Ubuntu] GeoIP와 Fail2Ban을 이용해 해외 IP 차단으로 SSH 보안 강화하기 🌍🔒

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

작동 방식

  1. 임시 디렉토리 사용:
    • /tmp/geoip_update에서 작업을 진행해 시스템을 깨끗하게 유지.
    • 작업 후 디렉토리를 삭제하여 불필요한 파일을 남기지 않음.
  2. 로그 출력:
    • 각 단계에서 성공 여부를 확인하며, 실패 시 메시지를 출력.
  3. 안전한 파일 교체:
    • 새 데이터를 성공적으로 다운로드하고 압축 해제한 후에만 기존 데이터를 교체.
    • 기존 데이터를 .bak로 백업해 문제가 발생했을 때 복구 가능.

실행 테스트

수동으로 스크립트를 실행하여 동작을 확인한다:

sudo /etc/cron.monthly/geoIpUpdate

결과 로그 확인

업데이트 결과를 확인하려면 아래 명령을 실행한다:

cat /usr/share/GeoUP/GeoUP.dat
ls -lh /usr/share/GeoUP/

7. 결론 🏁

GeoIP와 Fail2Ban을 활용하면 SSH 보안을 획기적으로 강화할 수 있다. 특정 국가의 IP 차단자동화된 비정상 접속 차단으로 관리 편의성과 보안성을 모두 확보할 수 있다.

댓글