Перейти к содержанию

Журнал аудита

Экран «Журнал аудита» раздела «Администрирование» — сквозная история действий в модуле лояльности: кто, что и когда делал, и отдельно — кто обращался к персональным данным клиентов (просматривал карточку, искал по списку или выгружал реестр). Экран предназначен офицеру безопасности и администратору: по нему разбирают инциденты, отвечают на запросы регулятора и жалобы клиентов о том, кто и зачем смотрел их данные.

Журнал пишется автоматически — перехватчиком запросов, а отдельные доменные действия (см. ниже) модуль записывает сам. Отдельного пишущего API у журнала нет, и никакое действие в интерфейсе не может создать или изменить запись журнала напрямую.

Что попадает в журнал

Что фиксируется Пример
Любой изменяющий запрос (POST / PUT / DELETE / PATCH) — успешный и отклонённый Сохранение акции, отклонённая попытка удалить используемый справочник (403/422)
Просмотр карточки одного субъекта персональных данных Открытие карточки клиента
Поиск с отбором по списку Поиск клиента по телефону в каталоге
Выгрузка массива данных Выгрузка ленты изменений клиентов, отчёт по пакету ручных операций, выгрузка самого журнала аудита
Доменное действие, которое модуль записывает сам, в дополнение к записи о запросе Действие согласования запуска акции, смена курса валюты или пары обмена (см. ниже)

Доменные действия записываются с видом обращения «Изменение»; в графе «Метод» стоит код действия, в графе «Объект» — затронутый объект:

Метод Объект Когда пишется
PROMOTION_APPROVAL_SUBMIT, PROMOTION_APPROVAL_APPROVE, PROMOTION_APPROVAL_REJECT, PROMOTION_APPROVAL_CANCEL promotion:<id> Отправка акции на согласование, согласование, отклонение, отмена согласования — в том числе автоматическая, когда акцию содержательно изменили после отправки.
currency.rate.change Код валюты, прежний и новый курс Смена курса валюты в справочнике валют.
exchange-pair.rate.change Направление пары и изменение курса Смена курса пары обмена валют.

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

Состав записи

Поле Описание
Время Дата и время действия.
Пользователь Учётная запись, выполнившая действие.
Вид обращения Одно из: «Изменение», «Просмотр карточки», «Поиск», «Выгрузка» (см. ниже).
Метод HTTP-метод или доменное действие.
Объект Путь запроса или идентификатор затронутого объекта.
Результат HTTP-код ответа (в т. ч. отклонения 403 / 422 / 404); отказ в доступе выделен как ошибка.
Субъект ПДн Внешний идентификатор клиента — заполнен только для просмотра одной карточки.
Записей отдано Число отданных записей — мера раскрытия при поиске и выгрузке.
Роли на момент действия Продуктовые роли пользователя на момент, когда действие произошло — не текущие.
Критерии отбора Имена применённых параметров фильтра — без значений.
Источник Адрес, с которого пришёл запрос.
Идентификатор запроса Технический traceId для сквозной корреляции с логами (колонка скрыта по умолчанию).

Часть колонок скрыта в таблице по умолчанию (роли на момент действия, критерии отбора, идентификатор запроса) — их включают шестерёнкой настройки таблицы, когда разбирают конкретный случай.

Роли фиксируются на момент действия

Роль могли выдать или отозвать позже — по текущему состоянию учётных записей нельзя достоверно восстановить, с какими правами человек действовал в момент запроса. Поэтому журнал хранит именно роли на тот момент, а не ссылку на текущий профиль пользователя.

Источник — адрес клиента, а не прокси

Скомпрометированная учётная запись часто видна как всплеск действий с незнакомого адреса — поэтому в записи фиксируется адрес клиента, а не адрес балансировщика или прокси перед модулем.

Значения фильтров в журнал не пишутся

В критериях отбора сохраняются только имена применённых параметров, а не введённые значения: поиск в модуле идёт в том числе по телефону и почте, и сохранение значения фильтра превратило бы средство контроля персональных данных в ещё одно их хранилище.

Виды обращения

Вид Значение
Изменение Любой изменяющий запрос — пишется для каждого такого вызова, включая отклонённые.
Просмотр карточки Открытие карточки одного клиента — раскрывает данные одного человека.
Поиск Поиск/отбор по списку — раскрывает данные многих клиентов сразу.
Выгрузка Выгрузка массива данных наружу — самый тяжёлый вид обращения; сама выгрузка журнала тоже фиксируется этим видом.

Разделение видов не формальность: при разборе инцидента открытие одной карточки и выгрузку тысяч записей нельзя мерить одной меркой — поэтому у записи есть и число отданных записей.

