리눅스

[KaliLinux & Rocky9.7] 보안 인프라 구축 실습 정리 | Suricata IDS/IPS 설치 및 설정 가이드

palantirops 2026. 5. 13. 17:22
Suricata IDS/IPS 설치 및 설정 가이드

🛡️ Suricata IDS/IPS 설치 및 설정 완전 가이드 (Rocky Linux / RHEL 계열)


1 Suricata란?

Suricata는 OISF(Open Information Security Foundation)에서 개발한 오픈소스 네트워크 보안 엔진이다.
IDS(침입 탐지 시스템), IPS(침입 방지 시스템), NSM(네트워크 보안 모니터링) 기능을 모두 제공하며, 멀티스레드 처리로 고속 트래픽 환경에서도 실시간 분석이 가능하다.

모드설명
IDS (탐지)트래픽을 모니터링하고 알림만 생성, 차단하지 않음
IPS (방지)악성 트래픽을 실시간으로 차단
NSM (모니터링)전체 네트워크 흐름 기록 및 분석

2 설치

2-1. EPEL 저장소 추가 및 시스템 업데이트

# EPEL 저장소 설치 (Extra Packages for Enterprise Linux)
dnf install -y epel-release

# 시스템 패키지 전체 업데이트
dnf update -y

2-2. Suricata 설치

dnf install -y suricata

2-3. 설치 버전 확인

suricata -V

예시 출력: This is Suricata version 7.x.x RELEASE

💡 RPM 락 오류 발생 시
패키지 설치 중 Error: Failed to download metadata for repo 또는 락 오류가 발생하면 아래 명령어로 해결:
sudo rm -f /var/lib/rpm/.rpm.lock

3 프로미스큐어스 모드 (Promiscuous Mode)

일반적으로 NIC는 자신에게 전달된 패킷만 수신한다.
프로미스큐어스 모드를 활성화하면 네트워크 상의 모든 패킷을 수신하여 Suricata가 전체 트래픽을 분석할 수 있다.

활성화 / 비활성화

# 프로미스큐어스 모드 켜기 (enp0s3 는 본인 NIC 이름으로 변경)
sudo ifconfig enp0s3 promisc

# 프로미스큐어스 모드 끄기
sudo ifconfig enp0s3 -promisc

# 현재 NIC 이름 확인
ip link show
⚠️ 주의: 재부팅하면 프로미스큐어스 모드가 해제된다. 영구 적용이 필요하면 /etc/rc.d/rc.local 또는 systemd 서비스로 등록해야 한다.

4 설정 파일

4-1. 메인 설정 파일

vi /etc/suricata/suricata.yaml

Suricata의 모든 동작을 제어하는 핵심 파일이다. 주요 설정 항목:

항목설명
HOME_NET내부 네트워크 IP 대역 지정 (예: 192.168.0.0/16)
EXTERNAL_NET외부 네트워크 정의 (보통 !$HOME_NET)
af-packet패킷 캡처에 사용할 NIC 인터페이스 지정
default-log-dir로그 저장 경로 (/var/log/suricata/)
rule-files적용할 룰 파일 목록

4-2. 서비스 옵션 파일

vi /etc/sysconfig/suricata

systemd로 Suricata를 실행할 때 사용할 인터페이스, 옵션 등을 지정한다.

# 예시: 인터페이스 지정
OPTIONS="-i enp0s3"

5 룰(Rule) 업데이트

5-1. 기본 룰 업데이트

suricata-update

Suricata 공식 룰셋을 최신 버전으로 다운로드하여 /var/lib/suricata/rules/에 저장한다.

5-2. 룰 소스 목록 확인

suricata-update list-sources

사용 가능한 서드파티 룰 소스 목록이 출력된다.

5-3. ET/Open 룰 활성화

# Emerging Threats Open 룰셋 활성화 (무료, 추천)
suricata-update enable-source et/open

# 활성화 후 룰 다시 업데이트
suricata-update

5-4. 룰 파일 위치 확인

ls -al /var/lib/suricata/rules/

6 서비스 시작 및 관리

# 서비스 활성화 + 즉시 시작
systemctl enable --now suricata

# 서비스 상태 확인
systemctl status suricata

# 서비스 재시작 (룰 변경 후 필수)
systemctl restart suricata
💡 커스텀 룰을 추가하거나 suricata.yaml을 수정한 후에는 반드시 systemctl restart suricata를 실행해야 변경 사항이 적용된다.

7 로그 확인

7-1. 로그 디렉토리

ls /var/log/suricata/
파일명설명
fast.log빠른 알림 로그 (한 줄 요약 형식)
eve.json상세 이벤트 로그 (JSON 형식, 분석용)
suricata.logSuricata 엔진 자체 로그 (오류, 경고)
stats.log통계 정보 (패킷 수, 처리량 등)

