🛡️ 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.log | Suricata 엔진 자체 로그 (오류, 경고) |
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.log나 eve.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) |
| 프로토콜 | tcp | TCP 트래픽 대상 |
| 출발지 IP | any | 모든 출발지 IP |
| 출발지 포트 | any | 모든 출발지 포트 |
| 방향 | -> | 단방향 (출발 → 목적지) |
| 목적지 IP | any | 모든 목적지 IP |
| 목적지 포트 | 22 | SSH 포트 |
| msg | "SSH Connection Attempt Detected" | 로그에 기록될 메시지 |
| flags | S | TCP SYN 플래그 (연결 시도 패킷) |
| sid | 1000002 | 룰 고유 ID (1000000 이상은 커스텀용) |
| rev | 1 | 룰 버전 (수정 시 증가) |
💡 테스트 방법: 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"; |
flags | TCP 플래그 (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 룰셋
· 1~999999 : 공식 룰셋 (수정 금지)
· 1000000~1999999 : 로컬/커스텀 룰 전용
· 2000000~ : ET/Open 룰셋
⚠️ IPS 모드 전환 시 주의:
alert를 drop으로 바꾸기 전에 반드시 테스트 환경에서 충분히 검증할 것. 잘못된 룰이 정상 트래픽을 차단할 수 있다.
본 문서는 Rocky Linux 9 / RHEL 계열 환경 기준으로 작성되었습니다.
'리눅스' 카테고리의 다른 글
| [ubuntu & kali & CTF Lupinone] Snort IPS 구성부터 CTF 권한 상승까지 (0) | 2026.05.14 |
|---|---|
| [KaliLinux_Ubuntu] 보안 인프라 구축 실습 정리 | Snort 3 · Nmap · IDS/IPS (0) | 2026.05.11 |
| [Ubuntu] VirtualBox DHCP IP 할당 불안정 문제 완벽 해결 가이드 (0) | 2026.05.01 |
| Rocky Linux DNS 서버 구축 후 브라우저에서 도메인이 안 열릴 때 해결법 (0) | 2026.04.02 |
| [Linux] 리눅스 6주차 DNS, Apache, Nginx, SSL 수업정리 (0) | 2026.03.13 |