📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 192편
이전 글: 191. Anomaly Detection · 다음 글: 193. Snort
IDS Rule(규칙) 은 "어떤 트래픽을 보면 어떤 메시지로 Alert를 만들지"를 정의한 한 줄의 명세입니다. 규칙 문법(헤더와 옵션, content, flow 등)은 06 영역 282. Signature Rule, 288. Snort Rule 기초, 290. Suricata Rule 기초에서 자세히 다룹니다.
이 글은 규칙을 센서 장비에서 관리하는 방법, 즉 규칙이 어느 파일에 있고, 어떤 설정 파일과 연결되며, 로컬 규칙을 어떻게 안전하게 추가·시험하는지를 다룹니다.
규칙 한 줄의 구조는 간단히 다음과 같습니다.
alert icmp any any -> $HOME_NET any (msg:"LOCAL ICMP echo request to HOME_NET"; itype:8; sid:1000001; rev:1;)
└조치┘└프로토콜┘└출발지┘ └방향┘ └목적지┘ └──────────────── 옵션 (메시지, 조건, 식별자) ───────────────┘
Suricata 기준으로 규칙과 관련 파일이 엔진에 연결되는 구조입니다(패키지 기본 경로 기준, 설치 방식에 따라 다름).
/etc/suricata/suricata.yaml
├─ vars.address-groups (HOME_NET, EXTERNAL_NET) → 규칙의 $변수 값
├─ default-rule-path: /var/lib/suricata/rules
├─ rule-files: suricata.rules, /etc/suricata/rules/local.rules
├─ classification-file: /etc/suricata/classification.config → classtype → 분류명·우선순위
├─ reference-config-file: /etc/suricata/reference.config → reference 링크 형식
└─ threshold-file: /etc/suricata/threshold.config → 억제(suppress)·임계치
↓ 엔진 시작 / reload 시 적재
[탐지 엔진] → Alert: signature_id, rev, signature(msg), category(classtype), severity
threshold-file 항목은 패키지에 따라 주석 처리되어 있을 수 있어 사용 전에 확인합니다. Alert의 category와 severity는 규칙의 classtype이 classification.config에서 어떤 분류명과 우선순위로 정의되었는지에 따라 정해집니다(규칙에 priority를 직접 지정하면 그 값이 우선). 즉 같은 규칙이라도 설정 파일에 따라 Alert의 심각도가 달라질 수 있습니다.
엔진별 규칙 관련 설정 위치입니다.
| 항목 | Suricata | Snort 2 | Snort 3 |
|---|---|---|---|
| 주 설정 파일 | suricata.yaml | snort.conf | snort.lua |
| 규칙 포함 방식 | rule-files 목록 | include $RULE_PATH/local.rules | ips 모듈의 include 또는 rules |
| 변수 | vars.address-groups | ipvar HOME_NET ... | HOME_NET = '...' (Lua 변수) |
| 억제·임계치 | threshold.config | threshold.conf 등 | suppress, event_filter 모듈 |
규칙 식별자(sid)는 출처별로 범위가 나뉘어 있어, 로컬 규칙은 충돌하지 않는 범위를 써야 합니다.
| sid 범위(관례) | 용도 |
|---|---|
| 100 미만 | 예약(Snort 문서 기준) |
| 100 ~ 999,999 | Snort(Talos) 배포 규칙에서 사용 |
| 1,000,000 ~ 1,999,999 | 로컬(자체 작성) 규칙용으로 관례상 예약 |
| 2,000,000 ~ | Emerging Threats 등 다른 배포처 규칙 |
범위는 관례이며 배포처마다 세부 구간이 다르므로, 조직 내부에서 로컬 sid 대장을 관리하는 것이 안전합니다.
실습 예시 — Suricata 센서에 로컬 규칙 파일을 추가하고, 실제 트래픽 대신 pcap 파일로 먼저 시험하는 흐름입니다. 경로·IP는 예시(값은 환경마다 다름)입니다.
# 1) 로컬 규칙 파일 작성
sudo mkdir -p /etc/suricata/rules
echo 'alert icmp any any -> $HOME_NET any (msg:"LOCAL ICMP echo request to HOME_NET"; itype:8; sid:1000001; rev:1;)' \
| sudo tee /etc/suricata/rules/local.rules
# 2) suricata.yaml의 rule-files에 추가
# rule-files:
# - suricata.rules
# - /etc/suricata/rules/local.rules
# 3) 문법 검사
sudo suricata -T -c /etc/suricata/suricata.yaml -v
# 4) pcap으로 시험: -S 는 지정한 규칙 파일만 적재, -l 은 출력 디렉터리
mkdir -p /tmp/rule-test
sudo suricata -c /etc/suricata/suricata.yaml -S /etc/suricata/rules/local.rules \
-r ./icmp-sample.pcap -l /tmp/rule-test
jq -c 'select(.event_type=="alert") | .alert.signature_id' /tmp/rule-test/eve.json
특정 내부 호스트에서 반복되는 알려진 오탐은 규칙을 끄지 않고 출발지 조건으로 억제할 수 있습니다.
# /etc/suricata/threshold.config 예시: 192.168.10.30에서 발생하는 sid 1000001 Alert만 억제
suppress gen_id 1, sig_id 1000001, track by_src, ip 192.168.10.30
📷 [실습 화면 삽입 위치]
suricata -T검사 통과 메시지와, pcap 시험 후/tmp/rule-test/eve.json에서 sid 1000001 Alert가 추출된 화면
suppress나 pass 규칙을 넓게 쓰면 실제 공격까지 가려집니다. 억제 범위는 IP·sid 단위로 좁히고 사유를 기록합니다.관제자가 확인할 질문
classification.config나 priority 설정에 의한 값인가?threshold.config에 억제 설정이 추가되지 않았는가?규칙 변경 요청 (신규 탐지 / 오탐 억제)
↓ 로컬 sid 대장에서 번호 할당
↓ pcap 시험 (-S, -r) → 기대한 Alert만 발생하는지 확인
↓ 문법 검사 (-T) → 운영 센서 반영 → reload
↓ 변경 이력 기록 (사유, 범위, 담당자)
오탐 주의: 억제 설정이 누적되면 탐지 범위가 조용히 줄어듭니다. 억제 목록은 주기적으로 재검토합니다. Alert 해석 방법은 06 영역 283. IDS Alert에서 다룹니다.
suricata.yaml, snort.conf, snort.lua)의 규칙 목록을 통해 엔진에 적재됩니다.