728x90
반응형

Snort 란?

Snort는 오픈 소스 침입 방지 시스템(IPS)입니다. Snort IPS는 악의적인 네트워크 활동을 정의하는 데 도움이 되는 일련의 규칙을 사용하고 이러한 규칙을 사용하여 일치하는 패킷을 찾고 사용자에게 경고를 생성한다.

네트워크에 대한 룰을 정의해서 침입에 대한 탐지 및 방지를 위한 오픈소스라고 보면 될꺼 같다.

 

Snort 특징

  • 패킷 스니퍼 : 네트워크상의 패킷을 읽어서 보여주는 기능
  • 패킷 로거 : 탐지한 패킷의 로그를 기록하여 트래픽 및 디버깅을 활용
  • NIDS (Network IDS) : 침입탐지 시스템, 네트워크 트래픽 분석, 공격 탐지
  • Snort Inline : 침입방지 시스템, 패킷 분석, 공격 차단

※ IDS (Intrusion Detection System) 는 네트워크를 모니터링하고 부적절하거나 부정확하거나 비정상적인 활동을 감지하는 시스템을 말하며 IPS (Intrusion Prevention System)는 탐지 된 침입을 방지하거나 차단하기위한 조치를 적극적으로 취하는 것을 말한다.

 

Snort 설치 방법

1. 의존성 패키지 설치

root@security:~# apt-get install -y make gcc libpcre3-dev zlib1g-dev libluajit-5.1-dev
root@security:~# apt-get install -y libpcap-dev openssl libssl-dev libnghttp2-dev libdumbnet-dev
root@security:~# apt-get install -y bison flex libdnet autoconf libtool

2. snort 설치

2-1. 임시 디렉토리 생성

root@security:~# mkdir ~/temp
root@security:~# cd ~/temp
root@security:~# /temp

2-2. DAQ 설치

root@security:~/temp# wget https://snort.org/downloads/snort/daq-2.0.7.tar.gz      
root@security:~/temp# tar xvfz daq-2.0.7.tar.gz
root@security:~/temp# cd daq-2.0.7/
root@security:~/temp/daq-2.0.7# ./configure && make && sudo make install

2-3. snort 설치

root@security:~/temp# wget https://snort.org/downloads/snort/snort-2.9.19.tar.gz
root@security:~/temp# tar xvfz snort-2.9.19.tar.gz
root@security:~/temp# cd snort-2.9.19
root@security:~/temp/snort-2.9.19# ./configure --enable-sourcefire && make && sudo make install

3. NIDS 모드에서 실행하도록 snort 구성

root@security:~/temp/snort-2.9.19# ldconfig
root@security:~/temp/snort-2.9.19# ln -s /usr/local/bin/snort /usr/sbin/snort

4. 기동 유저 생성

root@security:~# groupadd snort
root@security:~# useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

5. snort 디렉토리 구조 설정

5-1. snort 를 구성할 디렉토리를 생성

root@security:~# mkdir -p /etc/snort/rules
root@security:~# mkdir /var/log/snort
root@security:~# mkdir /usr/local/lib/snort_dynamicrules

5-2. 생성한 디렉토리에 권한을 설정

root@security:~# chmod -R 5775 /etc/snort
root@security:~# chmod -R 5775 /var/log/snort
root@security:~# chmod -R 5775 /usr/local/lib/snort_dynamicrules
root@security:~# chown -R snort:snort /etc/snort
root@security:~# chown -R snort:snort /var/log/snort
root@security:~# chown -R snort:snort /usr/local/lib/snort_dynamicrules

5-3. white, black, local 룰 규칙에 대한 새로운 파일을 생성

root@security:~# touch /etc/snort/rules/white_list.rules
root@security:~# touch /etc/snort/rules/black_list.rules
root@security:~# touch /etc/snort/rules/local.rules

5-4.  다운받은 디렉토리에서 snort 설정 파일을 복사

root@security:~# cp -av ~/temp/snort-2.9.19/etc/*.conf* /etc/snort
root@security:~# cp -av ~/temp/snort-2.9.19/etc/*.map /etc/snort

