Назад к обновлениям
New releaseSep 8, 2026

log-horizon v0.9.0

Microsoft Sentinel SIEM Log Source Analyzer

Поделиться

Microsoft Sentinel SIEM Log Source Analyzer

PowerShell 7+ Module Version


Мне приходилось отвечать на вопросы "что мы на самом деле получаем из этих логов?" или "какие логи рекомендуются для Microsoft Sentinel" больше раз, чем я могу сосчитать. Ответ всегда зависит от множества факторов, но мы можем быть универсальными. Поэтому я и создал эту штуковину.

Log Horizon подключается к вашему рабочему пространству Microsoft Sentinel (и, при желании, к Defender XDR), проходит по каждой таблице логов, которые вы принимаете, и сообщает, получаете ли вы от них ценность для безопасности или просто сжигаете деньги. Он классифицирует таблицы, оценивает их по вашим правилам обнаружения и даёт конкретные рекомендации с оценкой экономии.

Важно: Это универсальный подход. Если вы знаете, что источник логов важен для вашей среды, этот контекст всегда имеет приоритет над тем, что говорит этот инструмент. Классификации — это отправная точка, а не истина в последней инстанции.

Хотите узнать больше? У меня есть несколько статей о Log Horizon в моём блоге:

  1. Релиз инструмента: Log Horizon
  2. Обновление: Log Horizon v0.5.0
  3. Создание практического базового набора логов и как Log Horizon помогает вам в этом
  4. Как использовать Log Horizon

Возможности

ВозможностьОписание
Механизм классификацииБаза знаний из 481 записи, охватывающая 240+ коннекторов, 22 категории, со статусом жизненного цикла (устаревшие/легаси плюс таблицы замены) и автоматическим эвристическим запасным вариантом для неизвестных таблиц
Оценка стоимость-ценностьМатрица тарифного уровня таблицы против уровня обнаружения с комбинированной оценкой (от Высокой ценности до Низкой ценности), с расчётом по наблюдаемому тарифному плану (Analytics, Basic, Data Lake)
Рекомендации13 приоритизированных типов действий: кандидаты для Data Lake или Basic, таблицы без обнаружений, потери при стриминге XDR, фильтрация на этапе приёма, кандидаты на разделение, использование тарифных планов, устаревшие источники, недостаточный срок хранения, результаты XDR Checker и Detection Analyzer, каждый с оценкой экономии
Сопоставление обнаруженийСопоставляет правила аналитики, охотничьи запросы и обнаружения XDR с каждой таблицей для выявления пробелов в покрытии
Теги корреляцииОбнаруживает теги #DONT_CORR# / #INC_CORR# в описаниях правил и помечает правила, исключённые из корреляции Defender
Соответствие срокам храненияСравнивает фактический срок хранения с рекомендуемыми минимумами на основе отраслевых стандартов и лучших практик безопасности
Оптимизация SOCИзвлекает собственные рекомендации Microsoft по улучшению SOC из API Security Insights
Анализ пробелов по ключевым словамПомечает таблицы, которые вам следует принимать, но которые вы не принимаете, на основе ключевых слов вендора/продукта
Обнаружение трансформацийОбнаруживает правила сбора данных (DCR), нацеленные на рабочее пространство (список подписок, отфильтрованный по назначению, DCR трансформаций рабочего пространства и ассоциации рабочего пространства), разбирает встроенные и многоступенчатые трансформации и маркирует каждую операцию (фильтрация, проекция, удаление столбцов, обогащение, агрегация)
Обнаружение разделённых таблицИдентифицирует разделённые таблицы _SPLT_CL и связывает их с родительскими таблицами в механизме классификации
Генератор KQL для разделенияГенерирует готовый для портала KQL для разделения на основе курируемой базы знаний, анализа активных правил и статистики частоты полей сообщества — формат только с условиями, который вставляется прямо в редактор правил разделения Sentinel. Списки полей пересекаются с актуальной схемой таблицы; всё, что отсутствует, сообщается как отброшенное
Анализатор обнаруженийОценивает правила аналитики на предмет потенциальной шумности, используя результаты инцидентов (коэффициент автоматического закрытия, коэффициент ложных срабатываний и процентили объёма инцидентов)
XDR CheckerДобавляет консультативный слой, ориентированный на XDR: проверки покрытия стриминга и рекомендации по хранению в Data Lake в течение одного года для телеметрии, связанной с XDR
Пользовательские классификацииПредоставьте собственный JSON, чтобы добавить или переопределить встроенную базу данных классификаций
Кэш сбораСобранные данные рабочего пространства кэшируются локально (по умолчанию 60 минут), поэтому повторные запуски и повторные экспорты занимают секунды; отключите с помощью -NoCache
Суверенные облакаКонечные точки ARM, Log Analytics и Graph следуют за средой Azure, в которую вы вошли (публичное, правительство США, Китай)
Интерактивный TUIПанель управления Spectre.Console с меню, цветными таблицами, детализацией, мастером сроков хранения и ASCII-артом
ЭкспортОтчёт в формате JSON, Markdown или статический HTML для обмена с командой

Отказ от ответственности

[!CAUTION] Отказ от ответственности

Этот инструмент разработан и поддерживается с помощью ИИ. Пожалуйста, соблюдайте осторожность при использовании этого решения и всегда понимайте, что вы запускаете, прежде чем запускать это в производственной среде. Разработчик не несёт ответственности за любые уязвимости или проблемы.

Загружая, устанавливая или используя этот инструмент, вы подтверждаете, что прочитали, поняли и согласны с этими условиями.

Предварительные требования

Что вам нужноВерсия
PowerShell7.0+
Модули AzAz.Accounts
Другие модулиPwshSpectreConsole 2.6.3+
НеобязательноMicrosoft.Graph.Authentication (для -IncludeDefenderXDR при входе как пользователь)

Конечные точки следуют за средой Azure текущей сессии Connect-AzAccount, поэтому рабочие пространства Azure Government и Azure China работают без дополнительных параметров. Значения публичного облака используются, когда среда недоступна.

Если вы ещё не вошли в Azure, модуль сам запустит Connect-AzAccount. Если вы уже вошли, он просто продолжит работу.

