2013년 12월 2일 월요일

[Linux] Portsentry를 통한 포트스캔 방어하기

포트 스캔을 체크툴인 Portsentry 1.1를 설정하는 방법과 실제 테스트후 블러킹 하는 방법을 기술한 글.

portsentry 란?
portsentry는 실시간으로 이런 portscan을 탐지하고 대응하기 위해 만들어진 프로그램이며, Abacus Project의 일환으로 PSIONIC사에서 개발 배포하는 도구중 하나이다. portsentry는 정상적인 스캔과 비밀스캔 모두를 탐지한다. portsentry는 portscan을 탐지하기 위해 많은 옵션들을 가지고 있는데 아래의 방법들로 portscan에 반응한다. (자세한 내용은 README.install을 참고하세요.)

portsentry 다운받기
여기 자료실에서 최신버전을 찾아 다운을 받는다.

예전의 1.1 버전과 최신 2.0베타 버전이 잇는데.. 여기서는 1.1 버전을 설치한다..

portsentry 설치하기
[root@chtla kan]# tar xvfz portsentry-1.1.tar.gz

[root@chtla portsentry-1.1]# make linux

SYSTYPE=linux
Making
cc -O -Wall -DLINUX -DSUPPORT_STEALTH -o ./portsentry ./portsentry.c
./portsentry_io.c ./portsentry_util.c

[root@chtla portsentry-1.1]# make install
디폴트 디렉토리는 /usr/local/psionic/portsentry/portsentry 이다..

[root@chtla portsentry-1.1]# cd /usr/local/psionic/portsentry/

[root@chtla portsentry]# vi portsentry.conf
수정할 내용은 portsentry가 점검할 대상 포트(port)에 대한 것으로서 필요한 점검포트들을 모두설정하거나 점검하지 않을 포트들을 빼버리면 된다. 크게 대상 포트는 TCP 포트와 UDP포트로 나위어져 있으며, 특히 Stealth 스캔에 대한 옵션에 대한 설정도 할수 있음을 유심히 보기 바란다.

[root@chtla portsentry]# vi portsentry.ignore
12.34.56.78 <== portsentry 에서 block 되지 않을 아이피를 적어준다..(즉 자신의 서버 아이피등..안전하다고 생각되는 아이피)

[root@chtla portsentry]# vi /etc/rc.d/rc.local <== 부팅시 실행을 위해 추가..

# Port Sentry Setting
/usr/local/psionic/portsentry/portsentry -tcp
/usr/local/psionic/portsentry/portsentry -udp
/usr/local/psionic/portsentry/portsentry -stcp
/usr/local/psionic/portsentry/portsentry -sudp
/usr/local/psionic/portsentry/portsentry -atcp
/usr/local/psionic/portsentry/portsentry -audp

옵션들 설명

-tcp - Basic port-bound TCP mode (기본 포트 제한 TCP 모드)
PortSentry는 설정파일들을 확인하고 나서, 백그라운드에 있는 모든 TCP포트들을 묶을 것이다. 만약 여러분이 init 상태를 점검하길 원한다면, 단지 여러분은 메시지가 저장되어지는 local syslog 파일을 살펴보면 된다.
-udp - Basic port-bound UDP mode (기본 포트 제한 UDP 모드)
PortSentry는 설정파일들을 확인하고 나서, 백그라운드에 있는 모든 UDP포트들을 묶을 것이다. 만약 여러분이 init 상태를 점검하길 원한다면, 단지 여러분은 메시지가 저장되어지는 local syslog 파일을 살펴보면 된다. UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.)

-stcp - Stealth TCP scan detection mode (스텔스 TCP 스캔 탐지 모드)
PortSentry는 호스트로 들어오는 모든 패킷들을 감시하기 위해서 raw 소켓을 사용할 것이다. 만약 호스트로 들어오는 패킷이 감시되고 있는 포트로 향한다면, PortSentry는 호스트를 방어하기 위해 작동할 것이다. 이 방법은 connect() 스캔과 SYN/half-open 스캔과 FIN 스캔을 탐지할 것이다.
UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.)

-sudp - "Stealth" UDP scan detection mode (스텔스 UDP 스캔 탐지 모드)
이것은 위의 TCP stealth mode와 작동방법은 동일하다. UDP 포트들을 나열하면, 그 포트들은 감시된다. 이것은 어떠한 소켓도 묶지 않으며, 실제 스텔스 스캔 탐지 모드가 아닌 중에도 거의 동일하게 동작한다.( 모든 UDP 패킷에 반응한다.)
UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.)

-atcp - Advanced TCP stealth scan detection mode (advanced TCP 스텔스 스캔 탐지 모드)
PortSentry는 ADVANCED_PORTS_TCP 옵션에 지정된 최상의 포트번호이하의 모든 열려진 포트에 대한 목록을 만들면서 시작하고, 이러한 포트들을 기초로 제외(exclusion)목록을 만들 것이다. 제외되지 않은( 예를 들어, [SMTP, HTTP, 등의] 열려진[listening] network daemon이 아닌, ) 영역내의 임의의 포트에 연결된 호스트들은 접속이 금지된다. 이것은 여러분이 반드시 알고 있어야 할 몇몇 아주 강력한 함축적 의미들을 가지고 있다.

