데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
Snort와 Suricata는 오픈소스 네트워크 침입 탐지 및 방지 시스템(IDS/IPS)입니다. Snort는 1998년 Martin Roesch에 의해 개발되었으며, Suricata는 2010년 OISF(Open Information Security Foundation)에서 더 현대적인 아키텍처로 탄생했습니다. 두 도구 모두 실시간 트래픽 분석, 패킷 로깅, 시그니처 기반 탐지를 제공하며, AI 보안 파이프라인에서 전처리기 및 이상 탐지 피드 소스로 활용됩니다.
네트워크 인터페이스에서 트래픽을 캡처하여 프로토콜 디코딩, 상태 추적, 패턴 매칭을 수행. 멀티스레드(Suricata)로 고속 처리 가능.
사용자 정의 규칙(Rule)을 통해 악성 트래픽 식별. Snort 규칙과 Suricata 규칙은 대부분 호환되며, Lua 스크립트로 확장 가능.
JSON/EVE 로그 출력을 통해 이상 탐지 모델의 피처로 활용. Python 라이브러리(pysuricata, snorkel)로 자동화된 규칙 관리 가능.
기존 상용 IDS/IPS 대비 Snort/Suricata는 비용 효율성, 투명성, 커스터마이징 자유도를 제공합니다. 아래 비교표를 참고하세요.
| 항목 | Snort | Suricata | 상용 솔루션 (예: Cisco Firepower) |
|---|---|---|---|
| 라이선스 | GPLv2 | GPLv2 | 상업용 (고비용) |
| 멀티스레딩 | 제한적 (단일 스레드) | ✅ 기본 지원 (고성능) | ✅ 지원 |
| 프로토콜 디코딩 | HTTP/SSL 등 기본 | HTTP2, TLS 1.3, QUIC 등 확장 | 벤더 종속 |
| 로그 형식 | syslog, unified2 | JSON (EVE), YAML | 독자 형식 |
| AI/ML 연동 | Python 파싱 필요 | ✅ EVE JSON 직접 활용 | API 제한적 |
| 커뮤니티 | 성숙, 방대한 규칙 | 빠른 성장, Emerging Threats | 폐쇄적 |
Snort와 Suricata는 공통적으로 패킷 캡처 → 디코더 → 탐지 엔진 → 출력 파이프라인을 따릅니다. 아래는 Suricata 기준 아키텍처입니다.
핵심 구성 요소
Ubuntu 22.04 기준 Suricata 설치부터 첫 탐지 규칙 실행까지 단계별로 안내합니다.
# Suricata 설치 (PPA)
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt update
sudo apt install suricata -y
# 버전 확인
suricata --version
# 설정 파일 편집 (/etc/suricata/suricata.yaml)
# HOME_NET, EXTERNAL_NET 정의
# af-packet 인터페이스 설정 (예: eth0)
sudo sed -i 's/HOME_NET: "\[192.168.0.0\/16\]"/HOME_NET: "[10.0.0.0\/8]"/' /etc/suricata/suricata.yaml
sudo sed -i 's/interface: eth0/interface: ens160/' /etc/suricata/suricata.yaml
# 규칙 업데이트 (Emerging Threats)
sudo suricata-update
sudo systemctl restart suricata
Python으로 EVE JSON 로그를 실시간 모니터링하는 코드입니다.
#!/usr/bin/env python3
"""Suricata EVE 로그 실시간 모니터링 예제"""
import json
import time
from pathlib import Path
EVE_LOG = "/var/log/suricata/eve.json"
def follow_log(filepath):
with open(filepath, 'r') as f:
f.seek(0, 2) # 끝으로 이동
while True:
line = f.readline()
if not line:
time.sleep(0.1)
continue
try:
event = json.loads(line)
if event.get('event_type') == 'alert':
alert = event['alert']
print(f"[!] 탐지: {alert['signature']} "
f"(src: {event['src_ip']}:{event['src_port']} "
f"→ dst: {event['dest_ip']}:{event['dest_port']})")
except json.JSONDecodeError:
continue
if __name__ == "__main__":
print("Suricata EVE 모니터링 시작...")
follow_log(EVE_LOG)
# 특정 규칙만 로드하여 pcap 파일 분석
suricata -r sample.pcap -S /path/to/custom.rules -l /tmp/suricata_test
# 실시간 인터페이스 모니터링 (IPS 모드)
suricata -c /etc/suricata/suricata.yaml -i ens160 --af-packet
suricata-stats 명령어로 처리량, 드롭률 등 성능 메트릭을 확인할 수 있습니다. AI 파이프라인에 통합하려면 eve.json을 Kafka 프로듀서로 전송하세요.
Suricata 설정 파일(suricata.yaml)에서 자주 수정하는 항목을 표로 정리했습니다.
| 설정 키 | 설명 | 예시 값 |
|---|---|---|
vars.address-groups.HOME_NET |
내부 네트워크 대역 정의 | "[10.0.0.0/8, 172.16.0.0/12]" |
af-packet[0].interface |
패킷 캡처 인터페이스 | ens160 |
eve-log.enabled |
EVE JSON 로그 활성화 | yes |
eve-log.types.alert |
alert 이벤트 로깅 | yes |
default-rule-path |
규칙 파일 디렉토리 | /etc/suricata/rules |
rule-files |
로드할 규칙 파일 목록 | [suricata.rules, emerging-*.rules] |
runmode |
실행 모드 (autofp, workers 등) | workers (고성능) |
HOME_NET을 정확히 설정하지 않으면 내부 트래픽이 외부로 오탐될 수 있습니다. 클라우드 환경에서는 VPC CIDR을 정확히 입력하세요.
| 문제 | 원인 | 해결책 |
|---|---|---|
| Suricata가 패킷을 드롭함 | 버퍼 부족, CPU 병목 | af-packet.buffer-size 증가, runmode: workers 사용, RSS 큐 조정 |
| EVE 로그에 alert가 없음 | 규칙 미적용, HOME_NET 오설정 | suricata-update 실행, suricata -T로 설정 테스트 |
| Snort 규칙 호환 문제 | Suricata 전용 키워드 누락 | suricata-update로 변환, noalert 규칙 확인 |
| Python 파싱 속도 저하 | JSON 라인 단위 처리 비효율 | ijson 스트리밍 파서 사용, 또는 Cython 확장 고려 |
suricata.yaml에서 max-pending-packets와 decode.buffer-size를 조정하세요.suricata-update를 자동화하세요.suricata -T로 설정 유효성 검사, suricata -r로 pcap replay 테스트.공식 문서 및 유용한 링크입니다.