11. 보안 도구

 

   지금까지 알아본 것은 서버 내부에서 제공하는 프로그램을 이용한 보안이었다.

   물론 내부의 프로그램만으로도 보안이 되지만 (설정이 정상적으로 되어있을 경우) 이에 더하여 외부

   보안 프로그램을 사용함으로써 보안을 더욱 강화시킬 수 있다.

   보안 도구에는 많은 프로그램이 있지만 여기서는 강력한 포트스캔 방지 프로그램 portsentry와 포트 검사 프로그램인 nmap, 포트검사 및 동작하고 있는 프로세서들을 살펴볼수 있는 lsof에 대해서 알아보도록 한다.


11.1 portsentry


  portsentry는 tcpwrapper와 연계하여 포트스캔이 감지되면 포트스캔을 실시한 IP를 hosts.deny에

  등록하여 서버에 접속하지 못하도록 실시간으로 방어하는 프로그램이다.  

  portsentry는 실시간 방어를 구현하는 아주 우수한 스캐너이지만, 보통 해킹을 하고자 대상 서버의 열린포트를 스캔하는 해커들은 자신의 IP가 아닌 spoofing 된 거짓 아이피를 사용하기 때문에 로그에 기록된 거부된 IP들을 해킹을 하려는 서버로 의심하여 역공격을 하게 되면 선의의 피해자가 생길수도 있다는 것을 명심해야 한다.


  < 설치 방법 및 사용방법 >

  - 설치

  1. portsentry-1.1.tar.gz을 다운받는다.

  2. 서버의 적당한 위치에 업로드 ( /usr/local/src 정도에 파일 업로드 )

  3. tar -zxvf portsentry-1.1.tar.gz

  4. 압축이 해제되면 portsentry-1.1 이 생성된다.

  5. cd portsentry-1.1로 이동

  6. ./make linux

  7 ./make install 로서 설치를 끝마친다.


  - 사용방법

  설치가 완료되면, /usr/local/psionic/portsentry란 디렉토리가 생성된다.

  cd /usr/local/psionic/portsentry로 이동한다.


  이동한 뒤에 ls 명령으로 파일을 보게 되면

  portsentry → 실행파일

  portsentry.conf → 설정파일

  portsentry.ignore → 스캔을 해도 로그에 남지않는 IP를 적어줄 파일


  이 세 가지 파일이 존재할 것이다.

  portsentry.conf에는 portsentry의 각종 설정들을 편집할 수 있지만, default로 사용해도 무방하다.


  portsentry.ignore에는 로컬호스트는 반드시 들어가 있어야 하며, 기타 자신이 자주 사용하는 IP등을   지정해 놓아야 혹시 테스트로 스캔을 했을 경우 접속이 차단되지 않는다.

 

  ▶ 실행 : /usr/local/psionic/portsentry/ 디렉토리에 있다고 가정


  portsentry를 실행하는 모드에는 크게 3가지 모드가 있다.

  Class mode ( 백그라운드에 있는 모든 tcp, udp 포트들을 모니터링 한다. stealth scan은 탐지

   못함 )

    ./portsentry -tcp

    ./portsentry -udp


   Stealth mode ( 모든 tcp, udp를 모니터링 하는 것은 Classic과 같지만 stealth scan을 탐지한다.)

    ./portsentry -stcp

    ./portsentry -sudp


   Advanced mode ( portsentry.conf에서 옵션으로 지정된 포트들은 제외하고 나머지 포트들에 영에  내에서 임의대로 모니터링을 실시하며, 모든 실행 옵션 중에서 가장 민감하고 빠른 반응속도로 포트스캔 탐지하지만 민감한 만큼 부정확한 정보 전달의 가능성이 있다.

    ./portsentry -atcp

    ./portsentry -audp

   위의 모드들은 동시에 여러모드가 동시에 사용될수 없으며, 반드시 한가지 모드만 동작을 시켜야 한

   다. 일반적으로는 portsentry -stcp , portsentry -sudp 옵션을 많이 사용하고 있다.

 

< 동작 확인 >

  위의 세가지 동작중 -stcp, -sudp로 동작시켰을때 ps -aef | grep portsentry 명령을 내렸을 때

   ./portsentry -stcp

   ./portsentry -sudp 라인이 있으면 정상적으로 동작하고 있는 것이다.

  만약 위와 같은 파일이 존재 하지 않는다면, 실행이 잘못 되어진 것이므로, 다시 한번 실행 방법을 읽어본 후에 실행을 시켜 본다.


 < 스캔 탐지 로그 >

  portsentry를 동작시켜 놓았을 때 외부에서 스캔 공격이 들어오면

  portsentry.blocked.stcp

  portsentry.blocked.sudp

  portsentry.history 세 가지의 파일이 생성된다.


  각 로그 파일의 역할과 특성을 알아보도록 한다.

 

postsentry 로그파일

설                       명

portsenty.blocked.stcp

  tcp 측으로 스캔이 탐지되었을때 로그가 기록된다.

  (휘발성이다. portsentry를 재시작하면 기록이 삭제된다.)

portsentry.blocked.sudp

  udp 측으로 스캔이 탐지되어있을 로그가 기록된다.

  (휘발성이다. portsentry를 재시작하면 기록이 삭제된다.)

portsentry.history

  tcp,udp의 모든 로그기록이 종합되어 남는다.

  비 휘발성으로 portsentry를 재시작해도 로그값이 그대로 남아있게

  된다. 로그는 누적되어 기록된다.

< 표 11-1 portsentry의 로그 파일들 >

 

  portsentry에 의해서 로그에 기록된 IP는 /etc/hosts.deny에 보면 모든 서비스가 차단되는 ALL에 등록되어 있을 것이다.

  (ex : ALL: 211.xxx.xxx.xxx )


  관리자는 history로그를 잘 살펴보아 스캔공격이 얼마나 이루어지고 있는지 파악해야 하며, 스캔 공격이 많이 이루어 지고 있을 때에는 서버에 쓸데없이 열린 포트는 없는지, 취약한 패키지 프로그램은 없는지 항상 관심을 가져야 한다.



11.2 nmap

  portsentry가 포트스캔을 방지하는 것이라는 것을 알았다.

  하지만 이번에 알아볼 프로그램은 아이러니하게도 포트를 스캔하는 프로그램이다.

  “보안도구는 해킹도구“ 란 말이 있다.

  보안도구를 다른 목적으로 사용하면 해킹도구가 되는 것이다. 또 그와 반대로 해킹도구를 다른 목적으로 사용하면 보안을 강화하는 도구로 사용될 수도 있는 것이다.

강도가 칼을 들면 흉기고, 의사가 칼을 들면 메스 이듯이..

좋은 의미로 nmap은 시스템의 취약점이나 포트 정보를 얻기 위한 목적으로 사용되는 프로그램이다.

nmap은 예전에는 추가로 설치해야 하는 프로그램이었으나 최근에는 패키지로 같이 포함되어서 나오고 있다. 최신버전은 nmap-3.20-1 버전까지 나와 있다 (소스와 rpm 모두 존재하므로 편한대로 받아서 업그레이드 및 새로 설치를 하면 된다. )


여기에서는 rpm으로 설치하는 법을 알아본다.


< 설치방법 >

rpm -Uvh namp-3.20-1.i386.rpm

< 사용방법 >

일반적인 스캔방법은

nmap IP (스캔하고자 하는 상대방의 IP)

예) 로컬호스트를 스캔할 때

