SOC без alert budget превращается в шум: detection надо мерить как продукт
Detection product loop: hypothesis, telemetry, rule, QA verdict, tuning, incident value.
Коротко: Если SOC получает больше сигналов, чем способен расследовать, система не становится безопаснее. Она просто учит аналитиков игнорировать шум.

Проблема

Классическая ошибка - подключить SIEM, включить максимум готовых правил и считать количество алертов показателем защищённости. На практике это быстро убивает внимание команды: важный сигнал тонет рядом с повторяющимися false positive.

Сильный SOC проектирует detections как продукт: у каждого правила есть риск-сценарий, источник данных, владелец, порог шума, сценарий валидации и понятная реакция.

Решение

Нужен alert budget: сколько сигналов команда реально может обработать за смену без деградации качества. Всё, что выше бюджета, должно автоматизироваться, подавляться, агрегироваться или переводиться в hunting backlog.

Правило считается production-ready только после QA: оно ловит нужный сценарий на тестовых данных, не конфликтует с нормальной бизнес-активностью, имеет suppressions и понятный playbook.

Что проверить руками

  • Есть ли у каждого high-severity alert связанный playbook и owner.
  • Сколько алертов за сутки закрывается как benign/duplicate.
  • Какие правила созданы из реального риска, а какие остались от vendor default.
  • Покрыты ли edge, VPN, identity, backup и admin-panel события отдельными use cases.

Как это должно попадать в отчёт

  • Отчёт SOC-аудита должен показывать не только найденные события, но и качество детектирования: coverage, noise, missed telemetry, MTTD/MTTR и список правил, которые пора выключить или переписать.
  • Для руководителя важны не красивые графики, а ответ: какие сценарии атаки команда увидит вовремя, какие не увидит вообще и сколько стоит довести покрытие до приемлемого уровня.

Безопасный пример: посчитать шумность правил по выгрузке alerts.csv

import csv
from collections import Counter, defaultdict

TOTAL_BUDGET_PER_DAY = 100
by_rule = Counter()
false_positive = Counter()

with open("alerts.csv", newline="", encoding="utf-8") as fh:
    for row in csv.DictReader(fh):
        rule = row.get("rule_name", "unknown")
        verdict = row.get("qa_verdict", "").lower()
        by_rule[rule] += 1
        if verdict in {"false_positive", "benign", "duplicate"}:
            false_positive[rule] += 1

print("rules over budget or too noisy")
for rule, total in by_rule.most_common():
    fp_rate = false_positive[rule] / total if total else 0
    if total > TOTAL_BUDGET_PER_DAY * 0.25 or fp_rate > 0.8:
        print(f"{rule}: alerts={total}, fp_rate={fp_rate:.0%}")
Этическая рамка: материал предназначен для defensive security, легального аудита собственных систем, подготовки remediation и обучения в контролируемой среде.