Study/Network

[Network]Suricata 구축 및 파일 추출(File extraction)

seomj 2024. 9. 3. 22:00

Suricata

고성능 오픈소스 네트워크 분석 및 위협 탐지 소프트웨어

  • TLS/SSL 로깅 및 분석, HTTP 로깅, DNS 로깅
  • IDS/IPS
    • 알려진 위협, 정책 위반 및 악의적 행동에 일치시키기 위해 완전한 서명 언어를 구현
    • 특수 Emerging Threats Suricata 규칙 세트와 VRT 규칙 세트를 사용
  • 고성능
    • 멀티 스레드
    • 멀티 기가비트 트래픽을 검사
  • 자동 프로토콜 감지
    • 모든 포트에서 HTTP와 같은 프로토콜을 자동으로 감지하고 적절한 감지 및 로깅 로직을 적용
  • Lua 스크립팅
    • 규칙 집합 구문으로는 불가능한 것을 감지하기 위한 고급 분석 및 기능이 제공
  • 산업 표준 출력
    • 모든 JSON 이벤트 및 알림 출력

 

File extraction

파일 추출 코드는 선택한 프로토콜 파서 위에서 작동한다. 

즉, 네트워크 패킷의 내용을 해석하는 프로그램인 파서 위에서 네트워크 트래픽에서 파일을 추출하는 프로그램 코드가 돌아간다.

 

애플리케이션 계층 파서는 스트림 재조립 엔진과 UDP 흐름 추적 위에서 작동한다. 

스트림 재조립 엔진에서 네트워크를 통해 전송된 데이터 스트림을 올바르게 조합하는 기능을 제공한다.

 

HTTP의 경우, 파서는 요청 및 응답 데이터가 필요한 경우 청크를 분해하고 압축을 해제하는 작업을 처리한다.

데이터를 정확하게 사용하기 위해 청크를 분해하여 원래의 데이터로 조합하고 압축을 해제하여 원본 데이터 형태로 복원한다.

 

규칙 언어를 기반으로 동작한다.

규칙 언어는 파일 추출의 규칙을 설정하는 언어로

어떤 파일을 추출할지, 어떻게 추출할지에 대한 규칙을 제시한다.

 

지원 프로토콜 목록

  • HTTP
  • SMTP
  • FTP
  • NFS
  • SMB
  • HTTP2

 

Suricata 설치

Version

OS: Ubuntu 20.04

Suricata: 6.0.20

 

인터넷이 가능하고 쉽게 설치하고자 하면 PPA 방식으로 다운로드하는 것을 추천

Ubuntu from Personal Package Archives (PPA)

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata

 

PPA는 소프트웨어의 최신 버전을 제공하거나 특정 소프트웨어를 쉽게 설치할 수 있게 도와주는 리포지토리이다.

새로운 PPA를 추가하거나 관리하는 데 필요한 software-properties-common을 설치한다.

 

osif/suricata-stable라는 이름의 ppa를 추가한다. 

즉, suricata의 최신 안정 버전을 설치할 수 있는 소스가 추가된다. 

 

그러나,

본인의 경우 소스코드 파일로 설치를 진행했다.

sudo apt update 

sudo apt -y install autoconf automake build-essential cargo \
    cbindgen libjansson-dev libpcap-dev libpcre2-dev libtool \
    libyaml-dev make pkg-config rustc zlib1g-dev

tar xzvf suricata-6.0.20.tar.gz
cd suricata-6.0.20

sudo apt install libpcre3-dev libhtp2 libnss3-dev libnss3-tools

./configure
make

 

libpcre3-dev를 비롯하여 총 4가지 패키지를 따로 설치한 이유는 설치과정에 오류가 있었기에 추후 설치하여 해결했다.

 

참고로 말하자면,

libpcre3-dev, libhtp2의 경우는 make 진행 시 오류 발생했고

libnss3-dev, libnss3-tools의 경우는 file extraction을 진행하며 file-store 모듈 관련 오류가 발생했다.

 

make 진행 후 make install을 진행해야 한다. 

다음과 같은 옵션을 제시한다.

# 자동으로 suricata.yaml으로 필요한 모든 디렉토리를 생성/설정
make install-conf

# suricata에서 사용할 수 있는 emerging threats 최신 규칙 세트를 자동으로 다운로드
make install-rules

# 위 2가지를 모두 진행
make install-full

 

본인의 경우 최신 규칙 세트가 필요하지 않아 아래와 같이 진행했다.

$ sudo make install-conf
install -d "/usr/local/etc/suricata/"
install -d "/usr/local/var/log/suricata/files"
install -d "/usr/local/var/log/suricata/certs"
install -d "/usr/local/var/run/"
install -m 770 -d "/usr/local/var/run/suricata"
install -m 770 -d "/usr/local/var/lib/suricata/data"

 

 

