GeoIP와 Shell Script를 이용해서 ssh 접속 제한하기

돌아다니면서 구한 자료로 공부하는 공간입니다..

틀린부분이 있다면 말씀해주시면 수정하도록 하겠습니다.

※ 남을 비방하거나 욕 / 정치적인 글은 삭제 대상이 됩니다. ※

GeoIP와 Shell Script를 이용해서 ssh 접속 제한하기

만키로군 0 2135 0

a.jpg

 

 

 

GeoIP를 이용하면 외국에서 접속하는 아이피에 대해서 SSH 접속제한을 할수가 있다. 특히 요즘은 중국발 SSH에 대한 무작위 공격은 도가 지나치다 싶을 정도로 많기 때문에 이 작업은 반드시 해줘야 하는 작업이라고 생각된다. ssh뿐만 아니라 http 프로토콜 접속 등의 허용 및 제한이 가능해진다. GeoIP를 이용해서 SSH에 대한 접속 제한을 찾다보니 거의 대부분iptable을 이용하여 제한하거나 PAM을 이용해서 막기의 방법을 쓰는데, 이 두가지 모두 초보자들이 설정하기엔 조금 어려워 보였다. 특히 iptable을 이용할때 룰을 잘못 이해해서 적용하거나 셋팅하면 오히려 본인이 접속을 못하는 경우가 생길수도 있고해서 자료를 찾다가 Shell Script를 이용하는 방법을 찾아냈고, 적용해보니 꽤 훌륭하다. 초보분들에게는 구현원리나 작동원리의 이해가 쉬운 이 방법을 권고해드리고 싶다.

원문사이트 : http://www.axllent.org/docs/view/ssh-geoip/

1. GEOIP DATABASE 설치

geoiplookup 명령어와 GeoIP country (free) database를 설치합니다.

 

1

2

3

 

$ sudo apt-get install geoip-bin geoip-database

 

 

잘 설치 되었는지 다음과 같이 테스트를 해본다.

 

1

2

3

4

 

$ geoiplookup 8.8.8.8

GeoIP Country Edition: US, United States

 

 

위와같이 US, United States 가 출력된다면 제대로 설치된 것이다.

2. SHELL SCRIPT 작성

이 Shell Script는 접속자의 ip 주소를 GeoIP database와 비교하여 접속지역이 KR인지 유무에 따라 ALLOW와 DENY를 리턴해준다. 또한 이러한 메세지를 logger를 이용해서 log파일(/var/log/syslog)에 기록이 되도록 한다. 이 파일은 /usr/local/bin/sshfilter.sh로 만들면 된다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 

#!/bin/bash

 

# UPPERCASE space-separated country codes to ACCEPT

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

 

 

Script의 실행권한도 잊지말고 지정해주자.

 

1

2

3

4

 

$ sudo chown root.root /usr/local/bin/sshfilter.sh

$ sudo chmod 775 /usr/local/bin/sshfilter.sh

 

 

3. SSH 잠금설정

/etc/hosts.deny 파일에 다음과 같은 라인을 추가합니다.

 

1

2

3

 

sshd: ALL

 

 

그리고 /etc/hosts.allow 파일에도 다음과 같은 라인을 추가합니다.

 

1

2

3

 

sshd: ALL: aclexec /usr/local/bin/sshfilter.sh %a

 

 

4. 제대로 작동하는지 TEST 하기

위에서 테스트 했던 US ip를 가지고 테스트 해보도록 한다.

1

2

3

 

/usr/local/bin/sshfilter.sh 8.8.8.8

 

 

KR(한국) 아이피만 접속을 허용하도록 했으므로 DENY 메세지가 나와야 정상이다.
다음 메세지는 /var/log/syslog 에서 볼 수 있다.

 

1

2

3

 

Jun 26 17:02:37 pi root: DENY sshd connection from 8.8.8.8 (US)

 

 

대부분 중국발 아이피에서 접속을 시도하고 있다는 것을 알 수 있다. 가끔 영국아이피도 많이 보이긴 한다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

3940 Apr 13 22:14:12 akalkid logger: DENY sshd connection from 43.255.190.177 (HK)

3941 Apr 13 22:14:34 akalkid logger: DENY sshd connection from 119.147.137.94 (CN)

3943 Apr 13 22:26:22 akalkid logger: DENY sshd connection from 222.186.56.138 (CN)

3944 Apr 13 22:32:40 akalkid logger: DENY sshd connection from 43.255.190.117 (HK)

3945 Apr 13 22:32:46 akalkid logger: DENY sshd connection from 43.255.190.187 (HK)

3946 Apr 13 22:33:57 akalkid logger: DENY sshd connection from 43.255.190.152 (HK)

3948 Apr 13 22:49:20 akalkid logger: DENY sshd connection from 43.255.190.131 (HK)

3949 Apr 13 22:49:23 akalkid logger: DENY sshd connection from 43.255.190.135 (HK)

3950 Apr 13 22:51:51 akalkid logger: DENY sshd connection from 117.40.239.54 (CN)

3951 Apr 13 22:54:54 akalkid logger: DENY sshd connection from 58.218.204.226 (CN)

3952 Apr 13 23:07:28 akalkid logger: DENY sshd connection from 43.255.190.175 (HK)

3953 Apr 13 23:07:49 akalkid logger: DENY sshd connection from 43.255.190.130 (HK)

3956 Apr 13 23:21:55 akalkid logger: DENY sshd connection from 222.186.21.209 (CN)

3957 Apr 13 23:25:51 akalkid logger: DENY sshd connection from 43.255.190.139 (HK)

3958 Apr 13 23:26:09 akalkid logger: DENY sshd connection from 222.77.190.33 (CN)

 

 

5. GEOIP의 주기적 UPDATE

/etc/cron.monthly/updatingGeoIP 라는 파일을 만들어서 다음과 같은 내용을 작성해준다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

 

#!/bin/bash

 

cd /tmp

wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

if [ -f GeoIP.dat.gz ]

then

    gzip -d GeoIP.dat.gz

    rm -f /usr/share/GeoIP/GeoIP.dat

    mv -f GeoIP.dat /usr/share/GeoIP/GeoIP.dat

else

    echo "The GeoIP library could not be downloaded and updated"

fi

 

 

저는 이외에도 Fail2ban 이라는 패키지도 설치해서 3회이상 접속시도를 할때에는 일정시간 이상 접속을 아예 허용치 않고 Ban을 시키고 있습니다. ssh의 기본 포트번호를 바꾼다거나 하는 방법도 괜찮은 방법이라고 생각됩니다. 보안은 아무리 강조해도 지나치지 않기 때문에 서버를 운영하시는 분이라면 특히, 중국발 SSH에 대한 무차별 공격에 대해 어느정도 대비를 해놓는 것이 좋다는 생각입니다. 일단 다음 서버를 구매하고 셋팅할때는 저도 SSH의 기본포트를 바꿔서 시작할 예정입니다 

, , , ,

0 Comments
제목