Перейти к содержимому

Аудиторский след

Аудиторский след (в интерфейсе — «Аудиторский след») — это неизменяемый журнал, в который X7 Insight записывает каждое значимое изменение: кто его сделал, когда (по UTC), что было до и после, и — там, где это требуется, — по какой причине. Ничего из журнала нельзя отредактировать или удалить; можно только дописывать новые записи. Это фундамент воспроизводимости данных исследования; журнал спроектирован под требования 21 CFR Part 11 и EU Annex 11.

0:000:00
Чтение аудиторского следа с раскрытием «до/после» и проверкой хеш-цепочки

Две гарантии делают след доверенным:

  • Append-only (только дозапись). Записи журнала нельзя ни изменить, ни удалить — ни пользователю, ни администратору, ни даже администратору базы данных. Исправление ошибки — это всегда новая запись поверх старой, а не подмена старой.
  • Хеш-цепочка (криптографическое сцепление). Каждая запись несёт «отпечаток» (hash), в расчёт которого входит отпечаток предыдущей записи. Записи сцеплены в непрерывную цепь. Если кто-то попытается изменить, удалить или вставить запись в середину — отпечатки перестанут сходиться, и проверка это немедленно обнаружит.

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

  1. Проверка прав (PBAC). Есть ли у вас право на запись в этом поле и его области (scope). Нет — отказ, значение не меняется.

  2. Проверка блокировки. Не заблокированы ли поле или область. Под жёсткой блокировкой запись невозможна.

  3. Гейты правил. Нельзя писать в вычисляемое (derived) поле и в поле, скрытое условием скип-логики.

  4. Валидация значения. Тип, диапазон, принадлежность кодлисту — по определению поля.

  5. Причина изменения (RfC). При правке уже сохранённого значения причина обязательна; при первичном вводе — нет.

  6. Запись значения. Значение сохраняется с проверкой версии (optimistic) и сбросом зависимых осей: SDV, медобзор и кодирование возвращаются в исходное состояние, а заполненная форма переходит в «в работе».

  7. Запись в аудит. audit.append() — в той же транзакции. Изменённого значения без записи в аудите не бывает.

  8. Инвалидация подписей. Все подписи, покрывавшие это значение, автоматически становятся недействительными.

  9. Движок правил. Деривации пересчитываются каскадом (актор — система), затем отрабатывают edit-проверки: block откатывает всю запись, query открывает авто-запрос.

  10. Публикация событий. События уходят в транзакционный outbox; подписчики (модули) получают их фоновой службой — только после коммита транзакции.

Аудитируются все изменения данных, метаданных, конфигурации, доступа и рабочих объектов, а также закрытый список привилегированных чтений. Обычные чтения не аудируются (иначе журнал утонул бы в шуме).

Категория Примеры действий
Клинические данные ввод и правка значения, очистка, отметка «не выполнено», создание субъекта, смена его статуса, создание визита, завершение формы
Метаданные (дизайн) создание и публикация версии дизайна, правка формы или edit check в черновике, утверждение перевода
Рабочие объекты открытие/ответ/закрытие запроса, применение и инвалидация подписи, наложение и снятие блокировки
Доступ выдача и отзыв грантов, создание и назначение ролей, переопределение SoD-конфликта
Конфигурация изменение настройки, регистрация/включение/выключение модуля, согласие на модуль
Привилегированные чтения расслеплённое чтение слепого значения, запуск экспорта, выгрузка самого аудита

Каждая запись журнала описывает одно действие набором полей (в интерфейсе — колонки и детали строки):

Поле Что показывает
Время (UTC) момент действия по всемирному времени; локальное представление — только для удобства
Актор кто сделал: пользователь, модуль или система
Действие что произошло (например, «сохранение данных», «применение подписи»)
Сущность над каким объектом (значение, форма, субъект, грант…)
Scope путь области действия: исследование → центр → субъект → форма → поле
До / После канонические значения именно тех полей, которые изменились (не вся запись целиком)
Причина текст Reason for Change, где он обязателен
Модуль если действие выполнил модуль — какой
Вызвано событием если действие — это автоматическая реакция (например, сброс подписи), ссылка на исходное событие

X7 Insight различает первый ввод и правку уже сохранённого значения:

  • Первичный ввод (поле было пустым) причины не требует — это соответствует принципу ALCOA «одновременности» записи.
  • Любое изменение сохранённого значения, включая его очистку, требует указать причину. Без причины система не сохранит правку. Интерфейс покажет диалог с полем свободного текста и настраиваемым для исследования списком типовых причин.

Причина обязательна также для: снятия блокировки, снятия отметки SDV, отмены и переоткрытия запроса, отклонения ответа на запрос, переопределения SoD-конфликта и экстренного расслепления. Как это выглядит при вводе данных — см. Ввод данных.

Один и тот же просмотрщик открывается на разных уровнях; уровень задаёт, какие записи вы видите (и требует соответствующего права audit.read в этой области):

  • Весь арендатор — раздел Администрирование → Аудит: неизменяемый журнал всей организации.
  • Исследование — вкладка Аудит внутри исследования: только его записи.
  • Субъект и форма — тот же просмотрщик, открытый со страницы субъекта или формы: сужен до истории конкретного участника или конкретной формы.

Фильтры над таблицей: период «С (UTC)» — «По (UTC)», Актор, Действие, Тип сущности. Колонки: Время (UTC), Актор, Действие, Сущность, Scope. Клик по строке раскрывает детали «До / После», «Причина», «Модуль» и «Вызвано событием».

Кнопка «Проверить целостность журнала» запускает пересчёт всей цепочки от начала. Право на запуск — audit.verify. Результат:

  • Цепочка целостна — «проверено записей: N». Ни одна запись не была изменена, удалена или вставлена в середину.
  • Цепочка нарушена — указывается номер (seq) первой сломанной записи. Проверка ловит правку содержимого, удаление записи, вставку в середину (разрыв нумерации) и подмену причины.

Дополнительный пояс защиты — якорение: X7 Insight периодически фиксирует «голову» цепочки (её текущий отпечаток) во внешнем write-once хранилище. Это позволяет доказать целостность, даже если предположить, что кто-то с доступом к базе пересчитал всю цепочку целиком. Вся история якорей входит в каждый инспекционный пакет и пакет закрытия.