Тема
05.05 Audit Logs
Статус: черновик для обсуждения
1. Назначение документа
Этот документ описывает audit log requirements для Back Office и domain entities.
Audit logs нужны, чтобы понимать:
- кто изменил данные;
- что именно изменилось;
- когда это произошло;
- к какой entity относится изменение;
- какие old/new values были у измененных non-secret fields;
- почему система или user пришли к текущему состоянию configuration.
Audit log является обязательным элементом MVP.
2. Где доступен audit log
Audit log должен быть доступен:
- в Platform section как global audit log;
- в Merchant section как merchant-scoped audit log;
- на странице каждой сущности как вкладка
Audit Logs.
3. Global audit log
Global audit log в Platform section нужен для platform users.
Platform user с permission может видеть audit logs по всей системе или по доступному scope.
Global audit log должен поддерживать filters:
- date/time;
- actor;
- entity type;
- entity ID;
- action type;
- merchant / merchant group / brand context, если он выводится из entity;
- source;
- changed field;
- search by text/ID.
4. Merchant-scoped audit log
Merchant section должен иметь audit log, который показывает только события по доступным merchant context.
Merchant user с permission видит audit logs только по:
- merchants, к которым у него есть доступ;
- merchant groups, к которым у него есть доступ;
- entities, которые он имеет право видеть;
- fields, которые доступны по visibility rules и не являются secret values.
Merchant user не должен видеть audit events, которые раскрывают hidden provider/internal information.
5. Audit Logs tab on entity pages
На странице каждой сущности должна быть вкладка:
text
Audit LogsЭто относится к сущностям:
- Merchant;
- Merchant Group;
- Brand;
- User;
- Role;
- API Key;
- Payment Method / MID;
- MASTER MID;
- SUB MID;
- SUB MID Aggregator;
- Routing Rule;
- Velocity Rule;
- FX / Fee configuration;
- Transaction;
- Webhook;
- System Settings, если такая page появится после MVP.
Entity audit tab показывает audit events только по этой entity и связанным changes.
6. Какие действия логируем
Audit log пишется на:
- create;
- update;
- delete;
- status change;
- access change;
- role assignment;
- role removal;
- permission change;
- user merchant access added;
- user merchant access removed;
- user merchant role changed;
- user merchant group access added;
- user merchant group access removed;
- automatic user access recalculated after merchant group membership change;
- API key creation;
- API key rotation;
- API key revoke;
- routing configuration change;
- velocity configuration change;
- FX / fee configuration change;
- transaction correction;
- manual webhook resend;
- session termination by platform admin;
- invite created / resent / accepted / expired;
- invite rejected because email already exists;
- password reset completed;
- 2FA setup completed.
7. View actions
Обычные view actions не нужно писать в audit log.
Например, не нужно логировать:
- user opened transaction details;
- user opened provider raw data;
- user opened merchant page;
- user opened audit log tab.
Если в будущем появится compliance requirement логировать просмотр sensitive data, это должно быть описано отдельно.
8. Auth/session events
Auth/session events тоже должны логироваться.
Они могут храниться:
- в общем audit log;
- или в отдельном security log.
Для MVP продуктово важно, чтобы platform users с permission могли расследовать auth/session events.
Минимально логируем:
- login success;
- login failed;
- logout, если технически фиксируется;
- session created;
- session terminated by owner;
- session terminated by platform admin;
- password reset requested;
- password reset completed;
- 2FA setup completed;
- 2FA failed;
- invite events;
- user access changes;
- role/permission changes.
Точная физическая модель audit log vs security log может быть определена development team.
9. Audit event structure
Каждый audit event должен содержать:
- event ID;
- timestamp;
- actor user ID;
- actor user email;
- actor user type;
- actor IP, если доступно;
- actor user agent, если доступно;
- source;
- action type;
- entity type;
- entity ID;
- entity display name, если доступно;
- context type;
- changed fields;
- old values for changed non-secret fields;
- new values for changed non-secret fields;
- reason/comment, если был указан;
- request ID / correlation ID, если доступно.
merchantId, brandId и merchantGroupId не являются обязательными базовыми fields audit event.
Context должен определяться через:
- entity type;
- entity ID;
- связи самой entity.
Причина: не все сущности находятся внутри merchant / brand / merchant group context. Например, user или platform role могут не относиться к конкретному merchant.
Если development team решит денормализовать context fields для быстрого поиска, это техническая оптимизация, а не product requirement.
request ID / correlation ID - это технический identifier для связи audit event с API request, logs, traces и другими system events.
Actor IP and user agent should be stored for Back Office user actions and login/security events.
Product owner не должен задавать его формат. Development team должна выбрать naming и propagation approach.
10. Old value / new value
Audit log должен хранить old value и new value для измененных non-secret fields.
Это нужно для:
- investigation;
- rollback planning;
- support;
- understanding configuration changes;
- accountability.
Secret values не должны сохраняться в audit log ни в открытом, ни в masked виде.
Для secret field audit event должен показывать только факт изменения field.
Пример:
text
changedFields: ["providerSecretKey"]
oldValues: {}
newValues: {}
message: "Secret field was updated"Обычные non-secret fields должны сохранять old/new values.
11. Secret values
Secret values не должны храниться в audit log.
Нельзя сохранять ни actual value, ни masked copy, ни encrypted copy в audit log для:
- API key secret;
- provider credentials;
- provider secret keys;
- passwords;
- 2FA secrets;
- reset codes;
- invite tokens;
- session tokens;
- webhook signing secrets, если такие появятся;
- любые private keys / tokens.
Audit log может показывать безопасный факт изменения:
text
providerSecretKey: updatedДля non-secret sensitive fields, например email или IP, visibility/masking rules могут применяться отдельно в зависимости от permissions и UI context.
12. Visibility and secrecy
Audit log visibility зависит от:
- user type;
- permissions;
- merchant access;
- merchant group access;
- entity visibility rules;
- secret data rules.
Platform user с permission может видеть все audit logs в рамках своего access scope.
Merchant user с permission видит только merchant-safe audit logs.
Если audit event относится к platform-hidden SUB MID / SUB MID AGGREGATOR / provider configuration, merchant user не должен видеть скрытые детали.
13. Immutability
Audit log immutable.
Audit events нельзя:
- редактировать из UI;
- удалять из UI;
- переписывать обычным user action.
Если нужно исправить ошибочную информацию, создается новый audit event / correction event.
14. Export
Audit logs можно экспортировать только users с соответствующей permission.
Export должен учитывать:
- permissions;
- visibility rules;
- secret data rules;
- merchant / merchant group access.
Secret values не должны попадать в export.
14.1 Retention
Audit/security logs должны храниться indefinitely.
Product requirement:
text
Audit/security events are retained indefinitely / always.Если future legal/security/compliance constraints require different retention, security/legal team должна предложить отдельное решение.
15. Acceptance Criteria
Audit Logs считаются согласованными для MVP, если:
- Audit log доступен в Platform section.
- Audit log доступен в Merchant section.
- На странице каждой сущности есть вкладка Audit Logs.
- Audit log пишется на create/update/delete/status changes/access changes.
- Audit log не пишется на обычные view actions.
- Auth/session events логируются в audit/security log.
- User access changes логируются отдельными audit events.
- Merchant user видит audit logs только по доступным merchants/entities.
- Platform user с permission видит audit logs в рамках своего scope.
- Audit log хранит old/new values для non-secret fields.
- Secret values не сохраняются в audit log.
- Merchant/brand/merchant group context выводится из entity, а не является обязательным base field.
- request ID / correlation ID является техническим identifier для связи audit/logs/traces.
- Actor IP/user agent сохраняются для Back Office actions и login/security events, если доступны.
- Audit log immutable.
- Audit events нельзя редактировать/удалять из UI.
- Audit export учитывает permissions, visibility и secret data rules.
- Audit export входит в MVP.
- Audit/security logs хранятся indefinitely.
16. Open Questions
Product open questions отсутствуют.
Technical/design follow-up:
- Решить, будет ли auth/session log физически частью audit log или отдельным security log.
- Определить exact list of entity types for MVP.
- Определить exact naming для
requestId,correlationIdилиtraceId. - Определить storage/indexing approach для поиска по audit logs.