강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

snort를 이용한 네트워크 침입 탐지

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle84.gif

(Network Intrusion Detection Using Snort)

번역 / 이국현(errai@hitel.net) 

 

이 문서는 독자들에게 기초적인 침입탐지 시스템을 구축하도록 도와준다.
그리고 Snort 네트워크 침입탐지 시스템을 동작하기 위한 호스트 설정 및, 테스트, 가능한 침입이벤트에 대한 이야기를 할 것이다.

Snort는 Martin Roesch가 개발한 소프트웨어 기반의 리얼타임 침입탐지 시스템으로써, 가능성있는 침입시도에 대해서 관리자에게 알려주는 기능을 가지고 있다.
Snort는 바로써 먹을 수 있는 exploit를 가진 크래커들이 여러분의 웹 페이지를 변경 및 파괴하기 위해 시도하는 방법들에 대한 기록을 여러분에게 경고해준다.

지금까지의 침입탐지 장치들은 상용으로 돈을 지불해야 하거나, 리얼타임이 아니고, 혹은 설치하기 힘들었다. Snort는 비상용인데다가 소규모의 TCP/IP 네트워크를 모니터링 해주는 솔루션을 제공한다. 또 사용하기 쉽고 , 작은 용량에 많은 기능을 대신할 수 있다.

 

* 네트워크 침입 탐지 시스템이란 무엇인가?

Network Intrusion Detection System(네트워크 침입탐지 시스템 / 이하 NIDS)는 네트워크에 부당한 접속자나, 권한이 없는 데이타가 생겼을 때 그것을 탐지해 낸다. 이것은 Firewall과는 다른데, Firewall은 특정한 규칙(rule)을 적용하여 특별한 서비스나 호스트를 허락하고 거부하는 설정을 한다. 만약 네트워크 트래픽이 허락된 패턴과 일치한다면 그 서비스나 접속을 허락하고, 그것이 어떤 패킷을 포함하고 있는지는 고려하지 않는다. 그러나 NIDS는 모든 트래픽을 캡쳐하고 면밀히 살핀다. 그리고 그것이 허락되었는지 아닌지는 고려하지 않는다. IP나 application level에서 모든 자료를 기반으로 하여 경고를 산출해 낸다.

Snort는 소용량 NIDS으로 다른 프로그램에 영향을 미치지 않고, 쉬운 설정에 쉽게 실행되고, 인스톨하는데 오직 몇 분만이 소요된다. Snort는 현재 1100개 이상의 가능성 있는 취약점을 탐지해 내는 기능을 포함하고 있다. 침입탐지 장치는 다른 보안 장치와 함께 동작한다. 침입탐지장치가 다른 좋은 보안 프로그램을 대체할 수 없다는 것을 기억해야 한다.

Snort는 다음과 같은 기능을 포함하고 있다.

- buffer overflow, stealth port scans, CGI 공격, SMB probe, NetBIOS query,
   NMAP 혹은 다른 portscanner, 잘 알려진 백도어, 시스템 취약점, DDoS 클라이언트,
   그 밖에 기타등등을 포함한 징후들에 대해 패턴 매칭을 기반으로 한 탐지 및 경고.

- syslog를 이용해 SMB “WinPopUp” 메세지나 화일을 관리자에게 경고해줌.

- 취약점이 알려졌을 때 빠르게 새로운 rule을 개발시킬 수 있다.

- 위반된 IP address로부터 사람이 읽을 수 있는 상태로 패킷을 저장함

- NFS나 Napster 접속같이 네트워크에서 발견되지 않는 트래픽을 저장하기 위해
   “passive trap”을 이용.

- 가정의 DSL 접속 모니터를 위해 워크스테이션에서 사용 및, 법인 웹싸이트를 모니터하기
   위해 지정된 서버에서 사용.

Snort는 libpcap 라이브러리를 사용하는데, 이 라이브러리는 tcpdump에서 패킷 스니핑을 하는데도 사용되었다. Snort는 promiscous mode를 이용하여 네트워크를 지나가는 모든 패킷을 해석한다. 그 각각의 패킷과 설정화일 안에 정의된 룰을 기반으로 하여, 경고를 산출해 낸다.

 

