Snort

KIM DO YOON·2025년 3월 31일
0

Snort 데이터베이스의 주요 테이블/필드 구성 및 SQL 활용 방법

Snort 는 오픈 소스 침입 탐지 시스템(IDS)으로, 네트워크 트래픽을 모니터링하고 분석하여 보안 위협을 탐지한다. Snort의 데이터베이스는 탐지된 이벤트와 네트워크 패킷 정보를 체계적으로 저장하고 관리한다.

Snort 데이터베이스의 주요 테이블 구조

Snort 데이터베이스는 여러 테이블로 구성되어 있다.

schema 테이블

CREATE TABLE `schema` (
    vseq INT UNSIGNED NOT NULL,
    ctime DATETIME NOT NULL,
    PRIMARY KEY (vseq)
);
  • vseq: 스키마 버전 번호
  • ctime: 생성 시간

event 테이블

탐지된 모든 이벤트(알림)를 저장하는 핵심 테이블

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)
);
  • sid: 센서 ID
  • cid: 이벤트 ID
  • signature: 탐지 규칙 ID (signature 테이블과 연결)
  • timestamp: 이벤트 발생 시간

signature 테이블

탐지 규칙(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)
);
  • sig_id: 시그니처 ID
  • sig_name: 시그니처 명칭
  • sig_class_id: 시그니처 분류 ID
  • sig_priority: 우선순위
  • sig_rev: 개정 번호
  • sig_sid: 시그니처 SID
  • sig_gid: 시그니처 GID

iphdr 테이블

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)
);
  • sid, cid: event 테이블과 연결되는 키
  • ip_src: 출발지 IP 주소(정수형)
  • ip_dst: 목적지 IP 주소(정수형)
  • ip_ver: IP 버전
  • ip_proto: 프로토콜 번호 (6=TCP, 17=UDP)

icmphdr 테이블

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)
);
  • icmp_type: ICMP 유형 (8=Echo Request)

Snort 룰의 기본 구조

Snort 룰은 크게 룰 헤더(Rule Header)룰 옵션(Rule Option)**으로 구성된다. 이런 구조는 어떤 트래픽을 검사하고, 어떤 조건에서 어떤 행동을 취할지 정의한다.**

[Action] [Protocol] [Source IP] [Source Port] [Direction] [Destination IP] [Destination Port] (옵션)

룰 헤더

패킷을 처리하는 기준을 명시한다. 다음과 같은 요소로 구성된다.

Action

패킷이 룰과 일치할 때 수행할 동작을 지정한다.

명령어내용
alert경고 발생 및 로그 기록
log로그 기록
pass패킷 무시
drop패킷 차단 및 로그 기록 (IPS 기능, 인라인 구조 필요)
reject패킷 차단 및 TCP RST/ICMP Unreachable 응답
sdrop패킷 차단 및 로그 기록 없음

Direction

패킷의 흐름 방향을 지정한다.

형식내용
->요청 패킷 탐지 (좌→우 방향)
<>요청/응답 패킷 모두 탐지 (양방향)

룰 옵션

룰 옵션은 룰 헤더에서 표현하지 못한 세부적인 조건과 행위를 정의한다. 괄호 안에 세미콜론으로 구문하여 작성한다.

일반 옵션

명령어내용형식
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세션 연결 무관 매칭

예제 1: SSH 무차별 대입 공격(Brute Force) 탐지

alert tcp any any -&gt; any 22 (msg:"SSH Brute Force Attack"; content:"SSH-2.0"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid:1000001;)

이 룰은 다음과 같이 동작한다.

  • 모든 소스에서 목적지 포트 22(SSH)로 향하는 TCP 패킷 검사
  • 패킷 내용 중 "SSH-2.0" 문자열을 대소문자 구분 없이 검사
  • 30초 내에 동일한 소스에서 5회 이상 발생 시 알림 생성
profile
안녕하세요 김도윤 입니다.

0개의 댓글