Проблема
Классическая ошибка - подключить 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%}")