Suricata NAT Instance 기반 IPS/IDS 실습 랩 구축 (6편) :Suricata ELK 연동 실전 가이드 – Logstash 필터링과 Kibana로 시각화 하기

1. 이번 편의 위치와 목표

이 시리즈에서의 위치

  • 1~4편: Suricata NAT Instance 기반 IPS 구성 / alert & drop 확인
  • 5편: NAT Instance 단일 노드 ELK 설치
  • 6편 (이번 편):
    • Suricata 로그를 ELK로 제대로 흘려보내고
    • 쓸모 있는 필드만 추출
    • 공격 관점에서 바로 보는 대시보드를 만든다
  • 7편: Suricata Rule 직접 작성 (시리즈 마무리)

이번 편에서 끝낼 것

  • Suricata eve.json → Logstash input
  • Logstash filter:
    • alert / drop 구분
    • rule.sid / msg / src_ip / dest_ip 정리
  • Elasticsearch 인덱스 설계
  • Kibana 대시보드:
    • Alert vs Drop
    • Top Attacker IP
    • Rule Hit Ranking

2. 사전 준비 조건

이미 다음 상태라고 가정한다.

  • NAT Instance에서 Suricata 정상 동작
  • 공격 테스트용 웹 서버 존재
  • ELK(Stack)가 NAT Instance에 설치되어 있음
  • Suricata에서 eve.json 로그 생성 중

Suricata 설정 확인:

# grep -n "eve-log" /etc/suricata/suricata.yaml

기본 로그 위치:

/var/log/suricata/eve.json

3. 공격 패턴 준비 (로그를 만들기 위해)

이번 편에서는 아래 공격들이 이미 발생했다는 전제로 간다.

사용한 공격 예시

  • SQL Injection
  • XSS
  • Command Injection
  • 악성 User-Agent

가상 공격은 시리즈 4편을 참고하기 바란다.
중요한 건 Suricata가 alert / drop 로그를 남겼다는 것이다.


4. Logstash Input 구성 (Suricata eve.json)

4.1 Logstash 파이프라인 파일 생성

# vi /etc/logstash/conf.d/suricata.conf

4.2 input 설정

input {
  file {
    path => "/var/log/suricata/eve.json"
    start_position => "beginning"
    sincedb_path => "/var/lib/logstash/sincedb-suricata"
    codec => json
  }
}
  • file input으로 eve.json 직접 읽는다
  • json codec 사용 (Suricata eve.json은 JSON Line 형식)

5. Logstash Filter 설계 (핵심)
: /etc/logstash/conf.d/suricata.conf
에 아래 설정 추가


filter {
  # 0) alert / drop 만 남기고 나머지는 버림
  #    (dns/http/flow/stats 등도 안 쓸거면 여기서 컷)
  if !([event_type] in ["alert","drop"]) {
    drop { }
  }

  # 1) Suricata timestamp -> @timestamp (Kibana time field 용)
  if [timestamp] {
    date {
      match    => ["timestamp", "ISO8601"]
      target   => "@timestamp"
      timezone => "UTC"
    }
  }

  # 2) 액션 필드 정리
  #    alert 이벤트면 [alert][action]이 있을 가능성이 높고,
  #    drop 이벤트는 환경에 따라 없을 수 있으니 기본값 처리
  if [alert][action] {
    mutate { add_field => { "suricata_action" => "%{[alert][action]}" } }
  } else {
    mutate { add_field => { "suricata_action" => "%{[event_type]}" } }
  }

  # 3) 룰 필드 평탄화 (없을 경우 rename으로 하면 안전)
  mutate {
    rename => {
      "[alert][signature]"    => "rule_msg"
      "[alert][signature_id]" => "rule_sid"
    }
  }


  # 4) event_type을 남겨야 Alert vs Drop 구분 가능
  #    대시보드용 최소 필드만 남기기
  prune {
    whitelist_names => [
      "^@timestamp$",
      "^event_type$",
      "^suricata_action$",
      "^rule_sid$",
      "^rule_msg$",
      "^src_ip$",
      "^dest_ip$"
    ]
  }
}


6. Elasticsearch Output & 인덱스 설계

6.1 Output 설정 : /etc/logstash/conf.d/suricata.conf 에 추가

output {
  elasticsearch {
    hosts => ["https://localhost:9200"]
    index => "suricata-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "ELASTIC_PASSWORD"      -> 실제 비밀번호 적용
    ssl => true
    ssl_certificate_verification => false
  }
}

6.2 인덱스 설계 이유

  • 일자 인덱스 (suricata-YYYY.MM.dd)
  • 실습 환경에서는 shard/replica 기본값 그대로 사용
  • 운영 환경이면 ILM로 넘기는 게 정석

6.3 Logstash 재기동

# systemctl restart logstash

확인:

# journalctl -u logstash -f

7. Kibana Data View 생성

  1. Kibana 접속
  2. Explore on my own 클릭
  3. 브라우저에서 가상 공격으로 로그 미리 남기기 :
    http://<NAT_Public_IP>/cmd.php?cmd=cat%20/etc/passwd
  4. Stack Management → Data Views -> create data view or
    create a data view against hidden…
  5. Name : suricata-*
  6. Index pattern: suricata-*
  7. Timestamp field: @timestamp
  8. Save data view to Kibana

or


