IDS/IPS 완전 가이드: Snort와 Suricata로 침입을 탐지하고 차단하다
방화벽을 뚫고 들어온 공격자 — 이제 누가 막을 것인가?
방화벽은 허용되지 않은 포트와 IP를 차단합니다. 하지만 허용된 포트(80, 443)를 통해 들어오는 정교한 공격은 어떻게 막을까요?
시나리오:
공격자 → 포트 443 (HTTPS) → 방화벽: "정상 트래픽" → 통과
→ SQL Injection 페이로드
→ XSS 공격 코드
→ 멀웨어 다운로드 시도
방화벽만으로는 내용 기반 공격을 탐지할 수 없습니다. 이것이 바로 IDS(Intrusion Detection System, 침입 탐지 시스템) 와 IPS(Intrusion Prevention System, 침입 방지 시스템) 가 필요한 이유입니다.
IDS/IPS는 네트워크 트래픽의 "내용"을 분석하여:
- SQL Injection 패턴 탐지
- 멀웨어 시그니처 매칭
- 비정상적인 트래픽 행동 감지
- 공격 시도를 실시간으로 차단 (IPS)
2024년 기준, 가장 인기 있는 오픈소스 IDS/IPS는 Snort와 Suricata입니다. Snort는 1998년부터 20년 이상 검증된 안정성을, Suricata는 멀티스레드로 최대 3배 빠른 성능을 제공합니다.
이 글에서는 IDS와 IPS의 차이, 탐지 방법론, Snort vs Suricata 심층 비교, 규칙 작성 방법, 실전 설정, 그리고 오탐 처리까지 완전히 정리하겠습니다.
IDS란? IPS란? — 탐지와 차단의 차이
IDS (Intrusion Detection System, 침입 탐지 시스템)
역할: 탐지 + 경보
IDS는 네트워크 트래픽을 수동적으로 모니터링하여 의심스러운 활동을 탐지하고 관리자에게 알림을 보냅니다.
[인터넷] → [방화벽] → [네트워크]
↓ (미러링/TAP)
[IDS] → 로그 + 알림
특징:
- 수동 모드 (Passive)
- 트래픽을 복사(미러링)하여 분석
- 공격을 차단하지 않음
- 트래픽 흐름에 영향 없음
장점:
- 네트워크 성능에 영향 없음
- 오탐(False Positive)이 있어도 서비스 중단 없음
단점:
- 실시간 차단 불가
- 공격이 이미 실행된 후 알림
IPS (Intrusion Prevention System, 침입 방지 시스템)
역할: 탐지 + 차단
IPS는 트래픽 경로에 인라인(Inline) 으로 위치하여, 악성 트래픽을 즉시 차단합니다.
[인터넷] → [방화벽] → [IPS] → [네트워크]
↓
(악성 트래픽 차단)
특징:
- 능동 모드 (Active/Inline)
- 모든 트래픽이 IPS를 통과
- 공격을 실시간 차단
- DROP/REJECT 액션 수행
장점:
- 실시간 방어
- 공격이 목표에 도달하기 전 차단
단점:
- 오탐 시 정상 트래픽도 차단 (서비스 중단 위험)
- 네트워크 지연 시간 증가 가능
- Single Point of Failure (IPS 다운 시 전체 네트워크 중단)
IDS vs IPS 비교표
| 항목 |
IDS | IPS |
| 위치 | 네트워크 외부 (미러링) | 인라인 (경로 상) |
| 모드 | 수동 (Passive) | 능동 (Active) |
| 액션 | 탐지 + 알림 | 탐지 + 차단 |
| 트래픽 흐름 | 영향 없음 | 모든 패킷 통과 |
| 오탐 영향 | 알림만 (무해) | 서비스 중단 위험 |
| 지연 시간 | 없음 | 증가 가능 |
| 사용 사례 | 보안 모니터링, 포렌식 | 실시간 방어 |
NIDS vs HIDS — 배치 위치에 따른 분류
NIDS (Network-based IDS/IPS)
위치: 네트워크 경계 또는 중요 세그먼트
모니터링 대상: 전체 네트워크 트래픽
[인터넷] → [라우터] → [NIDS] → [스위치] → [서버들]
장점:
- 하나의 시스템으로 전체 네트워크 보호
- 서버별 설치 불필요
단점:
- 암호화된 트래픽(HTTPS) 분석 제한
- 고속 네트워크에서 성능 부담
대표 솔루션:
- Snort
- Suricata
- Zeek (구 Bro)
HIDS (Host-based IDS/IPS)
위치: 개별 서버/호스트
모니터링 대상: 시스템 로그, 파일 변경, 프로세스 활동
[서버]
├─ HIDS 에이전트
├─ 파일 무결성 모니터링
├─ 로그 분석
└─ 프로세스 모니터링
장점:
- 암호화된 트래픽도 분석 가능 (복호화 후)
- 로컬 로그 및 파일 시스템 모니터링
단점:
- 각 호스트마다 설치 필요
- 호스트 자원 소모
대표 솔루션:
- OSSEC
- Wazuh
- Tripwire
탐지 방법론
① 시그니처 기반 탐지 (Signature-Based Detection)
원리: 알려진 공격 패턴(시그니처)과 매칭
예시:
규칙: 패킷에 "UNION SELECT" 포함 시 → SQL Injection 경고
패킷 내용: GET /search?q=1' UNION SELECT * FROM users--
→ 매칭! → 알림/차단
장점:
- 낮은 오탐율 (알려진 패턴만 탐지)
- 빠른 탐지
단점:
- 제로데이 공격 탐지 불가 (알려지지 않은 공격)
- 시그니처 데이터베이스 지속 업데이트 필요
- 난독화로 우회 가능
② 이상 행위 기반 탐지 (Anomaly-Based Detection)
원리: 정상 행동 패턴을 학습하고, 벗어나는 행동 탐지
예시:
정상: 서버 A는 평소 1시간당 1,000 요청
이상: 갑자기 1시간당 100,000 요청 → 이상 탐지!
장점:
- 제로데이 공격 탐지 가능
- 알려지지 않은 공격도 탐지
단점:
- 높은 오탐율 (정상 트래픽도 이상으로 판단)
- 학습 기간 필요
- 복잡한 설정
③ 하이브리드 (Hybrid)
현대 IDS/IPS는 시그니처 + 이상 행위를 결합하여 사용합니다.
Snort vs Suricata — 두 거인의 대결
Snort (1998년~)
개발: Martin Roesch, Sourcefire (Cisco 인수)
특징:
- 세계에서 가장 많이 사용되는 IDS/IPS
- 20년 이상 검증된 안정성
- 방대한 규칙 세트 (Emerging Threats, Talos)
- 단일 스레드 (Snort 2.x)
- 멀티 스레드 (Snort 3.x, 2014~)
장점:
- 성숙하고 안정적
- 광범위한 문서 및 커뮤니티
- OpenAppID (Layer 7 DPI)
단점:
- Snort 2.x는 단일 스레드 → 고속 네트워크에서 성능 제한
- Snort 3.x는 아직 완전히 성숙하지 않음
Suricata (2010년~)
개발: Open Information Security Foundation (OISF)
특징:
- 멀티스레드 아키텍처 (처음부터 설계)
- 고성능 (Snort 대비 최대 3배 빠름)
- Snort 규칙 호환 (대부분)
- NSM (Network Security Monitoring) 기능
장점:
- 멀티코어 CPU 활용 → 높은 처리량
- 풍부한 로깅 (EVE JSON)
- 프로토콜 파싱 (HTTP, TLS, DNS 등)
- 조건부 PCAP 저장
단점:
- Snort보다 복잡한 설정
- 리소스 소비가 더 많음
성능 비교 (실제 벤치마크)
환경: 1 Gbps 네트워크, 멀티코어 CPU
| 항목 |
Snort 2.x | Snort 3.x | Suricata |
| 스레드 | 단일 | 멀티 | 멀티 |
| 최대 처리량 | ~300 Mbps | ~600 Mbps | ~900 Mbps |
| CPU 사용률 | 100% (1코어) | 60% (4코어) | 40% (4코어) |
| 패킷 드롭 | 높음 | 중간 | 낮음 |
결론: Suricata가 고성능 환경에서 우수
규칙 작성 — Snort/Suricata Rule Syntax
기본 구조
action protocol src_ip src_port direction dst_ip dst_port (options)
예시:
alert tcp any any -> 192.168.1.0/24 80 (msg:"SQL Injection Attempt"; content:"UNION SELECT"; sid:1000001; rev:1;)
주요 요소 설명
1. Action (액션)
| 액션 | 설명 |
| alert | 경고 생성 (IDS) |
| log | 패킷 로깅 |
| pass | 무시 |
| drop | 차단 (IPS) |
| reject | 차단 + RST/ICMP 전송 (IPS) |
2. Protocol (프로토콜)
tcp, udp, icmp, ip
3. IP 주소
any # 모든 IP
192.168.1.5 # 특정 IP
192.168.1.0/24 # CIDR 블록
!192.168.1.5 # 제외
[192.168.1.5, 192.168.1.10] # 리스트
4. 포트
any # 모든 포트
80 # 특정 포트
80:443 # 범위
:1024 # 1024 이하
1024: # 1024 이상
5. Direction (방향)
-> # 단방향 (src → dst)
<> # 양방향 (src ↔ dst)
6. Options (옵션)
msg:"Alert Message" # 경고 메시지
sid:1000001 # 고유 ID
rev:1 # 버전
content:"malicious" # 내용 매칭
nocase # 대소문자 무시
pcre:"/regex/" # 정규식
flow:to_server # 흐름 방향
threshold:type limit, track by_src, count 5, seconds 60 # 임계값
실전 규칙 예시
SQL Injection 탐지
alert tcp any any -> $HOME_NET 80 (
msg:"SQL Injection Attempt - UNION SELECT";
flow:to_server,established;
content:"UNION"; nocase;
content:"SELECT"; nocase; distance:0;
sid:1000001; rev:1;
)
XSS 탐지
alert tcp any any -> $HOME_NET 80 (
msg:"XSS Attempt - <script> tag";
flow:to_server,established;
content:"<script>"; nocase;
sid:1000002; rev:1;
)
SSH 무차별 대입 공격 탐지
alert tcp any any -> $HOME_NET 22 (
msg:"SSH Brute Force Attempt";
flow:to_server,established;
threshold:type threshold, track by_src, count 5, seconds 60;
sid:1000003; rev:1;
)
Snort 실전 설치 및 설정
설치 (Ubuntu 22.04)
# 의존성 설치
sudo apt update
sudo apt install -y build-essential libpcap-dev libpcre3-dev \
libdumbnet-dev bison flex zlib1g-dev liblzma-dev openssl libssl-dev
# Snort 3 다운로드 및 설치
cd /opt
sudo wget https://www.snort.org/downloads/snort/snort3-3.x.x.tar.gz
sudo tar -xzvf snort3-3.x.x.tar.gz
cd snort3-3.x.x
./configure --prefix=/usr/local --enable-tcmalloc
make -j$(nproc)
sudo make install
# 버전 확인
snort -V
규칙 다운로드
# Emerging Threats 규칙 다운로드
cd /etc/snort/rules
sudo wget https://rules.emergingthreats.net/open/suricata-6.0/emerging.rules.tar.gz
sudo tar -xzvf emerging.rules.tar.gz
설정 파일
# /etc/snort/snort.lua
HOME_NET = '192.168.1.0/24'
ips = {
enable_builtin_rules = true,
include = '/etc/snort/rules/emerging-*.rules',
}
-- IPS 모드
daq = {
module_dirs = { '/usr/local/lib/daq' },
modules = {
{ name = 'afpacket', mode = 'inline' }
},
}
실행 (IDS 모드)
# 인터페이스 확인
ip addr
# IDS 모드 실행 (수동)
sudo snort -c /etc/snort/snort.lua -i eth0 -A alert_fast -q
# 백그라운드 실행
sudo snort -c /etc/snort/snort.lua -i eth0 -D
Suricata 실전 설치 및 설정
설치
# Ubuntu/Debian
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata
# 버전 확인
suricata --version
규칙 업데이트
# suricata-update 사용
sudo suricata-update
# Emerging Threats 규칙 자동 다운로드
sudo suricata-update list-sources
sudo suricata-update enable-source et/open
sudo suricata-update
설정 파일
# /etc/suricata/suricata.yaml
HOME_NET: "[192.168.1.0/24]"
EXTERNAL_NET: "!$HOME_NET"
# 인터페이스 설정
af-packet:
- interface: eth0
threads: 4
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
# 규칙 파일
rule-files:
- suricata.rules
# 로깅
outputs:
- eve-log:
enabled: yes
filetype: regular
filename: eve.json
types:
- alert
- http
- dns
- tls
실행
# IDS 모드 (수동)
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
# IPS 모드 (인라인)
sudo suricata -c /etc/suricata/suricata.yaml --af-packet=eth0
# 서비스 시작
sudo systemctl start suricata
sudo systemctl enable suricata
# 상태 확인
sudo systemctl status suricata
# 로그 확인
sudo tail -f /var/log/suricata/eve.json
오탐 (False Positive) 처리
IDS/IPS의 가장 큰 과제는 정상 트래픽을 공격으로 오인하는 것입니다.
오탐 예시
규칙: content:"admin"; 포함 시 알림
정상 요청: GET /admin/login
→ 오탐! (정상 관리자 페이지 접근)
해결 방법
1. 규칙 튜닝
# 너무 광범위한 규칙 수정
# Before:
alert tcp any any -> any 80 (msg:"Admin access"; content:"admin"; sid:1000;)
# After (더 구체적으로):
alert tcp !192.168.1.0/24 any -> $HOME_NET 80 (
msg:"External Admin Access";
content:"POST"; http_method;
content:"/admin/"; http_uri;
content:"admin"; nocase;
sid:1000; rev:2;
)
2. Threshold (임계값) 설정
# 5분간 10회 이상일 때만 알림
alert tcp any any -> $HOME_NET 80 (
msg:"Possible Port Scan";
threshold:type threshold, track by_src, count 10, seconds 300;
sid:1001;
)
3. Suppression (억제)
특정 IP나 규칙을 억제:
# /etc/snort/threshold.conf
suppress gen_id 1, sig_id 1000, track by_src, ip 192.168.1.100
4. 규칙 비활성화
# Suricata에서 특정 규칙 비활성화
sudo nano /etc/suricata/disable.conf
1000001 # SID 번호
로그 분석 및 시각화
ELK Stack 통합 (Elasticsearch + Logstash + Kibana)
# Filebeat로 Suricata 로그 전송
sudo apt install filebeat
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/suricata/eve.json
json.keys_under_root: true
output.elasticsearch:
hosts: ["localhost:9200"]
# Filebeat 시작
sudo systemctl start filebeat
Kibana 대시보드:
- 알림 수 추이
- Top 공격 출발지 IP
- Top 공격 유형
- 지리적 분포
개발자를 위한 IDS/IPS 체크리스트
배포 전
- IDS vs IPS 모드 선택 (수동 vs 인라인)
- NIDS vs HIDS 선택
- Snort vs Suricata 선택
- 네트워크 대역폭 확인 (처리 가능한지)
초기 운영 (IDS 모드 권장)
- 1~2주간 IDS 모드로 모니터링
- 오탐 로그 분석 및 규칙 튜닝
- Threshold 및 Suppression 설정
IPS 모드 전환
- 점진적 활성화 (중요 규칙부터)
- 24시간 모니터링 체계
- 긴급 우회 절차 수립 (IPS 문제 시)
지속적 관리
- 주간 로그 리뷰
- 월간 규칙 업데이트
- 분기별 성능 점검 (패킷 드롭률)
- 연간 규칙 클린업 (미사용 규칙 제거)
마지막으로
방화벽이 네트워크 경계의 문지기라면, IDS/IPS는 내부를 순찰하는 경비원입니다. 허용된 포트를 통해 들어오는 SQL Injection, XSS, 멀웨어 — 이 모든 것을 탐지하고 차단합니다.
핵심 원칙:
① 방화벽만으로는 불충분하다 — IDS/IPS 필수
② 초기에는 IDS 모드로 시작 (오탐 튜닝)
③ Suricata가 고성능 환경에 유리 (멀티스레드)
④ 규칙 지속 업데이트 (ET, Talos)
⑤ 로그 분석 자동화 (ELK Stack)
빠른 시작 (Suricata):
# 1. 설치
sudo apt install suricata
# 2. 규칙 업데이트
sudo suricata-update
# 3. 실행
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
# 4. 로그 확인
sudo tail -f /var/log/suricata/eve.json
IDS/IPS는 방화벽의 맹점을 메우는 필수 보안 계층입니다. 지금 배포하세요.
댓글