7-2. fast.log 실시간 확인

cat /var/log/suricata/fast.log
tail -f /var/log/suricata/fast.log

7-3. eve.json 실시간 확인 (jq로 파싱)

# jq 설치
dnf install -y jq

# eve.json 실시간 스트림
tail -f /var/log/suricata/eve.json

# 알림(alert) 이벤트만 필터링
tail -f /var/log/suricata/eve.json | jq '.alert'

7-4. 룰 동작 테스트

# NIDS 테스트 사이트에 요청을 보내 룰이 트리거되는지 확인
curl http://testmynids.org/uid/index.html

요청 후 fast.logeve.json에 알림이 기록되면 Suricata가 정상 동작하는 것이다.


8 커스텀 룰 작성 예시 — SSH 연결 탐지

8-1. 로컬 룰 파일 편집

vi /etc/suricata/rules/local.rules

8-2. SSH 연결 시도 탐지 룰

alert tcp any any -> any 22 (msg:"SSH Connection Attempt Detected"; flags:S; sid:1000002; rev:1;)

8-3. 룰 분해 설명

구성 요소설명
액션 (Action)alert조건 충족 시 알림 생성 (차단은 drop)
프로토콜tcpTCP 트래픽 대상
출발지 IPany모든 출발지 IP
출발지 포트any모든 출발지 포트
방향->단방향 (출발 → 목적지)
목적지 IPany모든 목적지 IP
목적지 포트22SSH 포트
msg"SSH Connection Attempt Detected"로그에 기록될 메시지
flagsSTCP SYN 플래그 (연결 시도 패킷)
sid1000002룰 고유 ID (1000000 이상은 커스텀용)
rev1룰 버전 (수정 시 증가)
💡 테스트 방법: Windows에서 PuTTY로 SSH 접속을 시도하면 해당 룰이 발동되어 fast.log에 기록된다.
tail -f /var/log/suricata/fast.log로 실시간 확인 가능.

8-4. 적용 방법

# 1. local.rules가 suricata.yaml의 rule-files에 등록되어 있는지 확인
grep "local.rules" /etc/suricata/suricata.yaml

# 2. 없으면 suricata.yaml에 아래 항목 추가
#  rule-files:
#    - /etc/suricata/rules/local.rules

# 3. Suricata 재시작
systemctl restart suricata

9 룰 문법 상세 설명

기본 구조

액션 프로토콜 출발지IP 출발지포트 방향 목적지IP 목적지포트 (옵션들;)

주요 액션

액션설명
alert알림만 생성 (IDS 모드)
drop패킷 차단 + 알림 (IPS 모드)
pass해당 트래픽 무시
reject차단 + TCP RST 또는 ICMP 응답 전송

주요 옵션

옵션설명예시
msg알림 메시지msg:"HTTP attack";
content페이로드 문자열 매칭content:"GET";
pcre정규식 매칭pcre:"/admin/i";
flagsTCP 플래그 (S, A, F, R, P 등)flags:S;
threshold반복 횟수 기반 임계값 설정
sid룰 고유 ID (필수)sid:1000001;
rev룰 개정 버전 (필수)rev:1;
classtype공격 분류classtype:trojan-activity;

방향 연산자

연산자의미
->단방향: 출발지 → 목적지
<>양방향: 양쪽 모두 탐지

10 트러블슈팅 & 팁

룰 문법 검사 (재시작 전 확인)

suricata -T -c /etc/suricata/suricata.yaml

수동으로 단일 PCAP 파일 분석

suricata -c /etc/suricata/suricata.yaml -r /path/to/file.pcap

특정 인터페이스에서 직접 실행 (테스트용)

suricata -c /etc/suricata/suricata.yaml -i enp0s3

eve.json에서 특정 이벤트 타입 필터링

# alert 이벤트만
tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'

# DNS 이벤트만
tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="dns")'

# 알림 메시지와 출발지 IP만 출력
tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert") | {src_ip, alert: .alert.signature}'
💡 sid 범위 관리 권장:
 · 1~999999 : 공식 룰셋 (수정 금지)
 · 1000000~1999999 : 로컬/커스텀 룰 전용
 · 2000000~ : ET/Open 룰셋
⚠️ IPS 모드 전환 시 주의: alertdrop으로 바꾸기 전에 반드시 테스트 환경에서 충분히 검증할 것. 잘못된 룰이 정상 트래픽을 차단할 수 있다.

본 문서는 Rocky Linux 9 / RHEL 계열 환경 기준으로 작성되었습니다.