Журнал аудита¶
Экран «Журнал аудита» раздела «Администрирование» — сквозная история действий в модуле лояльности: кто, что и когда делал, и отдельно — кто обращался к персональным данным клиентов (просматривал карточку, искал по списку или выгружал реестр). Экран предназначен офицеру безопасности и администратору: по нему разбирают инциденты, отвечают на запросы регулятора и жалобы клиентов о том, кто и зачем смотрел их данные.
Журнал пишется автоматически — перехватчиком запросов, а отдельные доменные действия (см. ниже) модуль записывает сам. Отдельного пишущего 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"
}