SIEM · 보안관제 › A. SIEM 구조와 로그 수집 · 42/50편
학습 단계: 검색·대시보드·운영
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Wazuh 4.x 올인원 / Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
Alert가 수천 건이면 하나씩 읽을 수 없습니다. 집계(aggregation)로 "가장 많은 출발지", "시간대별 추이", "서로 다른 대상 수"를 먼저 보고, 이상한 부분만 Discover로 내려가 확인합니다.
조사 질의 흐름(넓게 → 좁게)
① 추이 : 시간대별 건수(date_histogram) → 급증 구간 찾기
② Top N : 급증 구간의 출발지·호스트·룰 상위
③ 고유값 : 출발지별 서로 다른 대상 계정 수(cardinality)
→ 많으면 spraying, 적으면 brute-force
④ 원문 : 의심 출발지의 이벤트 원문(Discover)
예) 인증 실패 급증
10:00~10:10 평소 30건 → 2,400건
Top 출발지: 203.0.113.5 (2,310건)
203.0.113.5의 대상 계정 수: 418개 → password spraying 패턴
핵심: 집계로 패턴을 보고, 원문으로 확인한다
집계는 keyword·ip·숫자 타입 필드에서만 동작합니다(032편). 집계가 안 되는 필드가 있으면 매핑부터 확인합니다.
| 집계 | 질문 | 예시 해석 |
|---|---|---|
| date_histogram | 언제 급증했나 | 공격 시작 시각 |
| terms(Top N) | 누가·어디가 많은가 | 주요 출발지 |
| cardinality | 몇 종류인가 | 대상 계정 수 |
| sum/avg | 얼마나 큰가 | 전송량 |
# 출발지별 대상 계정 수 집계 (실습 예시, API)
AUTH='admin:<비밀번호>'
curl -sk -u "$AUTH" -H 'Content-Type: application/json' "https://localhost:9200/wazuh-alerts-*/_search?size=0" -d '{
"query": { "bool": { "filter": [
{ "term": { "rule.groups": "authentication_failed" } },
{ "range": { "timestamp": { "gte": "now-1h" } } } ] } },
"aggs": { "by_src": { "terms": { "field": "data.srcip", "size": 5 },
"aggs": { "users": { "cardinality": { "field": "data.dstuser" } } } } } }' \
| grep -E '"key"|"doc_count"|"value"'
key 192.168.56.5 doc_count 6 users 2 (관리자 오타)
출발지별 실패 건수와 대상 계정 수가 작고 내부 관리망으로 설명되면 정상입니다.
key 203.0.113.5 doc_count 2310 users 418
key 198.51.100.9 doc_count 640 users 1 (root)
집계 기반 조사 흐름입니다(가상의 예시).
[추이] 1시간·10분 단위 건수 → 급증 구간
↓
[Top N] 급증 구간 출발지·호스트·룰
↓
[고유값] 출발지별 대상 계정·포트 수
↓
[유형 판단] spraying / brute-force / 스캔
↓
[원문 확인] 성공 이벤트 존재 여부(돌파 판단)
| 패턴 | 해석 |
|---|---|
| 건수↑ 계정 다수 | spraying |
| 건수↑ 계정 1 | brute-force |
| 포트 다수 | 스캔 |
마지막 단계에서 반드시 같은 출발지의 "성공" 이벤트를 찾아야 합니다. 실패 패턴이 아무리 커도 성공이 없으면 시도, 있으면 침투로 판단이 달라집니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,siem_a,">
<rule id="110410" level="12" frequency="20" timeframe="600">
<if_matched_group>authentication_failed</if_matched_group>
<same_source_ip />
<different_field>dstuser</different_field>
<description>동일 출발지 10분 내 서로 다른 계정 20개 이상 인증 실패(password spraying)</description>
<mitre><id>T1110.003</id></mitre>
</rule>
</group>
대시보드의 cardinality 집계로 발견한 패턴을 실시간 룰로 옮긴 예시입니다. 검색으로 찾은 패턴을 룰로 바꾸는 것이 탐지 개선의 기본 흐름입니다.
| 단계 | 집계 |
|---|---|
| 언제 | date_histogram |
| 누가 | terms |
| 몇 종류 | cardinality |
| 확인 | 원문·성공 여부 |
| 면접 포인트 | "집계로 패턴을 보고 원문으로 확인한다 — 마지막엔 반드시 성공 이벤트를 찾는다" |
다음 편 043. SIEM·로그 수집 — 시각화 구성 — 지표·추이·Top N 에서는 지표(Metric)·선 그래프·막대·표·지도 시각화를 목적에 맞게 고르는 기준과, 관제에 쓸모 있는 시각화와 보기 좋기만 한 시각화를 구분하는 방법을 다룹니다.
이전 편: 041. SIEM·로그 수집 — 대시보드 기초 — Discover와 검색 쿼리(DQL·KQL)
📚 시리즈 전체 보기: SIEM · 보안관제