open atlas
↑ К треку
Защитная безопасность BLUE · 01 · 01

Что логировать

Нельзя обнаружить, расследовать или доказать инцидент, который ты не залогировал. Фиксируй каждое событие входа, доступа и админ-операции с контекстом, достаточным, чтобы восстановить кто-что-с-чем сделал, — и следи, чтобы секреты, токены и PII никогда не попадали в лог.

BLUE Middle ◷ 15 min
Уровень
ОсновыJuniorMiddleSenior

Два часа ночи, дежурный смотрит в письмо от вендора: «учётки из вашего тенанта использовались для экспорта 40 тысяч записей в прошлый вторник». Она открывает логи. Логи приложения показывают 200 и 500 — бесполезно. В access-логе есть IP, но нет идентификаторов пользователей. Нигде не записано, кто дёрнул эндпоинт экспорта, какие записи и когда была создана сессия. Пробой реальный; доказательств нет. Отчёты об утечках год за годом ставят медианное время пребывания атакующего — от проникновения до обнаружения — в несколько недель, и главная причина, почему это не минуты, в том, что события, которые загорелись бы в первый же день, просто не были записаны. Нельзя алертить, расследовать или доказать действие, которое ты никогда не залогировал.

К концу урока ты будешь точно знать, какие связанные с безопасностью события фиксировать, какой контекст превращает строку лога в доказательство и что нельзя допускать в лог ни при каких условиях.

Логирование — это подложка обнаружения

Прежде чем обнаружить атаку, сдержать инцидент или доказать в разборе, что произошло, событие должно где-то надёжно существовать. Лог — это не отладочное удобство, которое прикручивают для разработчиков, а сырьё, из которого построена каждая последующая защитная способность. Твой SIEM коррелирует строки логов. Твои алерты срабатывают на паттерны в строках логов. Твой таймлайн инцидента и есть последовательность строк логов. NIST SP 800-92 формулирует это прямо: управление логами — это дисциплина генерации, передачи, хранения и анализа записей, позволяющих восстановить связанную с безопасностью активность. Если событие не зафиксировано в момент, когда оно происходит, никакой умный тулинг постфактум его уже не восстановит.

Поэтому «что логировать» — решение архитектуры безопасности, а не вопрос удобства разработчика. Действия атакующего ложатся на наблюдаемые техники — их каталогизирует MITRE ATT&CK: доступ к учётным данным, повышение привилегий, эксфильтрация данных, обход защиты. Каждое из них оставляет след тогда и только тогда, когда нужное событие было инструментировано. Работа защитника — сделать так, чтобы каждое значимое действие порождало сигнал, на который потом можно среагировать. Недологируешь — и ты слепой; атакующий неделями работает в тишине. Перелогируешь не то — сольёшь сырые тела запросов, полные заголовки, секреты — и ты построил вторую утечку: гигантское поисковое хранилище учёток и PII, которое само теперь стало мишенью.

Что фиксировать: классы событий безопасности

Отбрось шум. События, стоящие своей цены хранения, — те, что реально нужны следователю или правилу алерта. В грубом порядке приоритета:

Класс событийПримерыПочему важно
АутентификацияУспех/провал входа, выход, запрос MFA, сброс пароля, выпуск/обновление токенаBrute force, credential stuffing, захват аккаунта проявляются здесь первыми
АвторизацияОтказ в доступе (403), использование привилегии, смена роли/прав, выборка с проверкой владельцаВсплеск 403 — это разведка; выданная смена привилегий — эскалация
Админ и конфигСоздание/удаление пользователя, выдача роли, генерация API-ключа, переключение фичефлага, смена настройки безопасностиВысокий радиус поражения; первая остановка для инсайдера и пост-компрометации
Доступ к чувствительным даннымМассовый экспорт, чтение PII, генерация отчёта, скачивание регулируемых записейЭксфильтрация — это «обычные» чтения в ненормальном объёме, невидимые без этого
Ввод и целостностьОтказы валидации, провалы подписи, срабатывания rate-limit, аномальные payload’ыПрощупывание и инъекции всплывают как скачок отказов
Целостность логовСтарт/стоп логирования, пропуски, смена часов, ошибки аудит-пайплайна«Обход защиты» — атакующие чистят логи; отсутствие логов само сигнал

