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




or


8. Kibana 대시보드 구성 (핵심)
이제 보안 관점에서 바로 보는 화면을 만든다.
Dashboard 생성 시작
- Kibana 왼쪽 메뉴에서 Analytics > Dashboard
- Create dashboard 버튼을 클릭.
- 새로운 화면이 뜨면 Create visualization 버튼을 클릭. (여기서부터 본격적인 작업이 시작.)



8.1 Alert vs Drop (도넛 차트)
- Visualization: Pie / Donut
- Aggregation:
- Terms:
suricata_action
- Terms:
- 결과:
- allowed (alert)
- blocked (drop)
→ IPS가 실제로 차단한 비율을 한 눈에 확인
아래 그림 순서대로 작성 :
- 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 확인‘
작성 순서 :
- 다시 Creation Visualization을 클릭 하도록 한다.
- Bar 를 선택
- src_ip.keyword 를 Horizontal axis로 drag 추가
- Records를 Vertical axis로 drag 추가
- Save and return
8.3 Rule Hit Ranking
- Visualization: Data Table or Bar
- Terms:
rule_sid등 - Metric: Records
→ 어떤 공격 유형이 가장 많이 발생했는지
작성 순서 :
- 다시 Creation Visualization을 클릭 하도록 한다.
- Table 선택
- rule_msg.keyword Rows로 drag 추가
- suricata_action.keyword Rows로 drag 추가
- @timestamp Rows로 drag 추가
- Recores를 Metrics으로 drag 추가
- 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]. 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.
답글 남기기
댓글을 달기 위해서는 로그인해야합니다.