Разрешения: Log Analytics Reader и Microsoft Sentinel Reader на рабочем пространстве покрывают анализ. Обнаружение трансформаций также требует Microsoft.Insights/dataCollectionRules/read (Monitoring Reader) на подписке или группе ресурсов; без этого запуск продолжается и выводит предупреждение с указанием отсутствующего разрешения. -IncludeDefenderXDR использует Microsoft Graph с CustomDetection.Read.All, что для вошедшего пользователя означает необязательный модуль Microsoft.Graph.Authentication.

Начало работы

Всё довольно просто:```powershell

Grab the dependencies

Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser

Clone and import

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

Хотите узнать, не пропущены ли таблицы, связанные с конкретными вендорами? Добавьте несколько ключевых слов. Укажите `-IncludeDefenderXDR`, если вам также нужен анализ XDR.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR

Detection Analyzer

Включите анализ качества/шума правил на основе инцидентов и правил автоматизации:```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 обычным способом, затем выберите Manage table retention and type в главном меню для массового обновления срока хранения или типа.
  • Откройте Log Tuning / Transforms > Evaluate specific table и выберите Manage retention/type for this table для изменения одной таблицы.

Для написания скриптов или автоматизации используйте выделенную публичную команду:```powershell

Preview a single-table change (prints a Table / Plan / Interactive / Total / Status / Reason table, applies nothing)

Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf

Switch tables to Basic and set total retention

Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730

Use -1 for inherit/default semantics

RetentionInDays = inherit workspace default

TotalRetentionInDays = remove long-term retention

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, объект анализа возвращается в конвейер, чтобы вы могли передать его в собственную логику.

Кэш сбора данных

Этап сбора данных (использование, правила, инциденты, таблицы, DCR) по умолчанию кэшируется, поэтому повторный запуск против той же рабочей области, например для экспорта во второй формат или повторного открытия TUI, занимает секунды, а не минуты. Кэш хранится в $env:LOCALAPPDATA\LogHorizon\cache (переопределяется с помощью -CachePath), по одному файлу на комбинацию подписки, группы ресурсов, рабочей области, -DaysBack, -DetectionLookbackDays, -IncludeDefenderXDR, -IncludeDetectionAnalyzer, трёх параметров цены и версии модуля. Записи старше -CacheMaxAgeMinutes (по умолчанию 60) игнорируются, а при каждом сохранении удаляются просроченные записи, чтобы папка не накапливала файлы от других наборов параметров или старых версий. Токены никогда не записываются в кэш; аутентификация выполняется при каждом вызове, поэтому мастер удержания всегда имеет актуальные учётные данные.

Файл кэша — это обычный текстовый Clixml. С -IncludeDetectionAnalyzer он содержит заголовки инцидентов, номера, статус и классификацию из вашей рабочей области; владельцы инцидентов, авторы правил и личности назначенных владельцев не собираются. Используйте -NoCache на общих машинах или укажите -CachePath на расположение с нужным вам контролем доступа.```powershell

Force a fresh collection and refresh the cache

Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache

Never read or write the cache

Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache

Accept cached data for up to a day

Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -CacheMaxAgeMinutes 1440

### Настройка журналов и разделение KQL

Интерактивный TUI включает меню **Log Tuning / Transforms** с живыми предложениями по настройке (использование полей из ваших развёрнутых правил и охотничьих запросов), разделением KQL на основе базы знаний и оценщиком по каждой таблице. Каждый блок KQL содержит только условия и вставляется напрямую в редактор правил разделения Sentinel, с указанием источника (база знаний, анализ правил или комбинированный).

### Индивидуальные цены

Цены по умолчанию — упрощённая модель PAYG для Западной Европы в долларах США: 5,59 $/ГБ Analytics, 1,15 $/ГБ Basic, 0,20 $/ГБ Data Lake (0,07 приём + 0,13 обработка). Каждая таблица тарифицируется по плану, наблюдаемому в таблице `Usage`, а статус бесплатности определяется из `Usage.IsBillable`. Объёмы используют биллинговые ГБ (1000 МБ). Если ваш уровень обязательств отличается:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20

Все параметры

ПараметрТипОбязательныйПо умолчаниюОписание
-SubscriptionIdstringДа-Идентификатор подписки Azure
-ResourceGroupstringДа-Группа ресурсов, содержащая рабочую область Sentinel
-WorkspaceNamestringДа-Имя рабочей области Log Analytics
-WorkspaceIdstringНет-Идентификатор рабочей области (определяется автоматически, если опущен)
-OutputstringНет-Формат экспорта: json, markdown / md или html (псевдоним -o)
-OutputPathstringНет-Путь к файлу или каталогу для экспорта. Существующий каталог или завершающий разделитель приводит к имени файла с отметкой времени; имя файла без расширения получает расширение формата; отсутствующие каталоги создаются
-Keywordsstring[]Нет-Ключевые слова для анализа пробелов (например, 'AWS','CrowdStrike', псевдоним -kw)
-IncludeDefenderXDRswitchНет-Включить анализ пользовательских обнаружений Defender XDR
-IncludeDetectionAnalyzerswitchНет-Включить анализ шумных обнаружений по каждому правилу с использованием инцидентов и правил автоматизации
-DetectionLookbackDaysintНет90Окно запроса для анализа обнаружений на основе инцидентов/автоматизации (1–365 дней)
-DaysBackintНет90Окно запроса для данных об использовании (1–365 дней)
-PricePerGBdecimalНет5.59Цена приёма данных за ГБ для уровня Analytics в Sentinel (псевдоним -ppgb)
-BasicPricePerGBdecimalНет1.15Цена за ГБ для Basic Logs
-LakePricePerGBdecimalНет0.20Цена за ГБ для уровня Auxiliary / Data Lake (приём + обработка)
-NonInteractiveswitchНет-Пропустить TUI-панель и экспортировать напрямую (или вернуть данные в конвейер, если -Output опущен)
-CustomClassificationPathstringНет-Путь к пользовательскому JSON-файлу для добавления или переопределения классификаций (псевдоним -clf)
-NoCacheswitchНет-Не читать и не записывать кэш коллекции
-RefreshCacheswitchНет-Собрать свежие данные и перезаписать запись кэша
-CacheMaxAgeMinutesintНет60Максимальный возраст записи кэша для повторного использования (1–10080)
-CachePathstringНет$env:LOCALAPPDATA\LogHorizon\cacheКаталог для файлов кэша

Под капотом

Итак, всего четыре фазы.

1. Сбор данных

Модуль подключается к Azure и извлекает данные из API Log Analytics, Security Insights, Azure Monitor и Microsoft Graph. Каждый вызов проходит через обёртку повторов (ошибки 429, 5xx и ошибки транспорта), и, если не задан -NoCache, собранные данные кэшируются локально для следующего запуска.