Заметь паттерн: ты логируешь связанное с безопасностью решение, а не каждую строку бизнес-кода. Удачный просмотр товара — шум. 403 на /api/admin/users — решение авторизации, достойное записи, потому что всплеск таких — это кто-то картографирует твою модель прав. Зрелый рефлекс — инструментировать узкие места: слой аутентификации, middleware авторизации, админ-обработчики, пути экспорта данных — один раз, централизованно, чтобы покрытие не зависело от того, вспомнит ли каждый автор фичи добавить вызов лога.

Контекст — это то, что делает строку доказательством

Лог со словами error: forbidden бесполезен через три недели. Строка обязана отвечать на пять вопросов следователя: кто, что, с-чем, когда, откуда. Это означает структурированное событие (JSON, а не свободный текст, который потом будешь парсить регэкспом), несущее как минимум: стабильный id актора (id пользователя или сервисного принципала — никогда просто отображаемое имя), действие, целевой ресурс и его id, авторитетную серверную метку времени, исходный IP и user-agent, correlation/request id, чтобы сшить запрос между сервисами, и исход (разрешено/отказано, успех/провал). 403 без id актора и id ресурса говорит, что что-то заблокировали; он не говорит, что тот же аккаунт только что заблокировали 400 раз за 90 секунд по 400 разным id счетов — а это и есть настоящий сигнал.

Жёсткое правило: что нельзя писать в лог никогда

Логи утекают. Их шлют в сторонние SIEM, реплицируют в дешёвое холодное хранилище, читают инженеры поддержки, индексируют для полнотекстового поиска и хранят годами. Поэтому секрет в логе — это секрет с максимально широким радиусом поражения и максимально долгим временем жизни. Считай лог полупубличным и никогда не пиши: пароли (даже «неверные» — они раскрывают паттерн пользователя и часто верный пароль с опечаткой), сессионные токены, API-ключи, JWT и bearer-заголовки, полные номера карт (PCI-DSS запрещает это прямо: хранить полный PAN в логах нельзя, а CVV не допускается вообще) и немаскированные PII сверх того, что нужно расследованию, — государственные id, полные медкарты, сырые заголовки Authorization. Механизм, причиняющий это, почти всегда — перезахват: кто-то логирует всё тело запроса или все заголовки «на всякий случай», и теперь каждый пароль и токен, что когда-либо прошёл, лежит в Elasticsearch.

Почему это работает

Почему логирование «всего запроса на всякий случай» — самый частый способ превратить хранилище логов в утечку? Потому что тело запроса и заголовок Authorization — ровно там живут секреты, это их работа. Сплошной log.info(req.body) или middleware, сбрасывающий все заголовки, захватывает пароли на маршруте входа, полные номера карт на оформлении и bearer-токены на каждом аутентифицированном вызове — открытым текстом, разнесённым во все места, куда лог потом путешествует. Фикс — логировать выбранные тобой поля, никогда не целые объекты: allowlist безопасных атрибутов с редактированием (****1234, Bearer ***), применяемым на границе логирования, чтобы чувствительное значение не просочилось, даже если выше по потоку появится новое поле. Allowlist того, что безопасно; никогда не blocklist того, что опасно — blocklist всегда пропускает следующее добавленное кем-то поле.

Срок хранения: достаточно долго, чтобы расследовать, достаточно коротко, чтобы быть безопасным

