SIEM · 보안관제 › A. SIEM 구조와 로그 수집 · 36/50편
학습 단계: 저장·파이프라인
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Wazuh 4.x 올인원 / Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
Wazuh 디코더를 거치지 않는 로그(예: 다른 수집 경로의 장비 로그)를 ELK에 넣을 때는 Logstash 필터가 디코더 역할을 합니다. 가장 자주 쓰는 것은 grok(분해), mutate(이름·타입 정리), date(시각 지정) 세 가지입니다.
필터 예(가상의 장비 로그)
원본: 2026-10-09 10:40:01 fw01 DENY src=203.0.113.5 dst=192.168.56.21 dport=22
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_ts} %{HOSTNAME:host_name} %{WORD:action} src=%{IP:src_ip} dst=%{IP:dst_ip} dport=%{INT:dst_port}" }
}
mutate {
rename => { "src_ip" => "[source][ip]" "dst_ip" => "[destination][ip]" }
convert => { "dst_port" => "integer" }
lowercase => [ "action" ]
}
date { match => [ "log_ts", "yyyy-MM-dd HH:mm:ss" ] timezone => "Asia/Seoul" }
}
핵심: grok=분해, mutate=정규화(026편), date=시간 정규화(027편)
date 필터를 쓰지 않으면 @timestamp가 Logstash가 받은 시각으로 기록되어, 지연이 생기면 타임라인이 어긋납니다.
| 필터 | 역할 | 실패 표시 |
|---|---|---|
| grok | 패턴 분해 | _grokparsefailure |
| mutate | rename·convert·lowercase | (타입 변환 오류 로그) |
| date | @timestamp 지정 | _dateparsefailure |
| translate | 값 매핑(보강) | 매칭 없음 → 기본값 |
# grok·date 실패 비율 확인 (실습 예시, Elasticsearch)
curl -sk -u 'elastic:<비밀번호>' "https://es01:9200/fw-*/_count?q=tags:_grokparsefailure"
curl -sk -u 'elastic:<비밀번호>' "https://es01:9200/fw-*/_count?q=tags:_dateparsefailure"
curl -sk -u 'elastic:<비밀번호>' "https://es01:9200/fw-*/_count"
# 파이프라인 문법 검사
sudo /usr/share/logstash/bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/fw.conf
_grokparsefailure: 3 / 전체 900,120 (0.0003%)
_dateparsefailure: 0
Configuration OK
실패 태그 비율이 매우 낮고 문법 검사를 통과하면 필터가 정상입니다.
_grokparsefailure: 212,400 / 전체 900,120 (23.6%)
실패 샘플: "... DENY src=203.0.113.5 dst=192.168.56.21 proto=udp dport=53"
필터 실패 대응 흐름입니다(가상의 예시).
[실패 태그 집계] 소스별 비율
↓
[샘플 추출] 실패 이벤트 message 10건
↓
[패턴 비교] 기존 grok vs 새 형식
↓
[수정] 선택 그룹·여러 match·kv 필터
↓
[검증] config.test_and_exit → 샘플 재처리 → 비율 재측정
| 해결책 | 적합한 경우 |
|---|---|
| 선택 그룹 (?: ...)? | 필드 일부 선택적 |
| 여러 match | 형식이 여러 종 |
| kv 필터 | key=value 나열형 |
key=value가 나열되는 로그는 grok보다 kv 필터가 형식 변화에 훨씬 강합니다. 새 필드가 추가되어도 자동으로 필드가 생깁니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,siem_a,">
<rule id="110350" level="8">
<decoded_as>json</decoded_as>
<field name="check">^parse_quality$</field>
<field name="grok_fail_pct" type="pcre2">^([5-9]|[1-9][0-9])(\.\d+)?$</field>
<description>Logstash grok 실패율 5% 이상(파싱 품질 저하)</description>
</rule>
</group>
ELK 쪽 실패 비율을 주기적으로 계산해 Wazuh로 보내 경보하는 예시입니다. 서로 다른 파이프라인의 품질도 한 관제 화면에서 볼 수 있게 됩니다.
| 필터 | 역할 |
|---|---|
| grok | 분해 |
| mutate | 정규화 |
| date | 시각 지정 |
| 감시 | 실패 태그 비율 |
| 면접 포인트 | "grok은 디코더, mutate는 정규화, date는 타임라인 — 실패 태그 비율이 품질 지표" |
다음 편 037. SIEM·로그 수집 — 수집 파이프라인 장애와 백프레셔 에서는 에이전트 버퍼 포화·analysisd 큐 드롭·인덱서 쓰기 차단처럼 처리량이 밀릴 때 생기는 백프레셔 현상과 단계별 지표를 다룹니다.
이전 편: 035. SIEM·로그 수집 — Filebeat·Logstash 파이프라인 구성 — ELK 연계
📚 시리즈 전체 보기: SIEM · 보안관제