nmap localhost

 

   < 그림 11-1 localhost를 스캔한 모습 >


   웹서버로 운영되는 서버이기 때문에 웹에 관련된 서비스 포트가 열려있는 것을 확인할 수가 있다.


   nmap은 포트스캔을 통해서 열려있는 포트 정보를 알아볼수만 있을 뿐만 아니라. 커널버전 (OS의 종류), 서버가 꺼지지 않고 동작된 시간, 정보를 알아내기까지 걸린시간등도 알아낼 수 있다.


  스캔의 가장기본이 되는 명령을 사용하여 시스템의 정보를 확인해보자.

 

 

< 그림 11-2 OS 및 uptime시간, 열린 포트 확인 >

 

위의 그림에서 얻을 수 있는 정보는 열린 포트 목록, OS종류, 커널 버전, 서버가 다운되지 않고 가동된 시간 ( 3월 26일 17시 33분 29초이래로 서버가 계속 동작되고 있음을 알려준다 )

 

nmap 에는 많은 옵션들이 있다.

그중에서 대표적으로 사용하는 옵션들을 알아보도록 하겠다.

 

옵  션

설    명

sT

  열려있는 TCP포트를 체크하기 위해서 사용된다. 가장 일반적이며,  쉽게 체크되

  고 필터링된다.

