Периодические скриншоты порождают шум; вам нужны важные моменты
Подход к записи сессий по умолчанию — делать скриншот каждые несколько секунд. Результат — каталог, полный похожих друг на друга кадров: пользователь читает страницу, пользователь читает страницу, пользователь всё ещё читает страницу — с настоящими важными событиями где-то между двумя снимками, приходящими слишком поздно и показывающими лишь результат.
Периодический захват также упускает ответ на самый важный вопрос любого аудита или расследования: что пользователь сделал? Снимок, сделанный через 1,5 секунды после клика, не показывает, на что кликнули. Снимок, сделанный через 3 секунды после отправки формы, не показывает, что было набрано. В аудиторском журнале есть события без контекста; в скриншотах есть контекст без событий. Их связывание — ручная работа, плохо масштабирующаяся с числом сессий.
ZeroLeak использует другой подход. Скриншоты инициируются не таймером, а самими событиями. Навигации захватывают два скриншота — страницу до клика и после загрузки новой страницы — так что причина и следствие сохраняются как пара. На каждом захвате отрисовывается положение мыши, чтобы было видно, на что кликнули. Ввод с клавиатуры буферизуется в читаемые слова. Под этим непрерывно записывается видео, чтобы промежутки между захваченными событиями при необходимости всё ещё можно было воспроизвести.
Захват по событиям, непрерывное видео, читаемый текст
Для каждой сессии параллельно работают три подсистемы записи: скриншоты по событиям в критические моменты, непрерывное видео FFmpeg с настроенной частотой кадров и структурированный журнал событий с пословно буферизованным вводом клавиатуры и полной активностью буфера обмена. Каждую можно включить или отключить для каждого защищаемого сервиса; по умолчанию все три работают вместе, чтобы реконструкция всегда была возможна.
Скриншоты инициируются не таймером, а событиями
Захваты инициируются реальными действиями пользователя — кликами, навигациями страниц, отправками клавиш, отправками форм, операциями буфера обмена. Нет опроса по времени, заполняющего диск пустыми кадрами. Каждый скриншот захватывает важный момент; каталог не длинный и шумный, а короткий и информативный.
На каждом скриншоте отрисовывается курсор мыши
На каждом захваченном скриншоте положение мыши отмечено видимым указателем — красной точкой в точных координатах клика или наведения. Вы видите, на что пользователь кликнул, а не страницу-результат клика. Реконструкция намерения по одному кадру, а не многокадровая головоломка.
Пара «до и после» при каждой навигации
Когда пользователь навигирует, захватываются два скриншота — один страница до клика, другой целевая страница после полной загрузки нового контента. Причина и следствие сохраняются как пара. Проверяющий видит «пользователь кликнул по ссылке X, следующая загруженная страница была Y» как два смежных кадра.
Ввод с клавиатуры буферизуется в читаемые слова
Отдельные key events накапливаются в буфере, сбрасываемом на пробеле, enter, tab или короткой паузе. Результат читается как текст, который набирал пользователь, а не как дамп key-за-key. Backspace сохраняются как отметки [BS], чтобы исправления были видны. Повторяющиеся клавиши (удерживаемые) отфильтровываются. Операции буфера обмена записываются отдельно вместе с реальным содержимым.
Что захватывает подсистема записи
Каждый механизм захвата настраивается независимо для каждого защищаемого сервиса и работает без влияния на производительность пользовательской сессии. Три потока (скриншоты, видео, журнал событий) выровнены по меткам времени, чтобы проверяющий мог беспрепятственно переключаться между ними.
Триггеры скриншотов по событиям
Скриншоты инициируются при кликах пользователя, навигациях (с парой «до и после»), отправках форм, отправках клавиш (Enter), операциях буфера обмена (копировать, вырезать, вставить), захватах, вручную инициированных из консоли оператора, и нескольких других важных типах событий. Полный список событий настраивается для каждого защищаемого сервиса.
Ожидание network-idle для захватов навигации
При навигации целевой скриншот захватывается только после того, как новая страница завершила загрузку — с ожиданием затихания сети плюс короткой дополнительной задержки рендеринга. Захваченный скриншот показывает страницу так, как её действительно увидит пользователь, а не наполовину загруженное промежуточное состояние.
Непрерывное видео FFmpeg с настроенной частотой кадров
Под скриншотами по событиям сессия непрерывно записывается как видео с использованием x11grab от FFmpeg. Частота кадров настраивается (по умолчанию 10 fps для компактных файлов; для захвата высокой детализации доступны более высокие частоты). Видео разбивается на сегменты для безопасной потоковой передачи и replay; сегменты помечены метками времени для выравнивания с потоками скриншотов и журнала событий.
Пословно буферизованная запись ввода с клавиатуры
Key events накапливаются в буфере, сбрасываемом на границах слов (пробел, enter, tab) или после короткой пустой паузы. Сброшенная строка читается как текст — «привет мир [BS][BS][BS][BS][BS]здравствуй мир» — сохраняя намерение пользователя и его исправления без шума каждого отдельного события keydown.
Активность буфера обмена, захваченная вместе с содержимым
Операции копирования, вырезания и вставки записываются отдельно от ввода с клавиатуры, включая соответствующее реальное содержимое буфера обмена. Проверяющий видит, что именно было скопировано и что вставлено, а не только то, что произошло событие буфера обмена.
Последовательная нумерация и поиск
Скриншоты нумеруются последовательно (0001, 0002, ...) и хранятся с меткой времени и метаданными события. Консоль оператора перечисляет их вместе с инициировавшим событием, чтобы проверяющий мог сразу перейти к интересующему моменту — например, ко всем захватам по буферу обмена в сессии или к паре навигации вокруг конкретного URL.
Журнал событий — что записывается помимо кликов
Помимо скриншотов и видео, структурированный журнал событий захватывает историю взаимодействия пользователя с полным контекстом. У каждого события есть тип, метка времени, ссылка на связанный скриншот (где применимо) и соответствующий payload. Именно это делает журнал не просто визуально проглядываемым, а доступным для поиска и полезным для аналитики.
Клики мыши с координатами и целевым элементом
Каждое событие клика записывает координаты x/y и DOM-элемент под курсором (тег, класс, ID, текстовое содержимое, когда доступно). Проверяющий может искать в записи сессии клики по конкретной кнопке или ссылке, не проглядывая скриншоты в поисках одного из них.
События прокрутки (throttled)
Изменения положения прокрутки записываются с throttle, чтобы избежать спама в журнале. Разрешения достаточно для реконструкции того, куда пользователь смотрел на длинных страницах, но без порождения тысяч ненужных событий прокрутки в минуту.
События навигации, включая изменения маршрутов SPA
Каждая навигация — полные загрузки страниц, изменения pushState одностраничных приложений, программные изменения местоположения — логируется с исходным URL, целевым URL, триггером (клик по ссылке, ручной, программный) и временем завершения. SPA-навигации, которые упускает традиционное логирование, перехватываются слоем опроса URL ZeroLeak.
События отправки форм со ссылками на поля
Когда пользователь отправляет форму, журнал событий захватывает action URL формы, метод и имена полей. Реальные значения полей захватываются через запись ввода с клавиатуры (так что история набора сохраняется), а не дублируются в событии формы.
Переходы между простоем и активностью
Сессия отслеживает активность пользователя на входном слое. Переходы между активным и простаивающим состояниями записываются с метками времени, чтобы проверяющие могли видеть периоды внимания и бездействие — полезно для проверки соответствия и вопросов аудита на основе времени.
Метаданные уровня сессии в конце сессии
В конце сессии записываются сводные метаданные: общая продолжительность, распределение простоя и активности, общее число событий каждого типа, произведённые скриншоты, ссылки на видеофайлы и причина завершения (тайм-аут, ручное завершение, ошибка). Если настроен webhook координатора, эта сводка инициируется и для него.
Где запись сессий раскрывает свою ценность
Аудиты соответствия и проверки регуляторов
Регуляторы, спрашивающие, что конкретные пользователи делали в конкретных сессиях, — проверка HIPAA по доступу к записям пациентов, соответствие финансового инвестиционного стола, аудиты государственной обработки данных. Захват по событиям производит на сессию короткий и информативный след, по которому проверяющие могут быстро перемещаться.
Расследование инсайдерской угрозы
При подозрении на утечку или нарушение политики следователь должен знать, что именно пользователь делал, — а не только когда. Последовательные скриншоты с отметкой мыши, пословно буферизованный ввод с клавиатуры и полное содержимое буфера обмена делают сессию детально воспроизводимой без часов просмотра видео.
Аудит доступа подрядчиков и третьих сторон
Внешние пользователи, которым в вашу среду дано лишь право просмотра. Полная запись на сессию — вместе с видимым водяным знаком, идентифицирующим пользователя, — обеспечивает подотчётность за всё, что они видели, и каждое действие, которое они совершили, на протяжении окна доступа.
Анализ операционных инцидентов
После неожиданного события на консоли SCADA или операционной консоли запись показывает, что именно оператор видел в предыдущие моменты и на какие элементы управления он кликал. Пара «до и после» при навигации значительно ускоряет диагностику каскадных ошибок.
Часто задаваемые вопросы
Сколько хранилища потребляет типичная сессия?
Знает ли пользователь, что его записывают?
Что происходит с записью, если сессия внезапно завершается?
Как проверяющие перемещаются по записанной сессии?
Как это сочетается с водяным знаком и изоляцией?
Может ли защищаемое приложение отключить запись или вмешаться в неё?
Посмотрите запись по событиям в живой демонстрации
Мы откроем сессию, кликнем по нескольким ссылкам, заполним несколько форм, скопируем какой-то контент и покажем итоговый каталог скриншотов, журнал клавиатуры и видеосегменты — и то, как проверяющий реконструирует из них сессию.