2017/07에 대한 글이 1 개 검색되었습니다.
2017/07/27 13:47
제가 관리하는 서버들 앞단에 방화벽이 없는 관계로 IPTABLES와 tcpwapper를 이용한 제어를 하고 있습니다.
다만, 중국과 같은 나라에서 엄청나게 brute-force 공격을 감행하는지라, 한국이외에 접속을 차단하고 싶었습니다.

저의 경우 한국만 들어오게 하고 나머지 나라에선 들어올 이유가 없으므로, geoiplookup을 이용하여 ssh 내에 시도할 때에 한국만 들어올 수 있도록 하였습니다.

1. GeoIP Database 설치

제일 먼저 진행 되어야 할 부분은 GeoIP Database를 설치하여야 합니다.

# yum install geoip


/usr/bin/geoiplookup 이 존재하는지 확인하여야 합니다.

# geoiplookup 8.8.8.8 
GeoIP Country Edition: US, United States
GeoIP City Edition, Rev 1: US, CA, California, Mountain View, 94035, 37.386002, -122.083801, 807, 650
GeoIP ASNum Edition: AS15169 Google Inc.


위와 같이 확인이 되었다면 정상적으로 GeoIP가 설치된 것입니다.

2. Script 작성

# vi /usr/local/bin/sshfilter.sh
#!/bin/bash
# 대문자로 공백으로 국가코드를 입력하면 해당국가만 허용됩니다. ex) KR FR CN
ALLOW_COUNTRIES="KR"
if [ $# -ne 1 ]; then
echo "Usage: `basename $0` <ip>" 1>&2
exit 0 # return true in case of config issue
fi
COUNTRY=`/usr/bin/geoiplookup $1 | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1`
[[ $COUNTRY = "IP Address not found" || $ALLOW_COUNTRIES =~ $COUNTRY ]] && RESPONSE="ALLOW" || RESPONSE="DENY"
if [ $RESPONSE = "ALLOW" ]
then
# 이상 없을 경우 바로 통과
exit 0
else
# 차단되었을 경우 기록 남김
logger "$RESPONSE sshd connection from $1 ($COUNTRY)"
exit 1
fi


이후 chmod 755 /usr/local/bin/sshfilter.sh 퍼미션을 수정하여 줍니다.

3. TCPWAPPER 설정

/etc/hosts.deny와 /etc/hosts.allow를 수정하여 세팅하여야 합니다.

# vi /etc/hosts.deny
# ssh 접근을 모든곳에서 차단합니다.
sshd: ALL

# vi /etc/hosts.allow
sshd: ALL: spawn /usr/local/bin/sshfilter.sh %a


위와 같이 설정하게 될 경우 ssh로 접속하는 모든 사람들에게 /usr/local/bin/sshfilter.sh <ip>가 수행됩니다.
실제 테스트는 아래와 같이 하며, 확인은 /var/log/messages 로그에서 확인 하실 수 있습니다.

# /usr/local/bin/sshfilter.sh 61.177.172.60
tail -f /var/log/messages 확인시 아래와 같은 항목 검출

DENY sshd connection from 61.177.172.60 (CN)


위와 같이 정상적으로 연결이 되었다면 sshfilter.sh 내에 허용한 국가에서만 접속을 할 수 있습니다.
따라서, 중국에서 들어오는 공격은 tcpwapper에 의하여 차단되는 원리입니다.


2017/07/27 13:47 2017/07/27 13:47