-audp - Advanced UDP stealth scan detection mode (advanced UDP 스탤스 스캔 탐지 모드)
UDP 프로토콜을 사용한다는 점을 제외하고는 위와 같다. Advanced UDP stealth scan detection은 지원되지 않는 트래픽을 즉시 알 수 있기 때문에 강력하지만 부정확한 경보의 가능성이 높다.

실행하기
[root@chtla portsentry]# /usr/local/psionic/portsentry/portsentry -tcp
[root@chtla portsentry]# /usr/local/psionic/portsentry/portsentry -udp
[root@chtla portsentry]# /usr/local/psionic/portsentry/portsentry -stcp
[root@chtla portsentry]# /usr/local/psionic/portsentry/portsentry -sudp
[root@chtla portsentry]# /usr/local/psionic/portsentry/portsentry -atcp
[root@chtla portsentry]# /usr/local/psionic/portsentry/portsentry -audp

[root@chtla portsentry]# ps -ax|grep portsentry
1084 ? S 0:00 /usr/local/psionic/portsentry/portsentry -tcp
1086 ? S 0:00 /usr/local/psionic/portsentry/portsentry -udp
1092 ? S 0:01 /usr/local/psionic/portsentry/portsentry -atcp
1094 ? S 0:00 /usr/local/psionic/portsentry/portsentry -audp

이처럼 실행을 되어 있는 것은 확인할수 있다..
그런데-stcp와 -sudp가 실행이 되지 않을것이다.. 서버 두대에서 같은 방법으로 돌려 보았는데, 실행이 되지 않고 있다.. 별문제라 문제되지 않아 아직까지 크게 신경을 쓰고 있지는 않아, (혹 아시는 분은 제게 좀 알려주세요..^^) 그냥 방치에 두고 있었다..
글을 쓰고면서 다시 기억이 났으니 우선을 그냥 넘어가기로 한다.. 큰 문제는 아니다.

침입 ip blocking 시키기..
우선 portsentry 는 디폴트로 tcp-wrapper 와 연동이 되어 정상적인 포트가 아닌 다른 포트로 스캔을 할지 자동으로 /etc/hosts.deny 에 기록을 하게 된다.

그냥 사용을 해도 좋으나 iptables 가 설치 되어 있다면 이것과 연동을 하는 것이 더 낮을것이다.
iptables와 연동을 하려면

[root@chtla portsentry]# vi portsentry.conf

#KILL_HOSTS_DENY="ALL: $TARGET$" <=== 이것을 주석처리 하구

# iptables support for Linux <=== 끝부분에 있을것임
KILL_ROUTE="/sbin/iptables -A INPUT -s $TARGET$ -j DROP" <=== 이것을 주석 처리를 풀어준다.

iptables 의 기본 옵션으로 -I 로 되어 있을것이다.. 그대로 사용해도 사용이 없으나, iptables를 사용할 사용이라면 -A 를 쓰도록 하자.
(-I 는 최상위로 올라가기에, 즉 최상우선적으로 적용을 시키는 옵션으로 개인적으로 iptables에 허가 ip를 등록시켜둔 상태라서 저는 이렇게 사용합니다..
-A 를 쓰면 -I 으로 적용한것보다 밑에 있게 되어 보기가 편하거든요..)

침입 테스트하기
다른 컴퓨터나 해당 서버에 텔넷(보통 기본적으로 막혀 있음)이나 다른 포트에 접속을 해 보자..

(다른 컴터에서)
# telnet 12.34.56.78 23

접속하면 별일없이 프럼프트 상에서 한참을 기다리고 있을것이다.(linux상에서).. 종료후 해당 서버의 /etc/hosts.deny (iptables 설정을 안했을 경우) 를 열어 보거나, iptables로 설정한 경우

# iptables -L
target prot opt source destination
DROP all -- 61.xx.xx.196 anywhere <== 허가 거부된 ip

이와 같이 거부된 것을 볼수 있을것이다..

참조할만한 사이트

http://www.certcc.or.kr/tools/Psionic_Portsentry.html
http://list.kldp.org/pipermail/tip/2001Sep/0292.html

두 사이트 다 portsentry에 관한 설치 및 설정등에 관한 나와 있습니다..(옵션 설명은 이곳에서 카피해 왔습니당..) 제것에서 부족함을 느끼신다면 참조해 보시기 바랍니다.

마치며...
포트 샌트리는 워낙에 유명한 툴이라서 모르시는 분들이 없을것 같아서 할까말까 망설이다 적어 봅니다.
혹 설치가 안되신 분들이라면 꼭 설치를 해 보시기 바랍니다..
찝쩍되는 놈(?)들이 많다는 것을 알게 될것입니다..

[출처 : 초심으로]

댓글 없음:

댓글 쓰기