Срок хранения — это реальный компромисс, а не дефолт «храним всё вечно». Держи логи слишком коротко — и не расследуешь пробой, о котором узнал лишь спустя месяцы, а это нормальный случай при времени пребывания в недели и раскрытиях, что приходят ещё позже. Держи слишком долго, в неправильной форме — и ты копишь растущую кучу PII, которая стоит денег на хранении, расширяет поверхность атаки и сталкивается с законом о минимизации данных (принцип ограничения хранения в GDPR). Зрелый ответ — многоуровневый: горячее искомое хранилище для свежей активности (часто ~90 дней), чтобы обнаружение и живое расследование были быстрыми; более дешёвое неизменяемое холодное/архивное хранилище на тот более долгий горизонт, что требует твой комплаенс (часто год и более для аудита и регулируемых данных); и агрессивная минимизация или псевдонимизация PII внутри этих логов, чтобы архив был полезен для форензики, не становясь обузой. И критически — делай логи безопасности append-only / tamper-evident: стандартный ход атакующего после компрометации — удалить логи, что его раскроют, поэтому хранилище, на которое опирается следователь, должно быть таким, которое атакующий, добравшийся до сервера приложения, не сможет тихо переписать.

Выбери лучший вариант

Твой эндпоинт входа должен давать полезные логи безопасности. Коллега предлагает `log.info('login attempt', req.body)`, чтобы «ничего не потерять». Выбери верный подход.

Викторина

Атакующий эксфильтрировал 40 тысяч записей через нормально выглядящий эндпоинт массового экспорта. Какой пробел в логировании напрямую позволил этому неделями оставаться невидимым?

Викторина

Почему предпочесть allowlist безопасных полей вместо blocklist запрещённых при решении, что может содержать строка лога?

Расставь шаги по порядку

Упорядочь от высшего к низшему приоритету для логирования безопасности нового сервиса:

  1. 1 События аутентификации (успех/провал входа, MFA, выпуск токена)
  2. 2 Решения авторизации (403, использование привилегии, смена ролей)
  3. 3 Админ- и конфиг-действия (смена пользователей/ролей/ключей)
  4. 4 Доступ к чувствительным данным (массовый экспорт, чтения PII)
  5. 5 Отказы ввода/целостности (валидация, срабатывания rate-limit)
Вспомните перед уходом
  1. 01
    Какие классы событий сервис обязан логировать, чтобы быть защитимым, и какой контекст превращает строку лога в пригодное доказательство?
  2. 02
    Что нельзя писать в лог никогда, почему это обычно случается и как сюда вписываются срок хранения и устойчивость к подделке?
Итог

Нельзя обнаружить, расследовать или доказать инцидент, который ты никогда не залогировал, — логирование это подложка, на которой построена каждая последующая защитная способность, поэтому что логировать — решение архитектуры безопасности, а не удобство разработчика. Фиксируй связанные с безопасностью решения: аутентификацию, авторизацию, админ/конфиг, доступ к чувствительным данным, ввод/целостность и целостность логов, инструментированные один раз в узких местах, чтобы покрытие не зависело от каждого автора. Делай каждое событие структурированным и отвечающим кто/что/с-чем/когда/откуда плюс исход, чтобы голый 403 стал строкой, которую SIEM скоррелирует в сигнал brute force или разведки. Затем держи жёсткую линию по тому, что нельзя писать в лог: пароли, токены, ключи, JWT, полные номера карт и немаскированные PII — утечка почти всегда из перезахвата (логирование всего тела запроса или всех заголовков), поэтому allowlist безопасных полей и редактируй на границе, а не blocklist опасных. Делай хранение многоуровневым (горячее для обнаружения, холодное-неизменяемое для комплаенса, PII минимизирован повсюду) и делай хранилище append-only и tamper-evident, потому что атакующий, добравшийся до сервера, попытается стереть те самые логи, что тебе нужны. В следующий раз, когда пишешь обработчик, спроси: порождает ли он структурированное событие, на которое следователь мог бы среагировать, — и есть ли способ, которым секрет мог бы прокатиться вместе с ним в лог?

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

Примени это

Примени этот урок в реальном проекте.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.