* 왜 침입탐지를 사용하는가?

침입탐지 장치는 어떤 네트워크에서도 없어서는 안된다. 인터넷은 끊임없이 발전하고 있고, 새로운 취약점과 exploit들이 규칙적으로 발견되고 있다.
침입탐지 장치는 침입자에 대한 탐지를 위해 향상된 레벨의 보호장치를 제공하고, 공격자의 행동에 대한 처리방법을 도와준다.

 

* Snort를 설치하기 전에

여러분이 Snort를 설치하기 전에 결정해야 할 몇 가지 것들이 있다.

- 여러분의 네트워크 그룹에서 침입탐지 장치를 동작하기 위한 동의를 얻었는가?

- 여러분이 Snort를 인스톨하려고 하는 시스템은 보안이 잘 되어있는 시스템인가?
   침입자에 의해 시스템이 이미 변경되어진 경우인지 잘 확인해야 한다. remote access를
   위해서는 OpenSSH(http://www.openssh.com)를 이용하는 것이 필수이다.
   Solaris Security FAQ (
http://www.sunworld.com/sunworldonline/common/f_security
   -faq.html ) 그리고 Linux Security HOWTO(http://www.linuxsecurity.com/ docs/)
   를 읽어보는 것이 도움이 될 것이다.

- 어디서 넣을 것인가? 만약 여러분이 간단하게 여러분의 집 컴퓨터로 행해지는
   port scanning 이나 시스템을 공격하는 시도를 발견하기 위한다면, 매우 쉬운 결정이다.
   그러나 하나의 네트워크 모임에서 어디에 배치하느냐 하는 문제는 좀더 어렵다.

- 날짜와 시간은 올바른가? Snort가 동작할 호스트의 날짜와 시간은 올바르게 해야 한다.
   xntpd time server(www.eecis.udel.edu/~ntp/) 를 설치하면 시간과 관련된 기록이 확실해
   질 것이다. 만약 이미 설치되어있는 경우라도 설정이 필요할지도 모른다. 한번 적당한
   timeserver의 URL를 알아내서 root crontab entry에 다음과 같이 추가시켜 보자.

00 * * * * root /usr/sbin/ntpdate -u

 

* 침입 탐지장치의 배치

장치는 외부의 신뢰하지 못하는 네트워크와 firewall 사이, 네트워크 조직의 firewall 바깥쪽에 위치할 것이다. 이는 snort가 firewall을 통해 들어온 침입자뿐만 아니라 firewall에 의해 막히는 것까지 탐지해 낼 수 있도록 한다.

switch, router

firewall들은 올바르게 배치되어질 것이다. 결정은 여러분이 실제로 원하는 네트워크 모니터링에 달려있다. firewall의 내부 local side에 배치하면 firewall에 의해 이미 허락되어진 트래픽을 모니터링 할 것이다. 물론 firewall이 이미 막아버린 잠재적인 마스커레이딩 port scan 이나, 탐색, 다른 타입의 공격들에 대해서는 트래픽을 잡아내지 않을 것이다.

 

* Single Interface

single interface 박스가 가장 쉬운 설정이다. 동일한 인터페이스가 네트워크 트래픽에 listen하고있는 동일한 인터페이스는 관리자 시스템이 있는 장소와 같은 장소에서 동작할 것이다.

00-10-8.gif

이것은 전형적인 홈 네트워크 유저와 관리자가 내부 네트워크를 모니터링 하는 설정이다.

 

* Dual Interface

dual-interface 설정은 하나의 인터페이스는 promiscuous mode에서 네트워크 트래픽에 대해 listen하고있고, 다른 하나는 remote 관리에 사용되는 것이다. 이 설정 타입은 같은 인터페이스가 네트워크 트래픽에 대해 listening하는 것이 가능하지 않은 환경에 사용된다.

이 설정은 외부 인터페이스는 잘 보호되어져야만 한다. 내부 인터페이스는 오직 ssh를 제외하고는 어떤 네트워크 서비스도 제공하지 않아야만 한다.

00-10-7.gif

<Images Courtesy Network Flight Recorder >

 

* Snort의 설치

snort프로그램을 source code로 다운받으면 INSTALL파일에 배포판이 포함하고 있는 설치와 설정에 대한 설명이 적혀있다. 쉽게 컴파일할 수 있고 설정하고 설치할 수 있을 것이다.
만약 RedHat계열의 유저라면 이미 컴파일된 RPM파일을 사용하면 된다.
(http://www.linuxsecurity.com/programs/snort-1.6.2.2-1.i386.rpm) 그리고 libpcap-0.4 패키지도 설치되어있어야 한다. 소스코드나 다른 정보는 (ftp://ftp.ee.lbl.gov/ libpcap.tar.Z) 에서 다운받길 바란다.

 

* Snort Ruleset의 설치

Snort를 인스톨 한 후에는 최신 rule 파일을 다운받아야 한다. 현재 두 가지의 ruleset이 있다. Jim Forster에 의해 개발되고 있는 ruleset을 다운받는 곳은
http://www.snort.org/ snort-files.htm#Rules 이다.

다른 ruleset은 Max Vision의 ArachNIDS 에서 개발하고 있다. 이것은 http://dev.whitehats.com/ ids/ vision.conf 에서 다운받을 수 있고, 시간단위로 업데이트 된다.

Max Vision ruleset은 공통적인 취약점들에 관한 (CVE) 데이타베이스를 따르고 있기 때문에 특별히 좋다. 일관된 이름을 이용하여 특별한 취약점에 대한 제공을 해준다.
아래는 CVE Frequently Asked Questions의 일부이다.

“CVE는 보안 취약점과 위험한 부분에 대한 정보 리스트이다. 알려진 문제에 대하여 일관된 이름으로 정보를 제공한다. CVE의 목적은 각각의 취약점에 대해 데이타베이스를 만듦으로써 보안 툴들이 이것을 공통적인 표같은 것으로 이용하여 좀더 쉽게 보안기능을 행할 수 있도록 하기 위함이다.”

만약 snort를 RPM으로 설치했다면 Dave Dittrich가 만든 스크립트인 /usr/sbin/snort-update 를 이용하면 Max Vision의 최신 ruleset을 다운 받을 수 있다. cron에 다음을 추가해도 된다.

00 00 * * * root /usr/sbin/snort-update -q 이 스크립트 또한 http://www.linuxsecurity.com/programs/snort-update 에서 다운받을 수 있다.

이 스크립트는 wget 패키지가 설치되어있어야 동작할 것이다. 직접 다운받으려면 http://dev.whitehats.com/ ids/vision.conf 를 다운받으면 된다. 이것은 성공적으로 메일을 관리자에게 배달할 것이다.

snort-update 스크립트는 vision.conf 를 대신할 vision.conf.new를 다운 받는다. 그리고 local의 root(이전버젼에서는 다른 이름)에게 통지문을 메일로 보낸다. vision.conf.new를 vision.conf로 바꾸는 것을 잊지 말도록 하자.

여러분은 아마 Max Vision ruleset에서 덧붙여진 snort.org ruleset을 사용하고 싶을지도 모른다. 그럼 다음의 주소에서 다운받으면 된다.
(http://www.snort.org/snort-files.htm#Rules) 이 ruleset을 결합한 것에 대한 정보는 아래에 포함되어 있다.

The backdoor-lib, misc-lib, overflow-lib 그리고 다른 유사한 화일은 소스코드를 포함하고 있지만, 많은 데이터가 있지만 일반적으로 사용하지 않는다.

( 역자주:  snort-update를 시도하려했지만 dev.whitehats.com 에 접속이 되지 않았다.
              그리고 snort를 RPM으로 설치했을 경우에 snort 라는 유저를 만들어 주어야 실행이
              된다. 레드햇 계열이라면 adduser이라는 명령어를 이용하면 된다.
              그리고 vision.conf 가 아니라 vision.rules 라는 화일을 사용하였다. )

 

* 운영되는 변수 선언하기

snort 를 시작하기 전에 몇 가지 변수를 선언해 주어야 한다. 또한 snort RPM안에는 rules.base라고 부르는 화일을 포함하고 있는데 Max Vision의 vision.conf 화일에서 파생된 것이다. 이 작은 화일은 몇 가지 변수를 포함하고 있는데 여러분의 내부와 외부 네트워크, 호스트에서 무시해야 할 portscan들과 탐지해야 할 portscan들에 대한 정의를 하고 있다.
그것은 http://www.linuxsecurity.com/programs/rules.base 에서 다운 받을 수 있다.

portscan은 T초 동안에 P port보다 더 많이 TCP 접속 시도를 하는 것이다.
혹은 UDP패킷을 T section에서 P port보다 더 많이 보내는 것이다.
Martin의 “Writing Snort Rules(http://www.chark.net/ ~roesch/snort_rules.html)를 읽어보면 portscan에 대한 충분한 설명이 될 것이다.

여러분의 내부 와 외부 네트워크에 대한 정보를 제공할 필요가 있다. 그리고 DNS 서버로부터 portscan 탐지를 어디서 시작해야 할지를 제공해야 한다.

rules.base 화일은 다음과 같다.
 

#
# Taken and modified from “vision.conf”, part of Max Vision’s
# ArachNIDs work. See /usr/doc/snort-1.6/README.snort-stuff for more
# information on how to use this file.

var INTERNAL 192.168.1.0/24
var EXTERNAL 63.87.101.0/24
var DNSSERVERS 63.87.101.90/32 63.87.101.92/32

preprocessor http_decode: 80 443 8080
preprocessor minfrag: 128
preprocessor portscan-ignorehosts: $DNSSERVERS
preprocessor portscan: $EXTERNAL 3 5 /var/log/snort/portscan.log
# |
# Log file (path/name) ----------------------------------+

# Ruleset, available (updated hourly) from:
#
# http://dev.whitehats.com/ids/vision.conf

# Include the latest copy of Max Vision’s ruleset
include /etc/snort/vision.conf

#
# Uncomment the next line if you wish to include the latest
# copy of the snort.org ruleset. Be sure to download the latest
# one from http://www.snort.org/snort-files.htm#Rules
#
# include /etc/snort/06082k.rules

#
# If you wish to monitor multiple INTERNAL networks, you can include
# another variable that defines the additional network, then include
# the snort ruleset again. Uncomment the two following lines.
#
# var INTERNAL 192.168.2.0/24
# include /etc/snort/vision.conf

# include other rules here if you wish.

 

만약 dialup machine을 사용하고 있다면 여러분의 dialup 인터페이스를 /32 subnet mask로 호스트 그 자체를 나타내도록 해야 한다.

덧붙여서, 여러분은 snort 로그를 포함한 다른 보안 사건에 대한 특정한 로그파일을 남기기 위해 syslogd를 설정할 필요가 있을지도 모른다. /etc/syslog.conf 를 에디트해서 snort 경고에 대한 log도 설정하도록 하자.

/etc/syslog.conf file:

authpriv.* /var/log/secure.log

[root@krypton ~]# /usr/bin/killall -HUP syslogd

 

* Preprocessor 사용하기

preprocessor는 침입탐지 엔진이 패킷에 대한 ruleset을 적용하기 전에 data flow를 검사하기 위해 리스트로 적혀진 것이다. 이것은 패킷의 내용을 고칠 수 있고, 탐지 엔진에 특정한 패킷에 대해 진행하지 않도록 신호를 보낼 수 있다.

The preprocessor httpd_decode : web 서버가 돌아가고 있는 port 에 대한 적용.(역자주: 이 내용밖에 이해하기가 힘드네요. URI도 오타 같고)

The preprocessor portscan : 호스트 나 네트워크에 대한 직접적인 정의를 내린다. 호스트 그 자체에 대해서는 32-bit subnet으로 IP address를 나타낸다. /32 라고 표시하면 되겠고, 예를 들어 Class C인 경우에는 /24 라고 적어주면 된다.

The portscan-ignorehosts preprocessor는 바로 알 수 있듯이 무시할 호스트 적어주면 된다. space로 구분한다.

preprocessor portscan-ignorehosts: 63.87.101.90/32 63.87.101.92/32

만약 필요하지 않다면 위 부분을 적어주지 않아도 된다.

minfrag preprocessor 는 fragmented packet(http://www.faqs.org/rfc/rfc1858.txt)을 체크한다.

 

* Snort의 동작 테스트!

이제 여러분이 설정한 파일에 대한 일반적인 테스트를 해보자.
 

[root@krypton ~]# snort -d -l /var/log/snort -c /etc/snort/rules.base
Initializing Network Interface...
User level filter, protocol ALL, raw packet socket
Decoding Ethernet on interface eth0
Initializing Preprocessors!
-------------------------------------------------
Keyword | Preprocessor @
-------------------------------------------------
http_decode : 0x8053070
minfrag : 0x8053290
portscan : 0x8053ce0
portscan-ignorehosts: 0x8054340
-------------------------------------------------

Initializing Plug-ins!
-------------------------------------------------
Keyword | Plugin Registered @
-------------------------------------------------
content : 0x8052050
offset : 0x8052080
depth : 0x80520f0
nocase : 0x8052160
flags : 0x8052710
itype : 0x80528f0
icode : 0x8052a00
ttl : 0x8052b10
id : 0x8052bf0
ack : 0x8052cd0
seq : 0x8052dc0
dsize : 0x8052ec0
ipopts : 0x8054420
rpc : 0x8054670
icmp_id : 0x8054830
icmp_seq : 0x8054930
session : 0x8055300
-------------------------------------------------

Initializating Output Plugins!
-------------------------------------------------
Keyword | Output @
-------------------------------------------------
alert_syslog : 0x8054a20
log_tcpdump : 0x8054ff0
-------------------------------------------------

 

+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
255 Snort rules read...
255 Option Chains linked into 140 Chain Headers
+++++++++++++++++++++++++++++++++++++++++++++++++++

Performing Rule List Integrity Tests...
---------------------------------------
Alert TCP Chains : OK
Alert UDP Chains : OK
Alert ICMP Chains : OK
Log TCP Chains : Empty list...
Log UDP Chains : Empty list...
Log ICMP Chains : Empty list...
Pass TCP Chains : Empty list...
Pass UDP Chains : Empty list...
Pass ICMP Chains : Empty list...
---------------------------------------

 

-*> Snort! <*-
Version 1.6
By Martin Roesch (roesch@clark.net, www.clark.net/~roesch)

 

snort의 동작을 멈추려면 ctrl-C를 누르면 된다. 이것은 기본적인 snort의 실행방법이고, 수동으로 실행시키려면 다음과 같이 하면 된다.

[root@krypton ~]# /usr/sbin/snort -s -d -D -i eth0 -l /var/log/snort \
-c /etc/snort/rules.base
[root@krypton ~]#

-D 스위치는 snort를 데몬과 마찬가지로 백그라운드로 실행시키는 것이다.
만약 eth0를 사용하지 않는다면 바꿔서 써주기 바란다. 만약 RPM으로 설치했다면 /etc/rc.d/init.d/snortd의 INTERFACE 변수를 고치면 된다. 그리고 RPM 설치유저는 다음과 같이 snort를 실행시킬 수 있다.
(역자주 : RPM으로 설치했을 경우 rc.d 에 모든 스크립트를 설치해놓기 때문에 재부팅 할 때 자동으로 snort가 실행될 것이다.)

[root@krypton ~]# /etc/rc.d/init.d/snortd
Starting snort: [ OK ]
[root@krypton ~]# ps awx | grep snort
9131 ? S 0:04 /usr/sbin/snort -s -d -D -i eth0 -l
/var/log/snort -c /etc/snort/rules.base
9149 pts/1 S 0:00 grep snort
[root@krypton ~]#

 

* 침입 시도 관찰하기

snort가 정확하게 동작한다고 믿은 후에는 , 여러분 스스로 공격자가되어 네트워크를 공격해보자. “오직 여러분 소유!의 네트워크” 에 말이다. 나의 공격 호스트(krypton)는 192.168.100.189이고 제물이 될 호스트는 192.168.200.189이다. nmap을 이용하였고, 루트권한으로 실행해야 할 것이다.

[root@krypton ~]# nmap -p 25,53 -sX -P0 -D 1.2.3.4,5.6.7.8 192.168.200.189

Starting nmap V. 2.54BETA1 by fyodor@insecure.org (www.insecure.org/nmap/)
Interesting ports on smtp.mydomain.com (192.168.200.189):
Port State Service
25/tcp open smtp
53/tcp open domain

Nmap run completed -- 1 IP address (1 host up) scanned in 19 seconds

192.168.200.189 대신에 여러분 네트워크의 호스트 IP 주소를 적어넣자.
/var/log/auth.log 화일은 다음과 유사한 모습을 볼 수 있을 것이다.

(역자주:  리눅스에서 기본적인 syslog 설정에 따르면 /var/log/secure 화일을 보면 다음과
             같은 모습을 볼 수 있을 것이다.)

[root@krypton ~]# /usr/bin/snort2html /var/log/auth.log
Jun 18 15:57:52 krypton snort[9131]: spp_portscan: PORTSCAN DETECTED from 1.2.3.4
Jun 18 15:57:52 krypton snort[9131]: spp_portscan: PORTSCAN DETECTED from 5.6.7.8
Jun 18 15:57:58 krypton snort[9131]: spp_portscan: portscan status from
192.168.1.100: 2 connections across 1 hosts: TCP(2), UDP(0) STEALTH
Jun 18 15:57:58 krypton snort[9131]: spp_portscan: portscan status from
1.2.3.4: 2 connections across 1 hosts: TCP(2), UDP(0) STEALTH
Jun 18 15:57:58 krypton snort[9131]: spp_portscan: portscan status from
5.6.7.8: 2 connections across 1 hosts: TCP(2), UDP(0) STEALTH

/var/log/snort 디렉토리에는 각각의 호스트에 대한 자세한 침입 시도 정보가 저장되어있다.
예를 들면 다음과 같다.
 

[root@krypton ~]# cd /var/log/snort
[root@krypton snort]# find 192.168.200.189
192.168.100.189
192.168.100.189/ICMP_ECHO
192.168.100.189/ICMP_PORT_UNRCH
192.168.100.189/TCP:57554-32771
192.168.100.189/TCP:57555-32771
[root@krypton ~]#

 

TCP:57554-32771화일이 나타내는 것을 보자.
 

[root@krypton 192.168.100.189]# cat TCP:57554-32771
** MISC-Attempted Sun RPC high port access **
06/18-00:48:31.928357 192.168.100.189:57554 -> 192.168.200.189:32771
TCP TTL:42 TOS:0x0 ID:5410
***F*P*U Seq: 0x0 Ack: 0x0 Win: 0x400
00 00 00 00 00 00

 

syslog entry는 다음과 유사할 것이다.

Jun 18 00:48:31 krypton snort[8757]: MISC-Attempted Sun RPC high port
access: 192.168.100.189:57554 -> 192.168.200.189:32771

덧붙여서 Dan Swan이 perl로 만든 snort2html(http://www.linuxsecurity.com/programs/snort2html) 프로그램을 이용하면 HTML 형식으로 정보를 볼 수 있으니 참고 하기 바란다.
 

Resources

- tracks an intruder(http://www.enteract.com/~lspitz/forensics.html)

- snort internals(http://scorpions.net/~fygrave/misc/snortdoc/)

- snort download page(http://www.snort.org/snort-files.htm)

- snort.org(http://www.snort.org/)

 

이 글의 원문은 http://www.linuxsecurity.com/using-snort.html 에 있습니다.

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,074 명
  • 현재 강좌수 :  35,995 개
  • 현재 접속자 :  535 명