MTTD и MTTR: расчёт времени обнаружения и реагирования на инциденты

0
7
Обложка статьи: MTTD и MTTR: расчёт времени обнаружения и реагирования на инциденты

«У нас в среднем инцидент закрывается за час» — фраза, которая ничего не говорит без точного определения, что здесь посчитано и как. MTTD (mean time to detect, среднее время обнаружения) и MTTR (mean time to respond, среднее время реагирования) — две конкретные, дополняющие друг друга метрики из набора метрик для отчётности. Ниже — как их считать по имеющимся у вас отметкам времени и на что обратить внимание, чтобы цифра не обманывала.

Статья опирается на логику направления «Отчётность и метрики» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами.

Что должно получиться

Уровень Что это значит на практике
2. Гигиенический Время обнаружения и реагирования на инциденты измеряется по журналу с отметками времени, а не оценивается на глаз для квартального отчёта

Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.

Три точки отсчёта и две метрики

Для расчёта нужны три момента времени на каждый инцидент — именно те поля, которые уже должна фиксировать карточка инцидента:

  • Начало (occurred_at) — когда инцидент реально начался. Часто неизвестно точно: злоумышленник может быть в сети несколько дней до обнаружения.
  • Обнаружение (detected_at) — когда об инциденте узнала команда ИБ.
  • Сдерживание (contained_at) — когда распространение остановлено (не обязательно полное восстановление).

MTTD = обнаружение − начало. Показывает, сколько времени угроза оставалась незамеченной. MTTR = сдерживание − обнаружение. Показывает, насколько быстро команда реагирует после того, как узнала о проблеме.

Скрипт

#!/usr/bin/env python3
"""Расчёт MTTD (среднее время обнаружения) и MTTR (среднее время реагирования) из журнала инцидентов.
Вход: CSV с колонками incident_id,occurred_at,detected_at,contained_at (ISO 8601, UTC).
Если occurred_at неизвестен (типично для реальных инцидентов), используйте detected_at как точку отсчёта
для MTTR и считайте MTTD отдельно только там, где occurred_at подтверждён журналами."""
import csv
import sys
from datetime import datetime
from statistics import mean, median

def parse(ts):
    return datetime.fromisoformat(ts.replace("Z", "+00:00"))

def load(path):
    rows = []
    with open(path, newline="") as f:
        for row in csv.DictReader(f):
            rows.append(row)
    return rows

def main(path):
    rows = load(path)
    mttd_hours, mttr_hours = [], []
    skipped_mttd = 0
    for r in rows:
        if r.get("occurred_at"):
            d = (parse(r["detected_at"]) - parse(r["occurred_at"])).total_seconds() / 3600
            mttd_hours.append(d)
        else:
            skipped_mttd += 1
        resp = (parse(r["contained_at"]) - parse(r["detected_at"])).total_seconds() / 3600
        mttr_hours.append(resp)

    print(f"Инцидентов в выборке: {len(rows)}")
    if mttd_hours:
        print(f"MTTD: среднее {mean(mttd_hours):.1f} ч, медиана {median(mttd_hours):.1f} ч (из {len(mttd_hours)} записей с известным occurred_at)")
    print(f"MTTD пропущено (нет occurred_at): {skipped_mttd}")
    print(f"MTTR: среднее {mean(mttr_hours):.1f} ч, медиана {median(mttr_hours):.1f} ч")

if __name__ == "__main__":
    main(sys.argv[1] if len(sys.argv) > 1 else "incidents.csv")

Результат проверки

На тестовой выборке из пяти инцидентов, где у одного момент начала не был зафиксирован (типичная ситуация — узнали по факту, когда всё уже началось), скрипт корректно пропустил эту запись при расчёте MTTD, но учёл её в MTTR (для MTTR нужно только время обнаружения, которое всегда известно):

Инцидентов в выборке: 5
MTTD: среднее 3.2 ч, медиана 0.4 ч (из 4 записей с известным occurred_at)
MTTD пропущено (нет occurred_at): 1
MTTR: среднее 1.3 ч, медиана 1.0 ч

Разница между средним (3.2 ч) и медианой (0.4 ч) MTTD в этом примере — не ошибка, а реальная картина: четыре из пяти инцидентов были обнаружены почти мгновенно, а один — только через 12 часов, и этот единственный случай утащил среднее значение далеко от того, что происходит в большинстве случаев. Для отчёта используйте и то, и другое: медиана показывает типичный случай, среднее — чувствительно к редким, но долгим провалам, которые часто важнее знать отдельно.

Порядок внедрения

  1. Фиксируйте все три отметки времени в карточке инцидента с самого начала процесса, а не восстанавливайте задним числом.
  2. Честно помечайте неизвестное начало инцидента, а не придумывайте точную дату, чтобы метрика выглядела полнее — это искажает MTTD в обе стороны непредсказуемо.
  3. Считайте обе метрики отдельно и не смешивайте «инцидент закрыт» в одно число — скрытие на этапе до обнаружения и скорость реакции после обнаружения требуют разных улучшений (мониторинг против процесса реагирования).
  4. Приводите медиану вместе со средним в любом отчёте для руководства — одно число без контекста создаёт ложное чувство точности.
  5. Используйте результат для приоритетов, не для оценки конкретных сотрудников: один долгий инцидент не повод наказывать дежурного, если причина в отсутствии нужного правила мониторинга.

Диагностика

Симптом Причина и что делать
MTTD кажется подозрительно маленьким Возможно, occurred_at на самом деле записывается как время обнаружения «на глаз», а не восстановленное по журналам. Сверяйте с реальными данными мониторинга, а не с догадкой
Среднее и медиана сильно расходятся Это не ошибка расчёта — признак, что в выборке есть один или несколько нетипично долгих случаев. Разберите их отдельно, не усредняйте проблему
Для большинства инцидентов occurred_at неизвестен Нормально для начального уровня зрелости. Считайте MTTR как основную метрику и постепенно улучшайте восстановление времени начала через более глубокий сбор журналов
Метрика не меняется от квартала к кварталу Либо реально стабильный процесс (хорошо), либо никто не предпринимает действий по итогам отчёта. Свяжите метрику с конкретными решениями: добавить правило, обучить дежурного

Где это в модели зрелости

Материал относится к направлению «Отчётность и метрики» (материалы направления, карта зрелости). Уровень 2 требует, чтобы ключевые процессы ИБ измерялись объективно: MTTD и MTTR — две из самых проверяемых и наглядных метрик для демонстрации прогресса (или его отсутствия) в реагировании на инциденты.

Как проверить

  1. Карточка каждого инцидента фиксирует три точки времени, включая честную отметку о неизвестном начале, если это так.
  2. MTTD и MTTR считаются отдельно и регулярно, не только к ежегодному отчёту.
  3. В отчёте приводится и среднее, и медиана, с объяснением, если они сильно расходятся.
  4. Результаты связаны с конкретными решениями (новое правило, изменение процесса), а не остаются числом без действия.

Источники

  • Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.

Комментарии закрыты.