8. Kibana 대시보드 구성 (핵심)

이제 보안 관점에서 바로 보는 화면을 만든다.

Dashboard 생성 시작

  1. Kibana 왼쪽 메뉴에서 Analytics > Dashboard
  2. Create dashboard 버튼을 클릭.
  3. 새로운 화면이 뜨면 Create visualization 버튼을 클릭. (여기서부터 본격적인 작업이 시작.)

8.1 Alert vs Drop (도넛 차트)

  • Visualization: Pie / Donut
  • Aggregation:
    • Terms: suricata_action
  • 결과:
    • allowed (alert)
    • blocked (drop)

IPS가 실제로 차단한 비율을 한 눈에 확인

아래 그림 순서대로 작성 :

  1. pie 선택 및 suricata_action.keyword -> slice by 로 drag 추가.

2. Records -> Metric 으로 drag 추가

3. 도넛 차트로 변경후 save


8.2 Top Attacker IP

  • Visualization: Vertical Bar
  • X-axis: Terms → src_ip
  • Y-axis: Records
  • Size: Top 5

가장 많이 공격 시도한 IP 확인

작성 순서 :

  1. 다시 Creation Visualization을 클릭 하도록 한다.
  2. Bar 를 선택
  3. src_ip.keyword 를 Horizontal axis로 drag 추가
  4. Records를 Vertical axis로 drag 추가
  5. Save and return

8.3 Rule Hit Ranking

  • Visualization: Data Table or Bar
  • Terms: rule_sid
  • Metric: Records

어떤 공격 유형이 가장 많이 발생했는지

작성 순서 :

  1. 다시 Creation Visualization을 클릭 하도록 한다.
  2. Table 선택
  3. rule_msg.keyword Rows로 drag 추가
  4. suricata_action.keyword Rows로 drag 추가
  5. @timestamp Rows로 drag 추가
  6. Recores를 Metrics으로 drag 추가
  7. Save and return

참고 해야 할 점 :

  • Rows 영역에서 @timestamp 버튼을 클릭해서 Include empty rows 스위치 끄기 (가장 중요)
    이미지 중간에 파란색으로 활성화된 **Include empty rows**를 클릭하여 비활성화(Off)
    이유: 이 옵션이 켜져 있으면, 데이터가 발생하지 않은 시간대(Bucket)에도 행(Row)을 강제로 생성. 이 때문에 공격을 한 번만 했어도 모든 시간대에 로그가 있는 것처럼 리스트가 만들어짐.
    Minimum interval : second 단위로 수정
  • Lens 테이블에서 개별 행을 다 보고 싶다면 Rows 영역에서 해당 필드들을 클릭해서
    Number of values를 100이상 넉넉히 잡아야 한다
  • 출발지 / 목적지 IP 등 더 많은 필드를 전략적으로 배치할수록 위협 탐지의 정밀도와 대응 속도는 비약적으로 향상.

작성된 dashboard :


9. 이 구조의 핵심 포인트

  • Suricata 로그를 원본 그대로 보지 않는다
  • Logstash에서 보안 관점 필드만 남긴다
  • Kibana는 “예쁜 대시보드”가 아니라
    • 차단이 되고 있는지
    • 누가 공격하는지
    • 어떤 공격 유형이 많은지를 바로 보게 만든다

10. 다음 7편 예고 (시리즈 마지막)

(Series 7편) Suricata Rule 직접 만드는 방법

  • 기본 Rule 문법
  • HTTP / URI / Header 기반 룰
  • alert → drop 전환 전략
  • 실습용 커스텀 룰 작성
  • ELK에서 룰 효과 검증

“탐지 → 차단 → 시각화 → 룰 개선” 루프 완성

🛠 마지막 수정일: 2025.12.23

ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. 본문 및 이미지를 무단 복제·배포할 수 없습니다. 공유 시 반드시 원문 링크를 명시해 주세요.
ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. All rights reserved. Unauthorized copying or redistribution of the text and images is prohibited. When sharing, please include the original source link.

💡 도움이 필요하신가요?
Zabbix, Kubernetes, 그리고 다양한 오픈소스 인프라 환경에 대한 구축, 운영, 최적화, 장애 분석, 광고 및 협업 제안이 필요하다면 언제든 편하게 연락 주세요.

📧 Contact: jikimy75@gmail.com
💼 Service: 구축 대행 | 성능 튜닝 | 장애 분석 컨설팅

📖 E-BooK [PDF] 전자책 (Gumroad): Zabbix 엔터프라이즈 최적화 핸드북
블로그에서 다룬 Zabbix 관련 글들을 기반으로 실무 중심의 지침서로 재구성했습니다. 운영 환경에서 바로 적용할 수 있는 최적화·트러블슈팅 노하우까지 모두 포함되어 있습니다.


💡 Need Professional Support?
If you need deployment, optimization, or troubleshooting support for Zabbix, Kubernetes, or any other open-source infrastructure in your production environment, or if you are interested in sponsorships, ads, or technical collaboration, feel free to contact me anytime.

📧 Email: jikimy75@gmail.com
💼 Services: Deployment Support | Performance Tuning | Incident Analysis Consulting

📖 PDF eBook (Gumroad): Zabbix Enterprise Optimization Handbook
A single, production-ready PDF that compiles my in-depth Zabbix and Kubernetes monitoring guides.