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 часов, и этот единственный случай утащил среднее значение далеко от того, что происходит в большинстве случаев. Для отчёта используйте и то, и другое: медиана показывает типичный случай, среднее — чувствительно к редким, но долгим провалам, которые часто важнее знать отдельно.
Порядок внедрения
- Фиксируйте все три отметки времени в карточке инцидента с самого начала процесса, а не восстанавливайте задним числом.
- Честно помечайте неизвестное начало инцидента, а не придумывайте точную дату, чтобы метрика выглядела полнее — это искажает MTTD в обе стороны непредсказуемо.
- Считайте обе метрики отдельно и не смешивайте «инцидент закрыт» в одно число — скрытие на этапе до обнаружения и скорость реакции после обнаружения требуют разных улучшений (мониторинг против процесса реагирования).
- Приводите медиану вместе со средним в любом отчёте для руководства — одно число без контекста создаёт ложное чувство точности.
- Используйте результат для приоритетов, не для оценки конкретных сотрудников: один долгий инцидент не повод наказывать дежурного, если причина в отсутствии нужного правила мониторинга.
Диагностика
| Симптом | Причина и что делать |
|---|---|
| MTTD кажется подозрительно маленьким | Возможно, occurred_at на самом деле записывается как время обнаружения «на глаз», а не восстановленное по журналам. Сверяйте с реальными данными мониторинга, а не с догадкой |
| Среднее и медиана сильно расходятся | Это не ошибка расчёта — признак, что в выборке есть один или несколько нетипично долгих случаев. Разберите их отдельно, не усредняйте проблему |
Для большинства инцидентов occurred_at неизвестен |
Нормально для начального уровня зрелости. Считайте MTTR как основную метрику и постепенно улучшайте восстановление времени начала через более глубокий сбор журналов |
| Метрика не меняется от квартала к кварталу | Либо реально стабильный процесс (хорошо), либо никто не предпринимает действий по итогам отчёта. Свяжите метрику с конкретными решениями: добавить правило, обучить дежурного |
Где это в модели зрелости
Материал относится к направлению «Отчётность и метрики» (материалы направления, карта зрелости). Уровень 2 требует, чтобы ключевые процессы ИБ измерялись объективно: MTTD и MTTR — две из самых проверяемых и наглядных метрик для демонстрации прогресса (или его отсутствия) в реагировании на инциденты.
Как проверить
- Карточка каждого инцидента фиксирует три точки времени, включая честную отметку о неизвестном начале, если это так.
- MTTD и MTTR считаются отдельно и регулярно, не только к ежегодному отчёту.
- В отчёте приводится и среднее, и медиана, с объяснением, если они сильно расходятся.
- Результаты связаны с конкретными решениями (новое правило, изменение процесса), а не остаются числом без действия.
Источники
- Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.


