Источник данныхAPIЧто мы получаем
Использование таблицТаблица Usage (KQL)Объём приёма, план и флаг биллинга по каждой таблице за ваше окно запроса
Правила аналитикиREST Security InsightsАктивные правила обнаружения + таблицы, которые они затрагивают, + теги корреляции, а также неявные потребители таблиц для видов правил, не использующих KQL
Охотничьи запросыREST сохранённых поисков Log AnalyticsСохранённые охотничьи запросы + используемые таблицы
Коннекторы данныхREST Security InsightsИнвентаризация установленных коннекторов
Оптимизация SOCREST Security Insights (предварительная версия)Встроенные рекомендации SOC от Microsoft
Хранение таблицREST Tables Log AnalyticsХранение, архив, план (Analytics/Basic/Auxiliary) по каждой таблице, флаги наследования по умолчанию и столбцы схемы
Правила сбора данныхREST Azure MonitorDCR, нацеленные на рабочую область (список подписок, DCR преобразования рабочей области, ассоциации) и их преобразования
Defender XDRMicrosoft GraphПользовательские правила обнаружения XDR (необязательно; делегированное разрешение CustomDetection.Read.All или токен Az Graph)
ИнцидентыREST Security InsightsРезультаты инцидентов (статус/классификация), сроки и подсказки о связях с правилами для оценки качества правил
Правила автоматизацииREST Security InsightsДействия закрытия инцидентов на уровне правил и условия сопоставления заголовков для атрибуции автоматического закрытия
SentinelHealthKQL Log AnalyticsСобытия запуска правил автоматизации с номерами инцидентов для однозначной атрибуции автоматического закрытия (необязательно, требует мониторинга работоспособности)

2. Классификация

Каждая таблица проходит классификацию в два прохода:

Сначала — прямой поиск по базе знаний из 481 записи в Data/log-classifications.json. Каждая запись содержит имя коннектора, первичную/вторичную классификацию, категорию безопасности, сопоставления источников данных MITRE, рекомендуемый уровень ценообразования и хранение, а также необязательные флаги жизненного цикла (устаревшие/легаси с таблицами замены, возможность потоковой передачи в XDR, платформа).

