
Microsoft Sentinel SIEM 로그 소스 분석기
"이 로그들에서 실제로 무엇을 얻고 있는가?" 또는 "Microsoft Sentinel에 권장되는 로그는 무엇인가?" 라는 질문을 셀 수 없이 많이 받아왔습니다. 답은 항상 많은 요소에 따라 달라지지만, 일반적인 기준을 제시할 수는 있습니다. 그래서 바로 여기 이 도구를 만들었습니다.
Log Horizon은 Microsoft Sentinel 작업 영역(선택적으로 Defender XDR 포함)에 연결하여, 수집 중인 모든 로그 테이블을 검토하고 보안 가치가 있는지 아니면 단순히 비용만 낭비하고 있는지 알려줍니다. 테이블을 분류하고, 탐지 규칙과 대조하여 점수를 매기며, 비용 절감 추정치와 함께 구체적인 권장 사항을 제공합니다.
중요: 이는 일반적인 접근 방식입니다. 특정 로그 소스가 환경에 중요하다는 것을 알고 있다면, 그 맥락이 항상 이 도구가 알려주는 내용보다 우선합니다. 분류는 출발점일 뿐, 절대적인 기준이 아닙니다.
더 읽어보시겠어요? 제 블로그에 Log Horizon에 관한 게시물이 있습니다:
| 기능 | 설명 |
|---|---|
| 분류 엔진 | 240개 이상의 커넥터, 22개 범주를 포함하는 481개 항목 지식 베이스, 수명 주기 상태(더 이상 사용되지 않음/레거시 및 대체 테이블 포함), 알 수 없는 테이블에 대한 자동 휴리스틱 대체 |
| 비용-가치 점수 | 테이블별 비용 등급 대 탐지 등급 매트릭스와 결합 평가(높은 가치~낮은 가치), 관찰된 플랜(Analytics, Basic, Data Lake)별 가격 책정 |
| 권장 사항 | 13가지 우선순위 조치 유형: 데이터 레이크 또는 Basic 후보, 탐지 제로 테이블, XDR 스트리밍 낭비, 수집 시 필터링, 분할 후보, 플랜 사용, 더 이상 사용되지 않는 소스, 보존 부족, XDR Checker 및 Detection Analyzer 결과(각각 비용 절감 추정치 포함) |
| 탐지 매핑 | 분석 규칙, 헌팅 쿼리 및 XDR 탐지를 각 테이블에 매핑하여 적용 범위 공백 식별 |
| 상관 관계 태그 | 규칙 설명에서 #DONT_CORR# / #INC_CORR# 태그를 감지하고 Defender 상관 관계에서 제외된 규칙 플래그 지정 |
| 보존 규정 준수 | 업계 표준 및 보안 모범 사례를 기반으로 권장 최소값과 실제 보존 기간 비교 |
| SOC 최적화 | Security Insights API에서 Microsoft 자체 SOC 개선 권장 사항 가져오기 |
| 키워드 격차 분석 | 공급업체/제품 키워드를 기반으로 수집해야 하지만 수집하지 않는 테이블 플래그 지정 |
| 변환 검색 | 작업 영역을 대상으로 하는 DCR(데이터 수집 규칙) 검색(대상으로 필터링된 구독 목록, 작업 영역 변환 DCR 및 작업 영역 연결), 인라인 및 다단계 변환 구문 분석, 모든 작업에 레이블 지정(필터, 프로젝션, 열 제거, 보강, 집계) |
| 분할 테이블 감지 | _SPLT_CL 분할 테이블 식별 및 분류 엔진의 상위 테이블에 연결 |
| 분할 KQL 생성기 | 큐레이팅된 지식 베이스, 실시간 규칙 분석 및 커뮤니티 필드 빈도 통계에서 포털 준비 분할 KQL 생성 -- Sentinel 분할 규칙 편집기에 바로 붙여넣을 수 있는 조건 전용 형식. 필드 목록은 테이블의 실시간 스키마와 교차되며, 존재하지 않는 항목은 누락으로 보고됨 |
| 탐지 분석기 | 인시던트 결과(자동 종료 비율, 오탐 비율 및 인시던트 볼륨 백분위수)를 사용하여 분석 규칙의 잠재적 노이즈 수준 점수화 |
| XDR Checker | XDR 중심 자문 계층 추가: XDR 관련 원격 분석에 대한 스트리밍 적용 범위 확인 및 1년 Data Lake 보존 지침 |
| 사용자 지정 분류 | 자체 JSON을 제공하여 기본 제공 분류 데이터베이스에 추가 또는 재정의 |
| 수집 캐시 | 수집된 작업 영역 데이터는 로컬에 캐시(기본 60분)되어 재실행 및 재내보내기가 몇 초 만에 완료됨. -NoCache로 옵트아웃 가능 |
| 소버린 클라우드 | ARM, Log Analytics 및 Graph 엔드포인트는 로그인한 Azure 환경(퍼블릭, US Government, China)을 따름 |
| 대화형 TUI | 메뉴, 색상 코드 테이블, 드릴다운, 보존 마법사 및 ASCII 아트가 포함된 Spectre.Console 대시보드 |
| 내보내기 | 팀과 공유하기 위한 JSON, Markdown 또는 정적 HTML 보고서 |
[!CAUTION] 고지 사항
이 도구는 AI의 도움으로 개발 및 유지 관리됩니다. 이 솔루션을 사용할 때는 주의를 기울이고, 프로덕션 환경에서 실행하기 전에 항상 실행 중인 내용을 이해하시기 바랍니다. 개발자는 취약점이나 문제에 대해 어떠한 책임도 지지 않습니다.
이 도구를 다운로드, 설치 또는 사용함으로써 귀하는 본 조건을 읽고 이해했으며 동의함을 인정합니다.
| 필요한 항목 | 버전 |
|---|---|
| PowerShell | 7.0+ |
| Az 모듈 | Az.Accounts |
| 기타 모듈 | PwshSpectreConsole 2.6.3+ |
| 선택 사항 | Microsoft.Graph.Authentication (로그인한 사용자로 -IncludeDefenderXDR 사용 시) |
엔드포인트는 현재 Connect-AzAccount 세션의 Azure 환경을 따르므로 Azure Government 및 Azure China 작업 영역은 추가 매개변수 없이 작동합니다. 사용 가능한 환경이 없으면 퍼블릭 클라우드 값이 사용됩니다.
Azure에 아직 로그인하지 않은 경우 모듈이 Connect-AzAccount를 자동으로 실행합니다. 이미 로그인되어 있다면 그대로 계속 진행됩니다.
권한: 작업 영역에 대한 Log Analytics Reader 및 Microsoft Sentinel Reader면 분석에 충분합니다. 변환 검색에는 구독 또는 리소스 그룹에 대한 Microsoft.Insights/dataCollectionRules/read(Monitoring Reader)도 필요합니다. 이 권한이 없으면 실행이 계속되고 누락된 권한을 명시하는 경고가 출력됩니다. -IncludeDefenderXDR은 CustomDetection.Read.All과 함께 Microsoft Graph를 사용하며, 로그인한 사용자의 경우 선택적 Microsoft.Graph.Authentication 모듈이 필요합니다.
아주 간단합니다:```powershell
Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser
git clone https://github.com/lnfernux/log-horizon Import-Module ./log-horizon/LogHorizon.psd1
## 사용 방법
### 기본 사항
먼저 Azure에 연결하고 올바른 계정과 구독을 선택했는지 확인하세요:```powershell
Connect-AzAccount
그런 다음 도구를 호출할 수 있습니다:```powershell Invoke-LogHorizon -SubscriptionId '00000000-0000-0000-0000-000000000000' -ResourceGroup 'rg-sentinel' -WorkspaceName 'my-sentinel-ws'
<img width="860" height="842" alt="{F4FFA929-B24F-490C-BD3D-F75E214BCD93}" src="https://assets.kitploit.com/production/public/readmes/13110/ff9d1da85043d02a216df72913ecf63520310b8d820b1bd1278b8e4aca718494.png" />
또한 다른 출력을 더 자세히 살펴볼 수 있는 메뉴도 있습니다:
<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />
### 키워드 격차 + Defender XDR
특정 벤더와 관련된 테이블이 누락되었는지 알고 싶으신가요? 몇 가지 키워드를 입력해 보세요. XDR 분석도 원한다면 `-IncludeDefenderXDR`를 추가하세요.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR
인시던트 및 자동화 규칙을 기반으로 규칙 품질/노이즈 분석을 활성화합니다:```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### 보고서 내보내기```powershell
# JSON
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output json -OutputPath ./report.json
# Markdown
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output markdown -OutputPath ./report.md
# Static HTML (self-contained, no JS, works offline)
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./report.html
# Auto-generate timestamped filename by pointing at a directory
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./reports/
이제 대화형 TUI에서 직접 테이블 보존 기간과 테이블 유형을 업데이트할 수 있습니다:
Invoke-LogHorizon을 정상적으로 연 다음, 메인 메뉴에서 테이블 보존 기간 및 유형 관리를 선택하여 대량 보존 기간 또는 유형 업데이트를 수행합니다.스크립팅 또는 자동화를 위해 전용 공개 명령을 사용하십시오:```powershell
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -RetentionInDays -1 -TotalRetentionInDays -1
### 비대화형 / CI 모드
대화형 TUI를 건너뛰고 파일로 직접 내보냅니다. 파이프라인이나 예약 실행에 유용합니다:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/
-Output를 생략하면 분석 개체가 파이프라인으로 반환되어 자체 로직에 연결할 수 있습니다.