네트워크

[네트워크]수리카타룰

seongw00 2026. 4. 1. 11:59

수리카타는 오픈소스 기반의 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 룰은 핵심적인 역할을 합니다.

  1. IDS(침입 탐지 시스템): 룰에 걸리는 트래픽이 있으면 관리자에게 알람을 보냅니다.
  2. IPS(침입 방지 시스템): drop 액션을 사용해 악성 트래픽을 실시간으로 차단합니다.
  3. 트래픽 가시성: 특정 룰을 통해 내부 망에서 외부로 나가는 수상한 통신을 잡아낼 수 있습니다.

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를 활용해 탐지 정확도와 처리 속도의 균형을 맞춰가는 과정은 엔지니어로서 매우 가치 있는 고민이었습니다. 앞으로 제가 운영할 서버 환경에서도 '보안'과 '성능'이라는 두 마리 토끼를 잡는 엔지니어가 되고 싶습니다.