Если совпадения нет, вступают в силу эвристические правила, в таком порядке:

  • Имя содержит токен безопасности, такой как Alert, Incident, Threat, Signin, Logon, Audit, Risk, Detection (сопоставляется по началам слов в PascalCase) -> первичная
  • Имя похоже на инфраструктурную телеметрию: Flow, Metric, Diagnostic, Perf, Heartbeat, Health, Inventory, Usage -> вторичная
  • На таблицу указывают активные правила аналитики -> первичная
  • Встроенная таблица с префиксом Microsoft (AAD, Microsoft, Azure, Defender, Purview, Entra, Sentinel, Office, Intune, Windows ...) -> первичная, помечается для проверки и добавления в базу данных
  • Общее имя вида *Log/*Logs -> вторичная
  • Высокий объём (>10 ГБ/мес) без каких-либо обнаружений -> вторичная
  • Ничего из вышеперечисленного -> неизвестная

3. Оценка стоимости и ценности

Каждая таблица оценивается по нескольким измерениям:

  • Уровень стоимости: Бесплатный / Низкий (<1 ГБ) / Средний (1–10 ГБ) / Высокий (10–50 ГБ) / Очень высокий (>50 ГБ)
  • Уровень обнаружений: Нет / Низкий (1–2 правила) / Средний (3–9 правил) / Высокий (10+ правил)
  • Оценка: Высокая ценность / Хорошая ценность / Отсутствующее покрытие / Оптимизировать / Низкая ценность / Недоиспользуемая / Бесплатный уровень / Платформа
  • Покрытие %: Процент таблиц, на которые ссылается хотя бы одно правило аналитики или охотничий запрос, рассчитывается как tablesWithRules / totalTables * 100. Покрытие по каждой таблице суммирует правила аналитики + охотничьи запросы, найденные путём разбора KQL на имена таблиц.
  • Неявное покрытие: Виды правил, не содержащие KQL, всё равно потребляют таблицы. Data/implicit-consumers.json сопоставляет их (сопоставление Threat Intelligence -> ThreatIntelIndicators/ThreatIntelObjects, Fusion -> SecurityAlert/Anomalies, UEBA -> BehaviorAnalytics/UserPeerAnalytics/IdentityInfo, создание инцидентов Microsoft -> SecurityAlert). Включённые правила таких видов учитываются в эффективном покрытии, и каждая таблица сообщает CoverageSource со значением kql, xdr, implicit, platform или none. Платформенные таблицы, которые Sentinel пишет для себя (SecurityIncident, SentinelHealth, Watchlist, Usage ...), никогда не помечаются как имеющие отсутствующее покрытие и получают оценку Platform.
  • Только включённые правила аналитики и включённые пользовательские обнаружения Defender учитываются в покрытии.

Затем модуль генерирует рекомендации (13 типов):

ТипКогда срабатываетЧто делать
Data LakeВторичная + высокая стоимость + мало обнаружений, и таблица поддерживает план Auxiliary (переход на предложение Basic, если поддерживается только Basic)Переместить на уровень Auxiliary/Data Lake; экономия — это текущая стоимость минус тот же объём по тарифу lake (или Basic)
Low ValueВысокая стоимость + ноль обнаруженийДобавить правила, фильтровать или переместить в data lake
XDR OptimiseПотоковая передача в XDR + 0 правил Sentinel + существуют правила XDRПрекратить потоковую передачу, использовать вместо этого единый портал XDR
Missing CoverageПервичная + ноль обнаружений (не платформенные таблицы)Написать правила аналитики, чтобы получить ценность из данных
Ingest-time FilterПервичная + >20 ГБ + <=3 обнаруженийПрименить преобразование на этапе приёма, чтобы сократить объём
Split CandidateПервичная + высокий объём + обнаружения + нет существующего преобразованияРазделить таблицу, чтобы строки с высокой ценностью остались на Analytics, а остальное ушло в Data Lake
Plan UsageСтроки Usage показывают более одного плана, или настроенный план отличается от наблюдаемого в UsageПроверить, ожидался ли переход плана
Deprecated SourceТаблица, помеченная как устаревшая или легаси в базе данных, всё ещё принимает данныеПеренести обнаружения на таблицы замены, затем отключить старый коннектор. Информационно: экономия не заявляется, поскольку приём перемещается, а не исчезает
Retention ShortfallХранение рабочей области или таблицы ниже базового уровня в 90 днейУвеличить общее/архивное хранение для соответствия нормативным требованиям
Retention ImprovementПлатная, не платформенная таблица соответствует 90 дням, но ниже рекомендации категорииРассмотреть более длительное общее хранение
Interactive Below BaselineТаблица Analytics с интерактивным (горячим) хранением менее 90 днейПоднять интерактивное хранение до 90 дней, включённых в Sentinel, если короткое горячее окно не является намеренным
XDR CheckerИзвестная таблица Defender XDR не передаётся потоком, передаётся без покрытия, не пересылается в Data Lake или ниже годовой рекомендацииПроверить потоковую передачу и хранение телеметрии XDR
Detection AnalyzerОценка правила >= 70 с как минимум 5 инцидентами (с -IncludeDetectionAnalyzer)Настроить или отключить шумное правило

Рекомендации сортируются один раз: High > Medium > Low, затем по предполагаемой экономии, и каждый вывод (JSON, Markdown, HTML, TUI) сохраняет этот порядок.

4. Detection Analyzer (оценка шумности)

Когда вы передаёте -IncludeDetectionAnalyzer, модуль получает недавние инциденты и правила автоматизации, затем оценивает каждое включённое правило аналитики на потенциальную шумность.

Метрики по каждому правилу (вычисляются из данных инцидентов):

МетрикаКак вычисляется
Всего инцидентовКоличество инцидентов, связанных с правилом
Доля AutoCloseИнциденты, закрытые правилами автоматизации ÷ всего инцидентов. Основной источник: таблица SentinelHealth (запуски правил автоматизации по включённым правилам закрытия инцидентов или playbook, сопоставленные по номеру инцидента). Запасной вариант: сопоставление условий правил автоматизации (идентификатор правила аналитики, условия по заголовку и серьёзности, объединённые через AND, как это делает Sentinel). Правила, условия которых касаются только статуса/тактик/сущностей, считаются применяемыми к каждому инциденту.
Доля FalsePositiveИнциденты, классифицированные как ложные срабатывания ÷ всего инцидентов

Формула оценки шумности:

Каждая метрика преобразуется в процентильный ранг среди всех правил, имеющих хотя бы один инцидент. Итоговая оценка — это взвешенная комбинация:``` Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)

- **Процентиль по объему (35%)**: сколько инцидентов генерирует правило относительно других правил.
- **Процентиль автозакрытия (40%)**: как часто инциденты автоматически закрываются правилами автоматизации (наибольший вес, поскольку автоматическое закрытие — самый сильный сигнал низкоценных оповещений).
- **Процентиль ложных срабатываний (25%)**: как часто аналитики классифицируют результат как ложное срабатывание.

**Пороговые значения оценки**:

| Оценка | Метка | Значение |
|---|---|---|
| ≥ 70 | Шумное | Правило, вероятно, требует настройки или отключения |
| ≥ 50 | Наблюдение | Правило демонстрирует ранние признаки шумности |
| < 50 | Здоровое | Правило находится в пределах нормы |
| Н/Д | - | У правила нет связанных инцидентов, или менее 3 правил имеют инциденты, поэтому не с чем сравнивать |

Инциденты группируются по идентификатору аналитического правила (с переходом на имя правила, затем на заголовок), поэтому два правила с одинаковым отображаемым именем оцениваются отдельно.

Правила с оценкой ≥ 70 и как минимум 5 инцидентами автоматически отображаются как **рекомендации с высоким приоритетом** в представлении «Рекомендации».

### 5. Интерактивная панель управления

Главное меню предлагает следующие представления:

- **Панель управления**: сводная статистика, 10 самых затратных таблиц (устаревшие и наследуемые источники помечены значком), полоса покрытия, сводка соответствия политикам хранения, уведомление об исключениях корреляции
- **Просмотр рекомендаций**: приоритизированные действия с оценкой ежемесячной экономии, разворачиваемые для показа полного списка, если элементов больше 10
- **Просмотр оценки обнаружений**: сводная матрица «стоимость-ценность», покрытие правил и охотничьих запросов по таблицам, детализация по первичным/вторичным данным, список правил с исключением корреляции
- **Просмотр анализатора обнаружений**: ранжирование шумных правил на основе процентилей с индикаторами качества закрытия (при использовании `-IncludeDetectionAnalyzer`), доступный для поиска браузер правил
- **Просмотр оптимизации SOC**: собственные предложения Microsoft по улучшению с детализацией
- **Просмотр оценки хранения**: таблицы ниже рекомендуемых минимумов с текущим и рекомендуемым хранением, типом плана и дефицитом, а также консультационные строки XDR
- **Просмотр преобразований данных**: инвентаризация преобразований DCR с классификацией типов преобразований и полным KQL для каждой таблицы
- **Настройка журналов / преобразования**: живые предложения по настройке, KQL с разделением базы знаний и оценщик по таблицам с изменением хранения/типа для одной таблицы
- **Просмотр всех таблиц**: полный список с классификацией, планами, стоимостью, правилами, хранением (с цветовой кодировкой) и оценкой; выберите таблицу для панели сведений (источники покрытия, поддержка планов, хранение, статус, её рекомендации)
- **Управление хранением и типом таблиц**: мастер массового изменения хранения и плана с предпросмотром и применением
- **Словарь**: каждый термин, используемый инструментом (классификация, уровни стоимости и обнаружения, оценки, источники покрытия, 13 типов рекомендаций, метрики и метки оценок анализатора обнаружений, планы таблиц, статус жизненного цикла, состояния XDR, типы преобразований) с теми же определениями, что и в этом README, предоставляется из `Data/dictionary.json`
- **Экспорт отчёта**: выберите формат, затем путь (каталог для файла с отметкой времени или имя файла; Enter сохраняет текущий каталог) и запишите JSON, Markdown или HTML прямо из меню
- **Анализ XDR** появляется на панели управления при использовании `-IncludeDefenderXDR`

---

## База данных классификаций

Расположена в `Data/log-classifications.json`. **481 запись**, **243 коннектора**, **22 категории**.

### Что содержится в каждой записи

| Поле | Что содержит |
|---|---|
| `tableName` | Имя таблицы Log Analytics (`SecurityEvent`, `SigninLogs` и т. д.) |
| `connector` | Какой коннектор данных создаёт эту таблицу |
| `classification` | `primary` (ценность для безопасности) или `secondary` (вспомогательная телеметрия) |
| `category` | Категория безопасности: Identity & Access, Network Security и т. д. |
| `description` | Описание содержимого таблицы простым языком |
| `keywords` | Термины для сопоставления при анализе пробелов по ключевым словам |
| `mitreSources` | Сопоставления источников данных MITRE ATT&CK |
| `recommendedTier` | `analytics` (горячий уровень) или `datalake` (кандидат на вспомогательный уровень) |
| `recommendedRetentionDays` | Минимальный рекомендуемый общий срок хранения в днях (регуляторные рекомендации) |
| `isFree` | Принимает ли Microsoft эту таблицу бесплатно (среда выполнения сначала использует `Usage.IsBillable`) |
| `status` | Необязательно. `deprecated` (коннектор выведен из эксплуатации или приём остановлен) или `legacy` (более старый путь сбора с задокументированным преемником) |
| `replacedBy` | Необязательно. Имена таблиц для миграции; присутствует всегда, когда задан `status` (может быть пустым) |
| `xdrStreamable` | Необязательно, только для таблиц Defender. `true` для 21 таблицы, которые потоково передаёт коннектор Defender XDR; `false` для таблиц, доступных только на портале, и таблиц TVM |
| `platform` | Необязательно. `true` для таблиц, которые потребляет сам Sentinel (`SecurityIncident`, `Usage`, `Watchlist`, ...), которым никогда не нужны правила аналитики |

Таблицы со `status` отображают значок в TUI и в отчётах, а любые, которые всё ещё принимают данные, вызывают рекомендацию `DeprecatedSource` с указанием замены. Таблицы с `xdrStreamable: false` никогда не рассматриваются как кандидаты на потоковую передачу XDR в XDR Checker.

### Первичные и вторичные данные безопасности

**Первичные** (278 записей): таблицы, на которых вы фактически строите обнаружения. Журналы входа, оповещения безопасности, данные об угрозах, журналы аудита, результаты сканирования уязвимостей, записи межсетевых экранов, телеметрия EDR.

**Вторичные** (203 записи): вспомогательные данные. Метрики производительности, диагностика инфраструктуры, объёмы сетевого трафика, снимки инвентаризации, базовые конфигурации, проверки работоспособности.

### Категории на первый взгляд

| Категория | Количество | Примеры |
|---|---|---|
| Identity & Access | 51 | `SigninLogs`, `MicrosoftServicePrincipalSignInLogs`, `OktaSSO` |
| Network Security | 49 | `AZFWNetworkRule`, `NSPAccessLogs`, `DarktraceModelAlerts_CL` |
| Cloud Control Plane | 37 | `AzureActivity`, `AZKVAuditLogs`, `GoogleWorkspaceReports` |
| Network Flow | 36 | `NTANetAnalytics`, `CommonSecurityLog`, `AZFWFatFlow` |
| Endpoint Detection | 33 | `DeviceProcessEvents`, `CrowdStrikeAuditEvents`, `SentinelOneAlertsV2_CL` |
| Application Logs | 32 | `AppServiceHTTPLogs`, `AppServiceAuditLogs`, `DynatraceAttacksV2_CL` |
| Email Security | 29 | `EmailEvents`, `CampaignInfo`, `Ttp_Url_CL` |
| Security Alerts | 29 | `SecurityAlert`, `SentinelBehaviorInfo`, `DisruptionAndResponseEvents` |
| Vulnerability Mgmt | 23 | `DeviceTvmSoftwareVulnerabilities`, `Rapid7InsightVMCloudVulnerabilities` |
| Cloud Security | 20 | `EnrichedMicrosoft365AuditLogs`, `OAuthAppInfo`, `PowerAppsActivity` |
| Endpoint Telemetry | 18 | `DeviceInfo`, `Windows365NetworkLogs`, `SentinelOneAgents_CL` |
| Posture Management | 17 | `ExposureGraphNodes`, `SecurityNestedRecommendation`, `ZTSMetadata` |
| Data Security | 16 | `PurviewDataSensitivityLogs`, `DataSecurityEvents`, `PowerPlatformDlpActivity` |
| Data Platform | 16 | `SQLSecurityAuditEvents`, `CDBControlPlaneRequests`, `SnowflakeLogin_CL` |
| Platform Health | 14 | `SentinelHealth`, `Usage`, `SecurityCaseEvent` |
| Container & K8s | 13 | `AKSAudit`, `CloudProcessEvents`, `GKEAudit` |
| Infrastructure Diag | 13 | `AzureMetrics`, `AGWPerformanceLogs`, `ContainerAppSystemLogs` |
| Threat Intelligence | 10 | `ThreatIntelIndicators`, `ThreatIntelObjects`, `CybleVisionAlerts_CL` |
| Configuration Mgmt | 8 | `ConfigurationData`, `AVNMRuleCollectionChange` |
| SAP Security | 7 | `ABAPAuditLog`, `SAPBTPAuditLog_CL`, `Onapsis_Defend_CL` |
| Storage Access | 6 | `StorageBlobLogs`, `CloudStorageAggregatedEvents`, `AWSS3ServerAccess` |
| IoT/OT Security | 4 | `RadiflowEvent`, `DragosAlerts_CL`, `Phosphorus_CL` |

### Поддержка планов таблиц

`Data/basic-plan-tables.json` и `Data/auxiliary-plan-tables.json` содержат список встроенных таблиц, которые [матрица функций таблиц Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) помечает как поддерживающие планы Basic и Auxiliary (Data Lake). Мастер хранения использует список Basic для проверки переключения планов, а рекомендация `DataLake` предлагает уровень озера данных только для таблиц, которые его поддерживают, с переходом на предложение плана Basic там, где это самый низкий поддерживаемый уровень. Пользовательские таблицы на основе DCR поддерживают оба плана; классические пользовательские таблицы не поддерживают ни один. Оба файла перегенерируются из этой матрицы для каждого выпуска.

### Пользовательские классификации

Вы можете предоставить собственный файл классификаций, чтобы **добавить** записи для таблиц, отсутствующих во встроенной базе данных, или **переопределить** существующие записи, когда значения по умолчанию не соответствуют вашей среде. Пользовательские записи имеют приоритет над встроенными, когда одно и то же `tableName` встречается в обоих файлах.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' `
    -CustomClassificationPath './my-classifications.json'

The custom file uses the same schema as Data/log-classifications.json, an array of objects:```json [ { "tableName": "MyCustomApp_CL", "connector": "Custom Logs (DCR)", "classification": "primary", "category": "Application Logs", "description": "Security-relevant audit events from an internal application", "keywords": ["custom", "internal", "audit"], "mitreSources": [], "recommendedTier": "analytics", "isFree": false }, { "tableName": "AzureMetrics", "connector": "Azure Monitor", "classification": "primary", "category": "Infrastructure Diag", "description": "Override: promoted to primary because we detect on Azure resource metrics in this environment", "keywords": ["metrics", "azure", "infrastructure", "monitoring"], "mitreSources": [], "recommendedTier": "analytics", "isFree": false } ]

См. `Data/custom-classifications-example.json` — готовый шаблон для использования.

### Как строились классификации

Первичная/вторичная градация выполнялась частично автором, а затем путём подачи определений коннекторов и таблиц Microsoft в ИИ с базовой линией ручной оценки, используя рекомендации Microsoft и отраслевые стандарты в качестве критериев классификации. Если что-то выглядит неподходящим для вашей среды, доверяйте собственному контексту больше, чем инструменту — ИИ может ошибаться, а контекст решает всё.

Критерии классификации были взяты из следующих источников:

**ACSC (Австралийский центр кибербезопасности, Управление сигналов Австралии)**
- [ACSC: Best practices for event logging and threat detection (авг. 2024)](https://www.cyber.gov.au/sites/default/files/2024-08/best-practices-for-event-logging-and-threat-detection.pdf)
- [ACSC: Priority logs for SIEM ingestion — практическое руководство (май 2025)](https://www.cyber.gov.au/business-government/detecting-responding-to-threats/event-logging/implementing-siem-soar-platforms/priority-logs-for-siem-ingestion-practitioner-guidance)

**CISA (Агентство по кибербезопасности и защите инфраструктуры)**
- [CISA: Guidance for Implementing M-21-31: Improving the Federal Government's Investigative and Remediation Capabilities](https://www.cisa.gov/sites/default/files/2023-02/TLP%20CLEAR%20-%20Guidance%20for%20Implementing%20M-21-31_Improving%20the%20Federal%20Governments%20Investigative%20and%20Remediation%20Capabilities_.pdf)
- [CISA: Microsoft Expanded Cloud Logs Implementation Playbook (2025)](https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf)

**Microsoft**
- [Справочник по коннекторам данных Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [Справочник по таблицам и коннекторам Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [Репозиторий Azure-Sentinel на GitHub](https://github.com/Azure/Azure-Sentinel) (аналитические правила сообщества, определения коннекторов, шаблоны решений)
- [Выставление счетов в Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/billing)
- [Управление уровнями данных в Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/manage-data-overview)

**MITRE**
- [Источники данных MITRE ATT&CK](https://attack.mitre.org/datasources/)

**NIST (Национальный институт стандартов и технологий)**
- [NIST SP 800-92: Guide to Computer Security Log Management](https://csrc.nist.gov/pubs/sp/800/92/final)

**NSA (Агентство национальной безопасности)**
- Руководство NSA по пересылке событий кибербезопасности

**NCSC-UK (Национальный центр кибербезопасности — Великобритания)**
- «Что именно нам следует логировать?» от NCSC-UK

**Google Cloud**
- [Обзор журналов аудита Google Cloud](https://docs.cloud.google.com/logging/docs/audit)
- [Рекомендации по журналам аудита Google Cloud](https://docs.cloud.google.com/logging/docs/audit/best-practices)


Использовались и другие источники, а также «экспертиза» авторов, если её можно так назвать.
---

## Структура проекта```
LogHorizon.psd1              Module manifest (v0.9.0)
LogHorizon.psm1              Module loader
Public/
  Invoke-LogHorizon.ps1              Entry point, the main orchestrator
  Set-LogHorizonTableRetention.ps1   Scriptable table retention and plan changes
Private/
  Connect-Sentinel.ps1       Azure auth + workspace resolution
  Get-TableUsage.ps1         KQL query for ingestion volumes
  Get-AnalyticsRules.ps1     Analytics rules + table/field extraction + correlation tags
  Get-HuntingQueries.ps1     Hunting queries + table extraction
  Get-DataConnectors.ps1     Data connector inventory
  Get-DataTransforms.ps1     DCR transform discovery, split KQL generation
  Get-DefenderXDR.ps1        Defender XDR analysis (optional)
  Get-Incidents.ps1          Incident fetch + SentinelHealth auto-close attribution
  Get-AutomationRules.ps1    Automation rule inventory + close-logic attribution
  Get-SocOptimization.ps1    SOC improvement recommendations
  Get-TableRetention.ps1     Per-table retention, archive, and plan type
  Get-CollectionCache.ps1    Collection cache (key, path, read, write)
  Get-LogHorizonEndpoint.ps1 ARM / Log Analytics / Graph endpoints for the signed-in Azure environment
  Get-LogHorizonDictionary.ps1 Loads the term dictionary shown by the Dictionary menu
  Invoke-AzRestWithRetry.ps1 REST wrapper: retry on 429/5xx/transport errors, async operation polling
  Invoke-Classification.ps1  Static DB + heuristic classification + _SPLT_CL detection + custom file validation
  Invoke-Analysis.ps1        Cost-value matrix + recommendations + Detection Analyzer + XDR Checker + split suggestions
  Set-TableRetention.ps1     Retention change set, preview, Tables API apply engine, plan support lookups
  Write-Report.ps1           Spectre.Console TUI rendering
  Export-Report.ps1          JSON / Markdown / static HTML export with shared section renderer
Data/
  log-classifications.json              481-entry classification knowledge base
  basic-plan-tables.json                Built-in tables that support the Basic plan (from the Azure Monitor feature matrix)
  auxiliary-plan-tables.json            Built-in tables that support the Auxiliary / Data Lake plan
  implicit-consumers.json               Non-KQL rule kinds to tables, plus platform tables
  dictionary.json                       Term definitions for the Dictionary menu (kept 1:1 with this README, enforced by tests)
  high-value-fields.json                Split KQL knowledge base: 165 tables with curated fields and split hints
  field-frequency-stats.json            Community field frequency stats mined from the Azure-Sentinel rule corpus
  custom-classifications-example.json   Example custom classification override file
  ReportTemplate.html                   Static HTML report template (pure-CSS tabs, zero JS, CSP meta)
Tests/
  LogHorizon.Tests.ps1       437 Pester v5 unit tests

Как создаются базы знаний

Раздельные базы знаний KQL, high-value-fields.json и field-frequency-stats.json, собираются офлайн из публичного репозитория Azure/Azure-Sentinel (примерно 3 800 YAML-файлов правил в Solutions/, Detections/, Hunting Queries/). Каждый запрос прогоняется через те же Get-TablesFromKql и Get-FieldsFromKql, которые модуль использует во время выполнения, для построения частотных подсчётов полей по каждой таблице, на основе которых выводятся три уровня резервных полей:

  • Универсальные поля: поля, встречающиеся более чем в 50% всех таблиц (например, TimeGenerated)
  • Значения по умолчанию для категорий: поля, встречающиеся более чем в 40% таблиц в пределах категории классификации
  • Статистика по таблицам: необработанные частотные подсчёты полей для таблиц, на которые ссылаются как минимум 3 правила

Добытые поля объединяются в курируемый high-value-fields.json (курируемые записи сохраняются, добавляются вновь обнаруженные таблицы с как минимум 3 правилами и 3 значимыми полями).

Во время выполнения Get-SplitKql использует иерархию резервирования: курируемая запись KB -> анализ полей живых правил/охотничьих запросов -> статистика сообщества по таблицам -> значения по умолчанию для категорий -> универсальные поля. Частота полей — не идеальный метод, но знать её полезно.

Тесты

437 тестов Pester v5, подключение к Azure не требуется. Запускайте их из обычного сеанса PowerShell, а не из встроенного терминала VS Code:```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed

## Лицензия

GPL-3.0. См. [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE).

## История версий

| Версия | Дата | Изменения |
|---|---|---|
| 0.9.0 | 2026-09-06 | Релиз исправлений по итогам полного аудита кода и данных. Корректность: ценообразование с учётом плана из `Usage.Plan` и `Usage.IsBillable` с тарифами Basic и Data Lake и биллинговыми ГБ (1000 МБ), атрибуция автозакрытия Detection Analyzer ограничена включёнными правилами закрытия/playbook (`triggeringLogic.isEnabled`), инциденты через `2025-09-01` с `$top=1000`, неявное покрытие для видов правил, отличных от KQL, и платформенных таблиц (`implicit-consumers.json`), базовая проверка интерактивного хранения, единая сортировка рекомендаций. Трансформации: обнаружение DCR на уровне подписки с фильтрацией по целевому рабочему пространству плюс трансформационный DCR рабочего пространства и ассоциации, с видимым статусом и предупреждением при отсутствии разрешения; разбор трансформаций рабочего пространства и многоступенчатых трансформаций; разделённый KQL, пересекаемый с живой схемой таблиц. Устойчивость: кэш коллекций включён по умолчанию (`-NoCache`, `-RefreshCache`, `-CacheMaxAgeMinutes`, `-CachePath`), аутентификация до индикатора выполнения с выводом предупреждений после, экранированный вывод TUI и Markdown, разрешение пути экспорта с созданием каталогов и возвратом записанного пути, CSP meta в HTML, повторные попытки REST при транспортных ошибках и асинхронном завершении в стиле Location, разрешение рабочего пространства через REST (`Az.Resources` удалён), проверка пользовательской классификации, эвристики с учётом PascalCase с запасным вариантом для продуктов Microsoft, тайм-ауты регулярных выражений. Конечные точки следуют за вошедшей средой Azure (Government, China), а версии API перенесены на SecurityInsights `2025-09-01`, OperationalInsights `2025-07-01`, рекомендации `2025-10-01-preview`. Данные: база классификации 345 -> 481 записей с ключами `status`/`replacedBy`/`xdrStreamable`/`platform`, 80+ таблиц первого производителя и 35 таблиц-преемников, исправления меток коннекторов, исправления `isFree`; перегенерированы `basic-plan-tables.json` и новые `auxiliary-plan-tables.json` из матрицы функций таблиц Azure Monitor; рекомендация `DeprecatedSource`, рекомендация Data Lake с учётом плана с запасным вариантом Basic, XDR Checker учитывает потоковую передачу, значки жизненного цикла в TUI и экспортах. Этап проверки: ключ кэша покрывает ценообразование и версию модуля, логические значения и уровни пользовательской классификации разбираются, а не приводятся, атрибуция автозакрытия с учётом серьёзности, предикаты разделённого KQL проверяются по живой схеме, статус выборки XDR отображается вместо тихого `$null`, пути вывода без расширения являются файлами, удостоверения владельцев инцидентов больше не собираются. Меню словаря в TUI с каждым термином, используемым инструментом, на основе `Data/dictionary.json` и привязанное к коду тестами. Объекты правил автоматизации и пользовательских детекций Defender проецируются на потребляемые поля, поэтому удостоверения авторов (createdBy, lastModifiedBy, назначенные владельцы) никогда не попадают в кэш или экспорты. Лицензия GPL-3.0. 437 тестов |
| 0.8.0 | 2026-05-26 | Добавлено интерактивное управление хранением таблиц с новым массовым потоком TUI и точкой входа обновления одной таблицы, а также публичной командой `Set-LogHorizonTableRetention`. Добавлен механизм применения PATCH Tables API с проверкой, опросом асинхронных операций Azure и двухэтапным запасным вариантом (комбинированный PATCH, затем только план и только хранение) для устойчивых обновлений хранения. Добавлено целенаправленное покрытие Pester для проверки, формы полезной нагрузки, запасного варианта и сопоставления публичных команд. Также исправлен пограничный случай/ошибку, когда пользователи получали рекомендации переводить таблицы data lake на уровень data lake, если у них всё ещё были аналитические данные в Sentinel |
| 0.7.1 | 2026-05-15 | Добавлена осведомлённость о плане из `Usage.Plan` без замены настроенного плана таблицы: анализ теперь отслеживает наблюдаемую историю планов, отмечает использование нескольких планов и несоответствия настроенного и наблюдаемого, а также отображает данные плана в панели мониторинга, детализации таблиц, View All Tables, оценке хранения и экспортах. Исправлена атрибуция автозакрытия Detection Analyzer, чтобы эвристика времени применялась только при отсутствии включённых правил автоматизации. 203 теста пройдено |
| 0.7.0 | 2026-04-16 | Оценка обнаружений обновлена сводной таблицей матрицы стоимость-ценность (Primary/Secondary x7 категорий оценки с цветовым кодированием), подменю детализации для основных/вторичных таблиц с колонками уровня стоимости/обнаружений. Detection Analyzer обновлён столбцами покрытия объёма в ГБ с весовым коэффициентом (обнаружения/охота/комбинированные ГБ как процент от общего приёма данных рядом с существующими столбцами количества таблиц). Улучшены адаптивные возможности отображения для Detection Analyzer (динамическая ширина столбцов, усечение имён правил, условное скрытие колонок в зависимости от ширины консоли). 193 теста пройдено |
| 0.6.3 | 2026-04-11 | Незначительное обновление для PSGallery |
| 0.6.2 | 2026-04-11 | Меню Log Tuning / Transforms: анализ настройки живых данных (использование полей на таблицу из развёрнутых правил/запросов охоты, генерация KQL filter/project/combined, оценки экономии), извлечение колонок схемы из Tables API, иерархия запасных вариантов `Get-SplitKql` (статистика сообщества → категорийные значения по умолчанию → универсальные поля), комплексный оценщик таблиц с матрицей использования полей, унифицированные секции экспорта KB + живой настройки, скрипт добычи `Build-FieldKnowledgeBase.ps1` для корпуса правил Azure-Sentinel GitHub. Detection Analyzer: атрибуция автозакрытия на основе SentinelHealth (основная) с запасным вариантом сопоставления правил с учётом операторов, разбор обёрток логических условий, определение статуса Resolved, сопоставление хвоста GUID для идентификаторов ресурсов ARM. Покрытие теперь основано на количестве таблиц по всем таблицам (включая бесплатный уровень). Дисклеймер о скоринге добавлен в TUI и экспорты. 174 теста |
| 0.6.1 | 2026-04-10 | Исправления ошибок: фильтрация `$kqlKeywords` теперь общая на уровне файла (была не определена в `Get-TablesFromKql`), `[CmdletBinding()]` добавлен ко всем вспомогательным функциям, упрощена унифицированная проверка Defender, удалён призрачный тестовый параметр `-RuleCount`. Устойчивость: пагинация `Get-HuntingQueries`, обёртка повторных попыток `Invoke-AzRestWithRetry` с экспоненциальной задержкой для 429/5xx, проверка `PricePerGB`, `Write-Verbose` в ключевых функциях. Документация: значок версии, количество записей БД, предварительные требования согласованы с манифестом |
| 0.6.0 | 2026-04-10 | Динамическое обнаружение потоковой передачи XDR с 21 `KnownXDRTables` (было жёстко задано 18), `XDRState` на таблицу (`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`), Auxiliary распознаётся как уровень data lake, непотоковые таблицы XDR отображаются как рекомендации Information/Low с `NotStreamedCount`, анализатор хранения показывает непотоковые таблицы XDR как "XDR only (30d)", разбивка уровней в обзоре (analytics/basic/data lake + не потоковые), метки Export-Report Auxiliary→"data lake", база классификации обновлена до 345 записей (+`DeviceNetworkInfo`, `DeviceInfo`→secondary/datalake, `DeviceImageLoadEvents` и `IdentityQueryEvents`→уровень datalake), 15 новых тестов Pester (всего 121) |
| 0.5.0 | 2026-04-03 | Статический HTML-экспорт с вкладками на чистом CSS (ноль JS, без CDN, полностью автономный), унифицированный рендерер секций MD/HTML, полный захват данных JSON (dataTransforms, correlationExcluded/Included, streamingTables), переключатель `-NonInteractive` для использования в CI/конвейерах, псевдоним формата `md`, имена файлов с автоматической меткой даты и времени, полное отображение KQL в трансформациях DCR (без усечения), обработка многострочного KQL в таблицах Markdown, исправлено повреждение обратных ссылок `$` в регулярных выражениях при замене токенов HTML, переименованы внутренние помощники для избежания конфликтов с псевдонимами PowerShell (`h`→`hEnc`, `md`→`mdEsc`), 33 новых теста Pester (всего 106) |
| 0.4.1 | 2026-04-03 | Исправления безопасности и стабильности — добавлена очистка памяти токенов, проверка путей вывода и защита от XSS, ограничения пагинации REST API, исправлена маскировка ошибок загрузчика модулей и устранены предупреждения PSScriptAnalyzer |
| 0.4.0 | 2026-04-02 | Обнаружение трансформаций (список DCR + классификация типов трансформаций), обнаружение разделённых таблиц (`_SPLT_CL`), помощник разделённого KQL с базой знаний из 15 таблиц (`high-value-fields.json`) + запасной вариант анализа правил, вывод KQL только с условиями, готовый для портала, расширяемый список рекомендаций, меню TUI с предложениями разделённого KQL |
| 0.3.0 | 2026-04-02 | Анализ соответствия хранения журналов (CISA M-21-31, NIST SP 800-92, NCSC-UK, ASD ACSC, NSA), обнаружение тегов корреляции (`#DONT_CORR#`/`#INC_CORR#`), представление меню оценки хранения, колонка хранения в All Tables, `recommendedRetentionDays` в схеме классификации |
| 0.2.2 | 2026-04-02 | Таблица оптимизации SOC скрывает колонку Detail на узких консолях |
| 0.2.1 | 2026-04-02 | Поддержка пользовательской классификации (`-CustomClassificationPath`), обогащённые рекомендации оптимизации SOC с предложениями API/детализацией, представление только активных по умолчанию, подавление предупреждения о кодировке UTF-8 |
| 0.2.0 | - | Первый публичный релиз с механизмом классификации, скорингом стоимость-ценность, TUI Spectre.Console, экспортом в JSON/Markdown |
| 0.1.0 | - | Внутренняя версия для разработки |

## Известные проблемы

### Предупреждение о кодировке UTF-8 PwshSpectreConsole

Чтобы включить вывод UTF-8 в вашем терминале, добавьте следующую строку в начало файла `$PROFILE` PowerShell и перезапустите терминал:```powershell
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()

Модуль устанавливает это автоматически при импорте, но в зависимости от вашей сессии предупреждение всё равно может появляться. Это косметический дефект и не влияет на функциональность.

Вклад в проект

Если у вас есть проблемы или вы хотите внести свой вклад, создайте pull request.

Нравится инструмент?


Buy Me a Coffee at ko-fi.com

Категории