수리카타는 오픈소스 기반의 IDS(침입 탐지 시스템), IPS(침입 방지 시스템) 및 NSM(네트워크 보안 모니터링) 엔진입니다. 수만 개의 규칙(Rule)을 기반으로 실시간 트래픽을 분석하며, 멀티스레딩을 지원하여 고속 네트워크 환경에서도 강력한 성능을 발휘합니다.
쉽게 비유하자면, 공항 입출국장에서 검사하는 '반입 금지 물품 리스트'라 할 수 있습니다. "가방 안에 반입 금지 물품이 있으면(조건) 경보(혹은 압수)를 해라(액션)"라고 적힌 지침서와 같습니다.
1. 룰의 기본 구조
수리카타 룰은 한 줄의 긴 문장으로 구성되며, 크게 액션(Action) 헤더(Header)와 옵션(Options)으로 나뉩니다.
Action | Header | Options
예시: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"GET 탐지"; content:"GET"; sid:1000001;)
- Action (액션): 매칭됐을 때 할 일 (예: alert 경고, drop 차단, pass 통과)
- Header (헤더): 대상 설정 (프로토콜, IP 주소, 포트 번호, 방향 등)
- Options (옵션): 구체적인 탐지 내용 (로그 메시지, 특정 문자열(content), 룰 ID(sid) 등)