6. snort 환경 설정

6-1.  경로 설정 및 local.rules 주석 해제

root@security:~# vi /etc/snort/snort.conf

# 104번째줄 경로 수정
----------------------------------------------------------------------------
# such as:  c:\snort\rules
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules

# If you are using reputation preprocessor set these
# Currently there is a bug with relative paths, they are relative to where snort is
# not relative to snort.conf like the above variables
# This is completely inconsistent with how other vars work, BUG 89986
# Set the absolute path appropriately
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
----------------------------------------------------------------------------
...

# 504번째줄 local.rules 주석 해제
----------------------------------------------------------------------------
# site specific rules
include $RULE_PATH/local.rules
----------------------------------------------------------------------------

6-2. 불필요한 부분을 주석처리 및 테스트 진행

root@security:~# sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf
root@security:~# snort -T -c /etc/snort/snort.conf

7. Rule 테스트

7-1. local.rules 설정

테스트를 위하여 모든 출발지, 도착지에 대하여 ICMP 프로토콜 경고 발생 설정한다.

처리방법 설명
alert 알람을 발생시키고 로그를 남긴다.
log 로그를 남긴다.
pass 무시한다.
activate 알람을 발생시키고 대응하는 dynamic action을 활성화 한다.
dynamic activate에 의해 활성화되면 로그에 남긴다.
drop iptables를 통해 패킷을 차단하고 로그를 남긴다.
sdrop iptables를 통해 패킷을 차단하고 로그를 안남긴다.
reject drop과 동일하지만 메세지를 남긴다.
TCP : RST 패킷 발생
UDP : ICMP Destination Unreachable 발생
root@security:~# vi /etc/snort/rules/local.rules

alert icmp any any -> any any (msg:"ICMP TEST"; sid:10000001;)
옵션 설명
msg alert, log 출력시 이벤트명으로 사용
content 패킷의 페이로드를 검색하는 문자열
offset content에서 검색할 문자열 offset 지정
nocase 대소문자를 구분하지 않는다.
rev 룰 횟수 수정
sid 룰을 식별하기 위한 식별자
* 100 미만 : 예약
* 100 ~ 100만 사이 : www.snort.org 에서 배포하는 룰
* 100만 초과 : 사용자 정의 룰

7-2. 타 서버에서 snort가 설치된 서버로 ping 테스트

# 타 서버에서 ICMP 프로토콜 (ping) 호출
root@security:~$ ping 20.100.0.101
PING 20.100.0.101 (20.100.0.101) 56(84) bytes of data.
64 bytes from 20.100.0.101: icmp_seq=1 ttl=64 time=0.542 ms
64 bytes from 20.100.0.101: icmp_seq=2 ttl=64 time=0.712 ms
64 bytes from 20.100.0.101: icmp_seq=3 ttl=64 time=0.543 ms
64 bytes from 20.100.0.101: icmp_seq=4 ttl=64 time=0.667 ms
64 bytes from 20.100.0.101: icmp_seq=5 ttl=64 time=0.509 ms
64 bytes from 20.100.0.101: icmp_seq=6 ttl=64 time=0.554 ms
64 bytes from 20.100.0.101: icmp_seq=7 ttl=64 time=0.495 ms
64 bytes from 20.100.0.101: icmp_seq=8 ttl=64 time=0.487 ms

# snort가 설치되어 있는 서버에서 로그 보기
root@security:~# tail -f /var/log/snort/alert
[**] [1:10000001:0] ICMP TEST [**]
[Priority: 0] 
02/18-17:30:49.958465 20.100.0.102 -> 20.100.0.101
ICMP TTL:64 TOS:0x0 ID:49545 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:2   Seq:11  ECHO

[**] [1:10000001:0] ICMP TEST [**]
[Priority: 0] 
02/18-17:30:49.958526 20.100.0.101 -> 20.100.0.102
ICMP TTL:64 TOS:0x0 ID:50949 IpLen:20 DgmLen:84
Type:0  Code:0  ID:2  Seq:11  ECHO REPLY
728x90
반응형