Snort 는 오픈 소스 침입 탐지 시스템(IDS)으로, 네트워크 트래픽을 모니터링하고 분석하여 보안 위협을 탐지한다. Snort의 데이터베이스는 탐지된 이벤트와 네트워크 패킷 정보를 체계적으로 저장하고 관리한다.
Snort 데이터베이스는 여러 테이블로 구성되어 있다.
CREATE TABLE `schema` (
vseq INT UNSIGNED NOT NULL,
ctime DATETIME NOT NULL,
PRIMARY KEY (vseq)
);
탐지된 모든 이벤트(알림)를 저장하는 핵심 테이블
CREATE TABLE event (
sid INT(10) UNSIGNED NOT NULL,
cid INT(10) UNSIGNED NOT NULL,
signature INT(10) UNSIGNED NOT NULL,
timestamp DATETIME NOT NULL,
PRIMARY KEY (sid, cid)
);
탐지 규칙(signature) 정보를 저장하는 테이블
CREATE TABLE signature (
sig_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
sig_name VARCHAR(255) NOT NULL,
sig_class_id INT(10) UNSIGNED NOT NULL,
sig_priority INT(10) UNSIGNED,
sig_rev INT(10) UNSIGNED,
sig_sid INT(10) UNSIGNED,
sig_gid INT(10) UNSIGNED,
PRIMARY KEY (sig_id)
);
IP 패킷 헤더 정보를 저장하는 테이블
CREATE TABLE iphdr (
sid INT(10) UNSIGNED NOT NULL,
cid INT(10) UNSIGNED NOT NULL,
ip_src INT(10) UNSIGNED NOT NULL,
ip_dst INT(10) UNSIGNED NOT NULL,
ip_ver TINYINT(3) UNSIGNED,
ip_hlen TINYINT(3) UNSIGNED,
ip_tos TINYINT(3) UNSIGNED,
ip_len SMALLINT(5) UNSIGNED,
ip_id SMALLINT(5) UNSIGNED,
ip_flags TINYINT(3) UNSIGNED,
ip_off SMALLINT(5) UNSIGNED,
ip_ttl TINYINT(3) UNSIGNED,
ip_proto TINYINT(3) UNSIGNED NOT NULL,
ip_csum SMALLINT(5) UNSIGNED,
PRIMARY KEY (sid, cid)
);
ICMP 패킷 정보를 저장하는 테이블
CREATE TABLE icmphdr (
sid INT(10) UNSIGNED NOT NULL,
cid INT(10) UNSIGNED NOT NULL,
icmp_type TINYINT(3) UNSIGNED,
icmp_code TINYINT(3) UNSIGNED,
icmp_csum SMALLINT(5) UNSIGNED,
icmp_id SMALLINT(5) UNSIGNED,
icmp_seq SMALLINT(5) UNSIGNED,
PRIMARY KEY (sid, cid)
);
Snort 룰은 크게 룰 헤더(Rule Header)와 룰 옵션(Rule Option)**으로 구성된다. 이런 구조는 어떤 트래픽을 검사하고, 어떤 조건에서 어떤 행동을 취할지 정의한다.**
[Action] [Protocol] [Source IP] [Source Port] [Direction] [Destination IP] [Destination Port] (옵션)
패킷을 처리하는 기준을 명시한다. 다음과 같은 요소로 구성된다.
패킷이 룰과 일치할 때 수행할 동작을 지정한다.
명령어 | 내용 |
---|---|
alert | 경고 발생 및 로그 기록 |
log | 로그 기록 |
pass | 패킷 무시 |
drop | 패킷 차단 및 로그 기록 (IPS 기능, 인라인 구조 필요) |
reject | 패킷 차단 및 TCP RST/ICMP Unreachable 응답 |
sdrop | 패킷 차단 및 로그 기록 없음 |
패킷의 흐름 방향을 지정한다.
형식 | 내용 |
---|---|
-> | 요청 패킷 탐지 (좌→우 방향) |
<> | 요청/응답 패킷 모두 탐지 (양방향) |
룰 옵션은 룰 헤더에서 표현하지 못한 세부적인 조건과 행위를 정의한다. 괄호 안에 세미콜론으로 구문하여 작성한다.
명령어 | 내용 | 형식 |
---|---|---|
msg | 경고 이벤트 메시지 | msg:"ICMP Ping test"; |
sid | 룰 식별자 (3000000번 이상 권장) | sid:3000001; |
rev | 룰 버전, 수정될 경우 1씩 증가 | rev:1; |
priority | 우선 순위 (1~10, 값이 작을수록 우선) | priority:1; |
classtype | 스노트 룰 분류 | classtype:분류이름; |
reference | 취약점 참고 URL 정보 | reference: 이름 http://~; |
명령어 | 내용 | 예제 |
---|---|---|
content | 특정 문자열/바이너리 패턴 탐지 | content:"abc"; content:"|41 42 43|"; |
nocase | 대소문자 구분 없이 탐지 | content:"abc"; nocase; |
offset | 지정한 바이트 위치부터 탐지 | offset:3; |
depth | 시작부터 지정 바이트까지 검사 | depth:5; |
distance | 이전 패턴 매치 후 상대적 위치 지정 | distance:10; |
within | 범위 내 검사 지정 | within:5; |
pcre | 정규표현식 사용 | pcre:"/패턴/"; |
명령어 | 내용 |
---|---|
flow | 세션 방향 및 상태 지정 |
to_server | 클라이언트→서버 패킷 매칭 |
to_client | 서버→클라이언트 패킷 매칭 |
established | 연결된 세션 상태 패킷 매칭 |
stateless | 세션 연결 무관 매칭 |
alert tcp any any -> any 22 (msg:"SSH Brute Force Attack"; content:"SSH-2.0"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid:1000001;)
이 룰은 다음과 같이 동작한다.