Suricata 설정

구조

 

IPS 모드

위에서 설명한 것과 같은 구조를 만들기 위해서는 suricata를 ips 모드로 진행할 필요가 있다.

vi /usr/local/etc/suricata/suricata.yaml

af-packet:
  - interface: <out interface>
    threads: auto
    defrag: yes
    cluster-type: cluster_flow
    cluster-id: 98
    copy-mode: ips
    copy-iface: <in interface>
    buffer-size: 64535
    use-mmap: yes
  - interface: <in interface>
    threads: auto
    defrag: yes
    cluster-type: cluster_flow
    cluster-id: 97
    copy-mode: ips
    copy-iface: <out interface>
    buffer-size: 64535
    use-mmap: yes
  • threads: 애플리케이션이 패킷을 수신하는 데 사용해야 하는 스레드 수
    • auto: 사용 가능한 CPU 코어 수와 동일한 수의 스레드를 자동으로 사용
  • defrag: 커널이 패킷을 캡처하기 전에 패킷 조각 모음을 수행하도록 지시
  • cluster-type: 다양한 스레드에 어떻게 분산되는지 정의
    • cluster_flow: 동일한 흐름의 패킷은 항상 동일한 스레드에 의해 처리
    • cluster_cpu: 동일한 cpu에서 처리되는 패킷은 동일한 스레드로 전송
    • cluster_qm: 네트워크 카드의 동일한 RSS 대기열에 연관된 패킷은 동일한 스레드로 전송
    • cluest_ebpf: 사용자 정의 부하 분산을 위해 eBPF를 사용
  • copy-mode: 지정된 인터페이스에서 트래픽을 수신할 때 패킷 복사의 동작을 결정
    • ips: ‘copy-iface’로 지정된 다른 인터페이스로 복사
      • drop 규칙에 일치하는 경우, 복사되지 않음
    • tap: drop과 관련없이 모두 복사
  • copy-iface: 트래픽이 복사될 네트워크 인터페이스를 지정
  • use-mmap: 애플리케이션이 패킷 캡처에 메모리 맵 I/O를 사용
    • 패킷 캡처에 필요한 시스템 호출 수가 줄어들어 성능이 향상될 수 있음

 

옵션 설정

vi /usr/local/etc/suricata/suricata.yaml

HOME_NET: "[IP 주소 입력]"
EXTERNAL_NET: "!$HOME_NET"
  • HOME_NET에는 IP 대역대에 맞는 IP 입력
    • Ex. 192.168.0.127 IP를 가지고 있기에 192.168.0.1/24 대역을 설정

 

output 설정

vi /usr/local/etc/suricata/suricata.yaml

  - file-store:
      version: 2
      enabled: yes
      dir: filestore
      write-fileinfo: yes
      force-filestore: yes
      stream-depth: 0
      max-open-files: 1000
      force-hash: [sha1, md5]
  • dir: 파일이 저장될 디렉토리 지정
  • write-fileinfo: fileinfo 레코드를 작성, 메타데이터
  • force-filestore: 모든 파일을 저장하도록 강제
  • stream-depth: 저장할 파일 스트림의 깊이를 설정
  • max-open-files: 파일 저장소 목적으로 동시에 열 수 있는 파일의 수를 정의
  • force-hash: 파일에 대해 해시 값을 강제로 기록
    • sha256은 파일 이름을 생성하는 데 자동으로 사용

 

규칙 설정

vi /usr/local/etc/suricata/suricata.yaml

rule-files:
  - suricata.rules
  - [파일명]

 

본인의 경우 suricata.rules는 사용하지 않아 주석처리 했다.

 

규칙 생성

alert http any any -> $HOME_NET any (msg:"FILE store all"; filestore; sid:1001; rev:1;)
alert ftp-data any any -> $HOME_NET any (msg:"FTP store"; filestore; sid:1002; rev:1;)

 

client 설정

클라이언트에서 나가는 패킷이 모두 suricata를 거치도록 구성하기 위해

클라이언트의 Gateway를 suricata IP로 route 한다.

 

테스트

suricata -T -c suricata.yaml

위 명령어로 제대로 작성되었는지 확인이 가능하다.

 

suricata를 실행하자.

sudo suricata -c /etc/suricata/suricata.yaml --af-packet

 

새로운 터미널 창에서 로그를 확인하자.

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

 

 

추출된 파일도 확인 가능하다. 

본인의 경우 tree를 이용해 더 편리하게 이용했다.

 

 

 

참고

https://suricata.io/

https://docs.suricata.io/en/latest/file-extraction/file-extraction.html

https://docs.suricata.io/en/suricata-6.0.20/setting-up-ipsinline-for-linux.html#settings-up-ips-at-layer-2