036. SIEM·로그 수집 — Logstash 필터 — grok·mutate·date

changseop lee·7일 전

SIEM · 보안관제 › A. SIEM 구조와 로그 수집 · 36/50편
학습 단계: 저장·파이프라인
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Wazuh 4.x 올인원 / Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

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가 받은 시각으로 기록되어, 지연이 생기면 타임라인이 어긋납니다.

2. 왜 중요한가

  • 디코더 없는 로그를 검색 가능한 필드로 바꿉니다.
  • 필드 이름·타입을 공통 스키마로 맞출 수 있습니다.
  • 원본 시각을 정확히 반영해 타임라인 오류를 막습니다.

3. 핵심 명령어 / 설정

필터역할실패 표시
grok패턴 분해_grokparsefailure
mutaterename·convert·lowercase(타입 변환 오류 로그)
date@timestamp 지정_dateparsefailure
translate값 매핑(보강)매칭 없음 → 기본값

4. 실습 (실습 예시)

# 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

5. 정상 상태

_grokparsefailure: 3 / 전체 900,120 (0.0003%)
_dateparsefailure: 0
Configuration OK

실패 태그 비율이 매우 낮고 문법 검사를 통과하면 필터가 정상입니다.

6. 이상 상태

_grokparsefailure: 212,400 / 전체 900,120 (23.6%)
실패 샘플: "... DENY src=203.0.113.5 dst=192.168.56.21 proto=udp dport=53"
  • 펌웨어 업데이트로 proto 필드 추가 → 기존 패턴 불일치
  • 23% 이벤트가 필드 없이 저장 → 출발지 검색·집계 누락
  • 선택 필드를 허용하는 패턴(또는 kv 필터)으로 보완 필요

7. 로그 분석 (분석 방법)

필터 실패 대응 흐름입니다(가상의 예시).

[실패 태그 집계] 소스별 비율
   ↓
[샘플 추출] 실패 이벤트 message 10건
   ↓
[패턴 비교] 기존 grok vs 새 형식
   ↓
[수정] 선택 그룹·여러 match·kv 필터
   ↓
[검증] config.test_and_exit → 샘플 재처리 → 비율 재측정
해결책적합한 경우
선택 그룹 (?: ...)?필드 일부 선택적
여러 match형식이 여러 종
kv 필터key=value 나열형

key=value가 나열되는 로그는 grok보다 kv 필터가 형식 변화에 훨씬 강합니다. 새 필드가 추가되어도 자동으로 필드가 생깁니다.

8. SOC 관제 포인트

  • 실패 태그 비율을 로그 품질 지표(030편)에 포함합니다.
  • 장비 펌웨어·앱 업데이트 후 필터 실패율을 확인합니다.
  • 필터 설정을 저장소에서 버전 관리합니다.

9. 탐지 규칙

<!-- 실습 예시 룰: 적용 전 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로 보내 경보하는 예시입니다. 서로 다른 파이프라인의 품질도 한 관제 화면에서 볼 수 있게 됩니다.

10. 대응 방법

  1. 초기 확인 — 실패 태그 비율과 대상 소스를 확인합니다.
  2. 범위 확인 — 실패 샘플과 형식 변경 시점을 확인합니다.
  3. 증거 확보 — 샘플과 필터 설정 버전을 보존합니다.
  4. 차단/조치 — 패턴을 수정하고 문법 검사 후 재적용합니다.
  5. 재발 방지 — 업데이트 후 필터 검증 절차를 운영합니다.

11. 핵심 정리

필터역할
grok분해
mutate정규화
date시각 지정
감시실패 태그 비율
면접 포인트"grok은 디코더, mutate는 정규화, date는 타임라인 — 실패 태그 비율이 품질 지표"

12. 다음 편 예고

다음 편 037. SIEM·로그 수집 — 수집 파이프라인 장애와 백프레셔 에서는 에이전트 버퍼 포화·analysisd 큐 드롭·인덱서 쓰기 차단처럼 처리량이 밀릴 때 생기는 백프레셔 현상과 단계별 지표를 다룹니다.


이전 편: 035. SIEM·로그 수집 — Filebeat·Logstash 파이프라인 구성 — ELK 연계
📚 시리즈 전체 보기: SIEM · 보안관제

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글