Фильтры

Над таблицей — поиск по пользователю (кто действовал) и колоночные фильтры:

Фильтр Что отбирает
Пользователь Учётная запись (свободный поиск по значению).
Время Период — начало и конец дня выбранного диапазона в часовом поясе программы.
Вид обращения Один из четырёх видов (одиночный выбор).
Субъект ПДн Внешний идентификатор клиента — найти всё, что делали с карточкой конкретного человека.

Общего свободного поиска по всем графам нет — сервер его не поддерживает, и имитировать его на клиенте нельзя: журнал ищут по перечисленным осям отбора.

Порядок строк в таблице фиксированный (свежие сначала); сортировки по колонкам нет — сервер её не применяет.

Выгрузка за период

Кнопка «Выгрузить период» над таблицей отдаёт журнал за выбранный период файлом CSV — потоком, а не текущей страницей: в файл попадает весь период, каким бы длинным он ни был.

  • Период обязателен: без выбранного диапазона в колонке «Время» кнопка предупреждает «Выберите период в колонке «Время» — выгрузка идёт за период» и запрос не отправляется.
  • Подсказка на кнопке: «Выгружается весь выбранный период, а не текущая страница».
  • Состав граф в выгруженном файле тот же, что у записи на экране (включая роли на момент действия и источник); порядок граф в файле свой, под построчное чтение, а не тот, что в таблице экрана.
  • Порядок строк в файле — хронологический (от старых к новым), в отличие от экрана: журнал выгружают, чтобы разбирать последовательность событий, а не смотреть последние.
  • Файл — в диалекте, который сам модуль умеет читать обратно (разделитель ;, кавычки по RFC 4180, кодировка UTF-8 с меткой порядка байтов для корректного открытия в Excel).
  • Сама выгрузка попадает в журнал как обращение с видом «Выгрузка»: в выгруженных записях есть идентификаторы клиентов, чьи карточки просматривали, и выгрузивший журнал раскрывает их разом. В записи об этом действии сохраняется число выгруженных строк.

Защита журнала от подделки

Журнал доступен только на чтение и через экран, и через API — отдельного пишущего интерфейса нет. Защита от изменения журнала в обход приложения (например, прямым доступом к базе) действует всегда:

  • запись журнала нельзя изменить никогда — исправлений или редактирования задним числом в продукте не предусмотрено;
  • запись, сохранность которой уже подтверждена контрольным механизмом (печатью целостности), нельзя и удалить — удалить можно только ещё не опечатанную запись, в рамках регламентированной ротации старого периода; снятие печатей для такой ротации видно по разрыву цепочки при проверке;
  • периодическая проверка целостности показывает, цела ли история журнала за всё время, или в ней есть следы вмешательства, — и сколько записей до сих пор не защищено печатью, хотя уже должно быть. Ответ «цел» относится только к опечатанной части журнала: если печатей нет, он ничего не гарантирует.

На контурах, где это дополнительно требуется, включаются сами печати целостности (append-only с контрольным механизмом) — без них действуют только первые два правила.

Административная сторона этой защиты (принцип печатей, ключ, эксплуатационные параметры, передача событий в SIEM) — в руководстве администратора, раздел «Безопасность».

Управление доступом

Собственной роли у журнала аудита нет — доступ к чтению и к выгрузке закрыт общей ролью мониторинга:

Роль Возможности
LOYALTY_MONITORING_READ Просмотр журнала, отбор по фильтрам, выгрузка за период.

Программный интерфейс

Метод и путь Назначение Роль
GET /v1/admin/audit Журнал аудита с фильтрами (пользователь, период, вид обращения, субъект ПДн), постранично. LOYALTY_MONITORING_READ
GET /v1/admin/audit/export?from=&to= Выгрузка журнала за период в CSV, потоком. LOYALTY_MONITORING_READ
GET /v1/admin/audit/integrity Проверка целостности журнала (для контуров с включённой защитой от подделки). LOYALTY_MONITORING_READ

Пример записи в ответе GET /v1/admin/audit:

{
  "id": 48213,
  "at": "2026-09-10T08:15:32Z",
  "actor": "ivanova",
  "action": "GET",
  "target": "/v1/customers/CUST-100500",
  "status": 200,
  "traceId": "6f2a...",
  "accessKind": "READ",
  "subjectExternalId": "CUST-100500",
  "itemCount": 1,
  "criteria": null,
  "actorRoles": "LOYALTY_CUSTOMER_READ,LOYALTY_MONITORING_READ",
  "sourceIp": "10.20.30.40"
}