① 액션(Action): “어떤 행동을 할 것인가?”
가장 먼저 나오는 Action은 조건이 일치했을 때 수리카타가 취해야 할 행동을 정의합니다. 단순히 '막는다'를 넘어 상황에 맞는 선택이 필요합니다.
| Action | 설명 | 주요 용도 |
| alert | 로그를 남기고 알람을 생성합니다. | IDS 모드의 기본 액션. 패킷은 그대로 통과됩니다. |
| drop | 패킷을 즉시 차단하고 로그를 남깁니다. | IPS 모드에서 공격을 실시간으로 방어할 때 사용합니다. |
| pass | 해당 패킷을 검사하지 않고 통과시킵니다. | 신뢰하는 IP나 특정 트래픽을 검사 대상에서 제외(화이트리스트)할 때 유용합니다. |
| reject | 패킷을 차단한 후, 송신자에게 거절 메시지를 보냅니다. | TCP라면 RST 패킷을, UDP라면 ICMP Port Unreachable을 보내 연결을 강제 종료합니다. |
| rejectsrc | reject와 같지만, 패킷을 보낸 원본(Source) 쪽으로만 거절 메시지를 보냅니다. | 공격자에게 연결이 끊겼음을 명확히 알릴 때 사용합니다. |
| rejectdst | 패킷의 목적지(Destination) 쪽으로만 거절 메시지를 보냅니다. | 내부 사용자가 유해 사이트에 접속할 때 브라우저 연결을 끊는 용도로 쓰입니다. |
② 헤더(Header): "누가 어디로 가는가?"
- Action: 매칭 시 행동 (alert, drop, pass, reject)
- Protocol: 분석할 프로토콜 (tcp, udp, http, dns, tls 등)
- L4: tcp, udp, icmp
- L7: http, dns, tls, smb, nfs 등 (Suricata의 진정한 강점)
- IP & Port: 출발지와 목적지 정보를 정의합니다.
- 변수 사용 가능
- $HOME_NET: 보호 대상 내부 망.
- $EXTERNAL_NET: 외부 인터넷 망.
- 변수 사용 가능
- Direction: 트래픽의 방향을 지정합니다. (-> 단방향, <> 양방향)
③ 옵션(Options): "무엇을 찾는가?"
괄호 ( ) 안에 세미콜론으로 구분하여 상세 조건을 적습니다.
- msg: 로그에 출력될 설명입니다.
- content: 패킷 페이로드에서 찾을 특정 문자열이나 헥사(Hex) 값입니다.
sid / rev: 룰의 고유 ID와 수정 버전입니다.
2. 주요 특징
- 서명(Signature) 기반 탐지: 이미 알려진 공격 패턴(해킹 툴의 특이한 문자열, 비정상적인 패킷 구조 등)을 데이터베이스화하여 탐지합니다.
- 프로토콜 인식: 단순히 포트 번호만 보는 게 아니라 HTTP, DNS, TLS 등 실제 프로토콜의 내용을 깊이 있게 분석(Deep Packet Inspection)하여 룰을 적용합니다.
- 유연성: 사용자가 자신의 네트워크 환경에 맞춰 직접 룰을 작성하거나, Emerging Threats(ET) 같은 커뮤니티에서 배포하는 최신 룰셋을 가져와 사용할 수 있습니다.
3. 고급 옵션과 상태 제어
단순한 문자열 매칭은 오탐(False Positive)이 많습니다. 이를 해결하기 위한 핵심 기술들을 살펴보겠습니다.
✅ Flow 키워드: 세션의 맥락(Context) 인지
수리카타는 단순 패킷 분석기가 아니라 세션 추적기입니다.
- flow:established: TCP 3-way Handshake가 정상적으로 완료된 세션만 검사합니다. 비정상적인 스캔이나 스푸핑 패킷을 걸러낼 수 있습니다.
- flow:to_server / from_client: 클라이언트가 서버에 보낸 요청인지 확인합니다.
- flow:to_client / from_server: 서버가 클라이언트에 보내는 응답인지 확인합니다.
✅ Sticky Buffers: 성능 최적화
패킷의 전체 페이로드(payload)를 검색하는 것은 CPU 자원을 매우 많이 소모합니다. 특정 영역만 검사하여 효율을 극대화합니다.
- http.uri: GET/POST 요청의 경로만 검사.
- http.user_agent: 브라우저 정보만 검사.
- tls.sni: 암호화된 트래픽이라도 초기 핸드쉐이크 시의 도메인 주소(SNI)는 평문이므로 이를 탐지 가능.
✅ PCRE (정규표현식): 정교한 패턴 매칭
문자열 매칭(content)으로 한계가 있을 때 Perl 호환 정규표현식을 사용합니다.
- 예: pcre:"/[0-9]{4}-[0-9]{4}/"; (특정 패턴의 카드 번호나 학번 탐지 가능)
4. 왜 중요한가?
인프라 보안 및 모니터링 관점에서 Suricata 룰은 핵심적인 역할을 합니다.
- IDS(침입 탐지 시스템): 룰에 걸리는 트래픽이 있으면 관리자에게 알람을 보냅니다.
- IPS(침입 방지 시스템): drop 액션을 사용해 악성 트래픽을 실시간으로 차단합니다.
- 트래픽 가시성: 특정 룰을 통해 내부 망에서 외부로 나가는 수상한 통신을 잡아낼 수 있습니다.
5. Question
- Q. 수만 개의 룰이 있을 때 어떻게 CPU 부하를 줄일 것인가?
- 네트워크 패킷은 1초에도 수만 개가 쏟아집니다. 수리카타가 가진 룰이 3만 개라면, 패킷 하나하나를 3만 번 대조해야 할까? 그런 상황이 된다면 CPU가 버티지 못하고 패킷 유실(Drop)이 발생할 것입니다.
- A. 이러한 문제를 해결하는 마법이 바로 MPM 알고리즘입니다.
1) MPM(다중 패턴 매칭)이란?
단일 패턴 매칭(예: C언어의 strstr)이 "이 문장에 'admin'이 있나?"를 찾는 것이라면, MPM은 "이 문장에 우리가 가진 3만 개의 금지어 중 하나라도 있나?"를 단 한 번의 스캔으로 찾아내는 기술입니다.
2) 핵심 알고리즘: 아호-코라식 (Aho-Corasick)
수리카타가 기본적으로 사용하는 대표적인 MPM 알고리즘입니다.
- 원리: 모든 룰의 키워드(content)를 트리 구조(Trie)로 미리 엮어둡니다.
- 장점: 패킷의 데이터를 처음부터 끝까지 딱 한 번만 읽으면, 그 안에 포함된 수천 개의 패턴을 동시에 찾아낼 수 있습니다. 룰의 개수가 늘어나도 탐색 속도가 급격히 느려지지 않는 이유입니다.
3) 성능을 높이는 룰 설계 전략
단순히 알고리즘이 좋다고 끝이 아닙니다. 룰을 작성할 때 엔진이 더 빨리 일하게 만드는 최적화 기법이 필요합니다.
| 최적화 기법 | 설명 | 왜 성능이 좋아지는가? |
| Fast Pattern | 룰 내에서 가장 독특하고 긴 문자열을 지정 | MPM 단계에서 이 패턴이 없으면 나머지 복잡한 검사를 즉시 생략함 |
| Sticky Buffer | http.uri, http.host 등 위치 지정 | 패킷 전체(Payload)가 아닌 특정 영역만 스캔하여 데이터 읽기 범위 축소 |
| Flow Bit | 이전 패킷의 상태를 기억 | 이미 검증된 세션은 복잡한 검사를 건너뛰도록 논리 흐름 제어 |
4) 하드웨어 가속과 멀티스레딩
수리카타는 Snort와 달리 설계 단계부터 멀티스레딩(Multi-threading)을 지원합니다.
- CPU 친화성: 각 CPU 코어에 특정 네트워크 큐(Queue)를 할당하여 병렬 처리합니다.
- Hyperscan 활용: 인텔에서 개발한 고성능 정규표현식 매칭 라이브러리인 Hyperscan을 수리카타에 연동하면, 하드웨어 레벨에서 가속되어 성능이 비약적으로 향상됩니다.
6. 마치며
수리카타 룰을 공부하며 느낀 점은, 단순히 보안 도구를 '설치'하는 것보다 내 인프라 환경에 맞춰 '최적화'하는 능력이 훨씬 중요하다는 것입니다. 수만 개의 룰 사이에서 서비스 지연을 최소화하기 위해 MPM 알고리즘을 이해하고, Sticky Buffer를 활용해 탐지 정확도와 처리 속도의 균형을 맞춰가는 과정은 엔지니어로서 매우 가치 있는 고민이었습니다. 앞으로 제가 운영할 서버 환경에서도 '보안'과 '성능'이라는 두 마리 토끼를 잡는 엔지니어가 되고 싶습니다.
'네트워크' 카테고리의 다른 글
| [네트워크]Wi-Fi 7의 핵심 기술 정리: 차세대 무선 통신 표준 (0) | 2026.04.15 |
|---|---|
| [네트워크]ECMP(Equal-Cost Multi-Path)의 원리와 부하 분산 알고리즘 (0) | 2026.04.06 |
| [네트워크]QUIC 프로토콜 (1) | 2026.03.16 |
| [네트워크]CloudFront(CDN)에 대해서 (0) | 2026.03.16 |
| [네트워크] OSI L2/L3/L4/L7 계층별 핵심과 통신흐름 (1) | 2026.03.15 |