sU

  열려있는 UDP포트를 체크한다. (정확히 말하면 UDP의 닫혀 있는 포트를

  검색하는것임) -sU만 UDP를 체크할수 있고 나머지 옵션들은 TCP만 체크한다.

sS

  tcp에 syn(연결을 요청하는 패킷)패킷을 보내고 응답이 있는 포트는 열린포트로

  감지하는 방식으로 root권한이 있어야 실행할수 있다.

sR

  rcp scan (서버내에서 rcp를 사용하여 열린 포트를 검색하고 rcp 사용 프로그램을 같

  이 출력한다. )

sF, sX, sN

  stealth 기능으로 로그에 기록되지 않는 스캔 방식이다.

  portsentry의 stealth 스캔 탐지 기능으로 체크가 가능하다.

sP

  ping을 이용하여 스캔하는 방식 (호스트가 살아있는지 여부만 판단)

PI

  icmp ping을 이용한 스캔 방식

O

  os를 판별하기 위한 옵션

p

  포트의 범위를 지정한다. ( -p 1-100 => 1번부터 100까지 포트를 검색한다. )

F

  /etc/service에 등록되어 있는 포트만을 스캔한다. (fast scanmode)

 

     이외에도 많 옵션들이 있지만, 잘 사용하지 않는 옵션들이고, 악용할 소지가 충분히 있는 옵션들이기 때문에 여기서는 설명하지 않고 관리자의 판단에 맡긴다. 그 외 nmap을 더 자세히 알고 싶은 관리자들은 서버에서 “man nmap” 명령을 입력하면 자세한 nmap의 설명이 나오며, 인터넷을 통한 검색에서도 여기에서 설명한 것보다 자세하고 많은 옵션에 대한 정보를 알아 볼수있을 것이다.


    최근 보안에 대한 관심이 높아지면서 스캔을 해킹을 위한 사전작업으로 인식하고 있으므로 무모한 다른 서버의 스캔으로 인해서 관리자 자신이 고소를 당한다던지 역해킹을 당한다던지 하는 등의 피해를 입을수 있음으로 스캔 프로그램 사용에 주의해야 하며, nmap 프로그램은 자신이 관리하는 서버들에 대해서 정보를 파악하고 불법 포트가 오픈 되지 않았나 하는 등의 보안용으로만 사용하기 바란다.


  11.3 losf

     보안도구의 마지막으로 lsof에 대해서 알아보기로 하겠다.

     lsof는 현재 실행되고 있는 프로세서와 열린 포트. 그리고 그 포트가 참조하는 파일등을 알 수 있는   프로그램이다.

     이상한 프로세서가 실행중이거나 수상한 포트가 열려있을때, 그 포트가 어떤 프로그램을 참조하고  어떤 프로세서에 의해서 열려있는지 확인이 가능하다.


  < 설치방법 >

   소스, rpm이 있으며, 여기서는 소스로 설치하는 법을 알아본다.

   (서버에는 기본적으로 rpm -Uvh lsof-4.51-2.i386.rpm가 설치되어 있다. )


   tar -zxvf lsof_4.64.orig.tar.gz

   cd lsof_4.64_src

   ./Configure linux

   이때 Inventory Mode를 실행할 것인지 물어본다. Inventory Mode는 패키지의 이상유무를 판단하는 것으로서 테스트한다. 후에 Customization에 대해서도 물어보지만 모두 디폴트값으로 사용해도 무방하다.  (./Configure linux 한 이후에 나오는 질문에 모두 enter만 입력하면 된다)

   make

   make install


   여기까지 이상 없이 되었다면 모든 설치가 완료가 된 것이다.

   사용을 편리하게 하기 위해서 생성된 lsof 명령을 PATH가 걸려있는 디렉토리로 복사한다.

   path가 걸려있는 디렉토리의 확인은 쉘스크립트 할때 알아보았다. (echo $PATH)


< 사용법 >

   설치가 완료되었다면 이제는 사용법에 대해서 알아보자

 

lsof < 옵션>

 

