코딩두의 포트폴리오

Suricata 전체적인 개발 목표 본문

Suricata

Suricata 전체적인 개발 목표

코딩두 2024. 11. 19. 20:41

1. 프로젝트 초기 설정

1-1. 요구사항 정의

  • 수리카타의 탐지 기능을 활용해 C로 만든 프로그램에서 수행해야 할 주요 기능
    1. 패킷 읽기: 네트워크 인터페이스에서 실시간 패킷 캡처
    2. 탐지 규칙 로드: 수리카타 규칙을 메모리에 로드
    3. 탐지 기능 수행: 패킷과 규칙을 비교해 탐지 여부 확인
    4. 결과 처리: 탐지된 결과를 로그로 저장하거나 알림 출력
    5. 데몬 동작: 프로그램이 백그라운드에서 실행

1-2. 개발 환경 구성

  • 필요 도구:
    1. C 컴파일러: gcc 또는 clang
    2. 패킷 캡처 라이브러리: libpcap (패킷 읽기)
    3. 수리카타 라이브러리: Suricata와 연동하여 탐지 기능 수행
    4. 빌드 도구: make 또는 cmake

환경 구축

sudo yum install gcc make libpcap libpcap-devel suricata suricata-devel

 

 

2. 설계 단계

2-1. 프로그램 구조 설계

  1. 모듈화된 기능 설계:
    • 패킷 캡처 모듈:
      • 네트워크 인터페이스(예: enp4s0)에서 실시간 패킷 캡처
      • libpcap 라이브러리 사용
    • 탐지 규칙 관리 모듈:
      • Suricata 규칙 파일 로드
      • 메모리에 규칙을 올리고 관리
    • 탐지 엔진 모듈:
      • 수리카타 엔진을 호출하여 패킷과 규칙을 비교
    • 로그 처리 모듈:
      • 탐지된 결과를 로그 파일 또는 콘솔에 출력
      • 선택적으로 DB 연동
    • 데몬 모듈:
      • 백그라운드 실행을 위한 데몬화

구조도 초안

+--------------------------+
|      Main Program        |
|                          |
|  +--------------------+  |
|  | Packet Capture     |  |
|  +--------------------+  |
|  +--------------------+  |
|  | Rule Management    |  |
|  +--------------------+  |
|  +--------------------+  |
|  | Detection Engine   |  |
|  +--------------------+  |
|  +--------------------+  |
|  | Logging/Alerting   |  |
|  +--------------------+  |
+--------------------------+

 

 

3. 구현 단계

3-1. 패킷 캡처 기능 개발

  • 목표: libpcap을 사용해 인터페이스에서 실시간으로 패킷을 캡처.
  • 기능 구현:
    • 네트워크 인터페이스에서 패킷을 읽고, 캡처된 데이터를 Suricata 모듈에 전달.
  • 코드 예시:
#include <pcap.h>

void capture_packets(const char *interface) {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle = pcap_open_live(interface, BUFSIZ, 1, 1000, errbuf);

    if (handle == NULL) {
        fprintf(stderr, "Couldn't open device %s: %s\n", interface, errbuf);
        return;
    }

    struct pcap_pkthdr header;
    const u_char *packet;
    while ((packet = pcap_next(handle, &header)) != NULL) {
        printf("Captured a packet with length of [%d]\n", header.len);
        // 이후 Suricata 모듈에 패킷 전달
    }

    pcap_close(handle);
}

3-2. 탐지 규칙 로드 기능 개발

  • 목표: Suricata의 탐지 규칙을 로드하고, 프로그램 내에서 적용.
  • 기능 구현:
    • 탐지 규칙 파일(.rules)을 읽고 메모리에 로드.
    • Suricata와의 API를 활용하여 규칙을 로드 및 관리.

3-3. 탐지 엔진과 Suricata 연동

  • 목표: Suricata 모듈에 패킷을 전달하고 탐지 결과를 반환받음.
  • 방법:
    1. Suricata 설정 파일(suricata.yaml)과 규칙을 활용.
    2. 패킷을 탐지 엔진에 전달.
    3. Suricata의 API를 통해 결과를 수신.
  • 코드 구조
    void detect_packets(const u_char *packet, int length) {
        // Suricata 엔진에 패킷 전달
        // 탐지 결과를 반환받아 처리
    }
 
  • void detect_packets(const u_char *packet, int length) { // Suricata 엔진에 패킷 전달 // 탐지 결과를 반환받아 처리 }

3-4. 로그 및 알림 처리 기능

  • 목표: 탐지 결과를 로그로 기록하거나 콘솔에 출력.
  • 기능 구현:
    • 탐지된 결과를 syslog 또는 파일 로그로 기록.
    • 경고 발생 시 알림 출력.

3-5. 데몬화

  • 목표: 프로그램이 백그라운드에서 동작하도록 설정.
  • 구현 방법:
    • 데몬화 작업(C 언어 POSIX 표준 사용).
    • SIGTERM 및 SIGKILL 신호 처리.

 

4. 테스트 및 검증 단계

4-1. 성능 테스트

  • 테스트 시나리오:
    1. 1 Gbps 및 10 Gbps 트래픽 환경에서 패킷 드롭률 측정.
    2. 탐지 속도 및 CPU 사용률 확인.
  • 테스트 도구:
    • Tcpreplay를 사용하여 트래픽 생성
sudo tcpreplay -i enp4s0 sample.pcap

 

5. 문서화 및 결과 분석

  • 문서화 항목:
    1. 프로그램 구조 설계도.
    2. 주요 함수 및 모듈 설명.
    3. 테스트 결과 및 성능 분석.
  • 결과 분석:
    • 탐지 규칙 정확도: 오탐/미탐 비율.
    • 성능 분석: CPU, 메모리 사용률 및 패킷 처리 속도.