< 그림 11-5 lsof의 출력 >


 

   그림 11-5는 옵션없이 lsof를 사용한 그림이다. 서버에서 동작하고 있는 모든 프로세서 열린 파일들이 출력되므로 more 명령어를 사용해서 한 화면씩 나누어 본 것이다.

    lsof의 주요 옵션을 알아본 후에 그 옵션들을 이용하여, 의심스러운 포트와 그 포트를 사용하는 프로그램이 무엇인지 알아보도록 하겠다.

 

옵 션

설                 명

-t

  현재 동작되고 있는 프로세서의 PID를 출력한다.

-p [pid]

  해당 pid가 참조하고 있는 프로그램과 파일들과 라이브러리가 출력된다.

-i[:port]

  현재 열려있는 소켓들에 대해서 출력한다. -i[:port] 특정포트에 대해 출력

-i@<ip>

  해당 아이피가 접속 정보를 출력한다. -i@<도메인>으로도 가능. 대신 도메

  인은 resolve되어서 IP로 변환이 가능해야 한다.

-T

  현재 열려있는 소켓들 중에서 TCP에 대한 것만을 출력

-U

  현재 열려있는 소켓들 중에서 UDP에 대한 것만을 출력

-l

  로그인 계정대신에 UID로 표시

-n

  호스트네임대신에 IP로서 출력

-r [초]

  losf의 명령을 -r 다음에 지정한 시간을 주기로 반복 실행한다.

-v

  lsof에 대한 정보를 출력한다.

-u<user>

  특정 사용자에 의해서 실행되고 있는 프로그램과 참조하고 있는 파일을

  출력한다. -u<uid>를 사용해도 같은 결과를 얻는다.

-c<데몬>

  특정 데몬들이 참조하고 있는 파일들을 출력한다.

       그 외 다른 옵션들은 “lsof -h“를 통해서 확인할 수 있다.



    예제) 80포트는 웹페이지를 띄울수 있도록 httpd 데몬이 사용하는 포트이다. 이미 알고 있는 이 포  트

            를 예로들어서 사용 중인 프로세서와 그 프로그램이 참조하는 파일들을 알아본다.

            또한 그 프로그램을 실행한 유저에 대해서도 알아본다.

 

< 그림 11-6 lsof를 사용하여 특정포트 확인 >

 

< 그림 11-7 lsof를 사용하여 참조하고 있는 파일 확인 >


  그림 11-7은 “lsof -p 687” 명령으로 그림 11-6에서 확인된 결과를 참고로 알아낸 PID를 추적하여 해당 PID가 사용하고 참조하고 있는 프로세서 및 파일들을 확인한 결과이다.


  종합하면, 80번 포트를 사용하는 것은 httpd라는 데몬이고, 여러 데몬중에서 PID 687을 추적하였더니 /usr/local/apache/logs/error_log 등등의 파일을 참조하고 있음을 확인하였다.

  lsof는 매우 유용한 프로그램 이므로, 위에 있는 옵션들만이라도 반드시 숙지하여 두기 바란다.


  이 번장에서는 보안에 대해서 알아보았다. 보안을 단지 몇 장의 페이지로 설명을 할 수는 없지만 기본적으로 알아두어야 하는 것들을 정리해 둔 것이므로 꼭 숙지하기를 바라며, 이번 장에서 설명되었던 프로그램들을 실제로 꼭 사용해 보기 바란다.

 

   그리고 반드시 명심해 두어야 할 것은 아무리 보안이 철저하더라고 해도 보안에 취약한 패키지를 사용한다거나 취약한 프로그램을 사용하게 되면, 보안 설정과는 무관하게 시스템의 보안이 뚫리는 경우가 많다. certcc.or.kr등을 통해서 취약한 패키지나 해킹 동향을 항상 주의깊에 살펴보아야 하며, root패스워드를 주기적으로 바꾸어주고 시스템 사용자들이 사전식 패스워드나, 짧고 쉬운 패스워드를 사용하지 않도록 주의를 주어야 한다.

   한순간의 방심이 소중한 데이터를 한번에 날려버릴수도 있다는 것을 깨닫고, 보안과 백업을 병행하여, 안전하고, 신뢰성 있는 서버를 운영할 수 있는 관리자가 되어야 할 것이다.