Журнал аудита¶
Журнал аудита в разделе Администрирование → Настройки → Журнал аудита (/admin/settings?tab=audit-log) отвечает на два вопроса, которые проверка безопасности задаёт экземпляру, хранящему карту всего ИТ-ландшафта: что в нём изменилось и кто и как входил в систему. Он разделён на две вложенные вкладки:
| Вкладка | URL | Что она фиксирует |
|---|---|---|
| Изменения | /admin/settings?tab=audit-log |
Каждую запись в ландшафт — карточки, связи, риски, теги, роли заинтересованных сторон, черновики решений, — сгруппированную в пакеты мутаций, с пособытийным диффом и Откатом |
| Безопасность и администрирование | /admin/settings?tab=audit-log&view=security |
Входы и выходы, неудачные попытки, блокировки, сеансы SSO и прокси, события паролей, работа от имени роли и каждое административное действие |
Они разделены намеренно. Изменения — рабочий инструмент: он нужен, чтобы увидеть и отменить ошибочную запись, и хранит короткую историю. Безопасность и администрирование — доказательный след: его записи нельзя ни изменить, ни удалить, а по умолчанию он хранится год.
Кто может его просматривать¶
Обе вкладки требуют разрешения admin.events («Просмотр журнала аудита и потока событий»), которым по умолчанию обладает только роль Admin. Чтобы дать специалисту по безопасности или комплаенсу доступ на чтение, не делая его администратором, создайте роль с admin.events в разделе Пользователи и роли и назначьте её ему.
Изменения¶
Вкладка Изменения — это реестр пакетов мутаций. Каждая запись, изменяющая данные, попадает сюда пакетом вместе с тем, кто её сделал и откуда она пришла:
| Источник | Значение |
|---|---|
| Веб | Веб-интерфейс Turbo EA |
| API | Прямой вызов REST API (скрипт, интеграция) |
| ИИ-инструмент | ИИ-ассистент, подключённый через сервер MCP |
| Расширение | Установленное расширение, фиксируется как пакет ext:<key> |
Нажмите на пакет, чтобы открыть его панель: пособытийный дифф показывает старое и новое значение каждого поля, а Откат отменяет сделанные пакетом записи карточек, связей, рисков, ролей заинтересованных сторон, тегов и черновиков решений.
Пакеты хранятся MUTATION_BATCH_RETENTION_DAYS дней (переменная окружения, по умолчанию 15), после чего удаляются автоматически. Сами события остаются на вкладке История каждой карточки и после удаления пакета.
Безопасность и администрирование¶

Вкладка Безопасность и администрирование показывает по одной записи на каждое значимое для безопасности действие, сначала самые новые:
- входы и выходы по паролю, через SSO или через доверенный обратный прокси;
- неудачные попытки входа, каждая с кодом причины, объясняющим, почему она не удалась;
- блокировки учётных записей после повторных неудач;
- регистрации, а также установка, сброс и смена паролей;
- имперсонация роли — администратор начинает и завершает режим Просмотр от имени роли…;
- административные действия — изменения пользователей, ролей, настроек, метамодели, тегов, вычислений, расширений, импортов, интеграций, публичных порталов и опубликованных диаграмм, опросов и доступа оператора (см. Административные действия);
- экспорт самого этого журнала.
В следующей версии
Экспорт данных (экспорт инвентаря в CSV/JSON, экспорт рабочей области и миграции) будет записываться в этот же журнал в следующей версии.
Столбцы¶
| Столбец | Описание |
|---|---|
| Когда | Дата и время действия |
| Категория | auth (аутентификация), admin (административные действия) или access (экспорт и другой доступ к данным) |
| Действие | Что произошло, например auth.login.failed — см. каталог действий |
| Результат | Успех или Неудача |
| Исполнитель | Вошедший в систему пользователь, выполнивший действие. Пусто, если никто не был в системе — например, при неудачном входе |
| Субъект | Учётная запись, которой касалось действие, — адрес электронной почты, введённый при неудачном входе, или пользователь, чей пароль был сброшен |
| Цель | Объект действия, если он есть, — например, роль, выбранная при начале имперсонации |
| IP | IP-адрес клиента (см. IP-адрес клиента) |
| Источник | Откуда пришёл запрос: веб, API, ИИ-инструмент, расширение, ops или система |
| Роль имперсонации | Если администратор просматривал приложение от имени другой роли — эта роль. Исполнителем остаётся настоящий администратор |
Столбцы можно показывать, скрывать, переставлять и закреплять, как в любой другой таблице данных; Когда и Действие отображаются всегда.
Фильтры¶
Боковая панель фильтров слева сужает список по категории, результату, действию, исполнителю, IP-адресу и диапазону дат. В заголовке каждого раздела указано число выбранных значений, а свёрнутая панель показывает количество активных фильтров. Вкладка Столбцы той же панели показывает, скрывает и закрепляет столбцы. Ваши фильтры и расположение столбцов запоминаются в этом браузере.
Поиск по адресу электронной почты ищет совпадения в исполнителе, субъекте и цели, поэтому один адрес находит и то, что сделал этот человек, и то, что пытались сделать с его учётной записью.
Подробности записи¶
Нажмите на строку, чтобы открыть панель записи. В ней показаны все поля, включая user agent браузера и подробности, сохранённые вместе с записью, — код причины неудачного входа, время окончания блокировки, поставщика удостоверений при входе через SSO. Если запись фиксирует изменение, подробности показываются таблицей старых и новых значений. Секреты никогда не сохраняются: пароль, токен или секрет клиента заменяется на *** до записи.
Сведения, которые поясняют изменение, но не входят в него, — текущий адрес портала и опубликован ли он, были ли заменены учётные данные подключения, какие типы охватывает сопоставление миграции, — перечислены в разделе Контекст под таблицей.
На панели нет действий. Записи нельзя ни изменить, ни удалить.
Экспорт в CSV¶
Кнопка Экспорт в CSV на панели инструментов скачивает записи, соответствующие текущим фильтрам, в виде CSV-файла — до 50 000 строк. Сам экспорт тоже фиксируется как access.audit_log.exported, так что экспорт журнала безопасности всегда оставляет в нём след.
Каталог действий¶
| Действие | Фиксируется, когда |
|---|---|
auth.login.succeeded |
пользователь входит по адресу электронной почты и паролю |
auth.login.failed |
вход по паролю отклонён. Код причины объясняет почему (см. ниже) |
auth.login.locked |
пятая подряд неудачная попытка блокирует учётную запись на 15 минут. В подробностях указано время окончания блокировки |
auth.logout |
вошедший пользователь выходит из системы. Выход без действительного сеанса ничего не фиксирует |
auth.sso.succeeded |
пользователь входит через поставщика SSO. В подробностях указаны поставщик, субъект у поставщика удостоверений и то, была ли учётная запись создана этим входом |
auth.sso.failed |
вход через SSO отклонён — недопустимый домен, отсутствующий адрес электронной почты, локальная учётная запись с тем же адресом, неактивная учётная запись. В подробностях указаны поставщик и причина |
auth.proxy_session.succeeded |
пользователь входит через доверенный обратный прокси |
auth.proxy_session.failed |
вход через обратный прокси отклонён |
auth.register |
пользователь создаёт учётную запись через самостоятельную регистрацию |
auth.password.set |
приглашённый пользователь задаёт свой первый пароль |
auth.password.reset_requested |
Кто-то запрашивает письмо для сброса пароля. Всегда записывается как успех с введённым адресом, чтобы ответ ничего не раскрывал; в деталях указано, найдена ли учётная запись и было ли отправлено письмо |
auth.password.reset |
пароль изменён по ссылке для сброса |
auth.password.changed |
вошедший пользователь меняет собственный пароль |
auth.impersonation.started |
администратор включает Просмотр от имени роли…. Цель — выбранная роль |
auth.impersonation.stopped |
администратор возвращается к своей роли |
access.audit_log.exported |
кто-то экспортирует журнал безопасности в CSV |
Коды причин для auth.login.failed:
| Причина | Значение |
|---|---|
unknown_user |
Нет учётной записи с таким адресом электронной почты |
sso_account |
Учётная запись входит через SSO и не имеет пароля |
no_password |
У учётной записи ещё нет пароля — приглашение так и не было принято |
locked |
Учётная запись заблокирована после повторных неудач |
bad_password |
Неверный пароль |
inactive |
Учётная запись деактивирована |
Коды причин для auth.sso.failed, auth.proxy_session.failed, auth.password.set и auth.password.reset:
| Причина | Значение |
|---|---|
expired |
Срок ограниченного по времени доступа учётной записи истёк |
hd_mismatch |
Учётная запись Google принадлежит недопустимому домену |
no_email |
Поставщик удостоверений не вернул адрес e-mail |
no_subject |
Поставщик удостоверений не вернул идентификатор субъекта |
local_account |
Локальная учётная запись с паролем уже использует этот e-mail |
no_account |
Учётной записи нет, и учётные записи не создаются автоматически |
exchange_failed |
Поставщик удостоверений не завершил вход |
unauthenticated |
Обратный прокси не аутентифицировал запрос |
identity_rejected |
Переданная личность отклонена (домен или неподтверждённый e-mail) |
invalid_token |
Ссылка приглашения или сброса недействительна или истекла |
Всплеск неудач unknown_user с одного IP-адреса — так выглядит распыление паролей (password spraying); серия bad_password против одной учётной записи, за которой следует auth.login.locked, — это попытка подобрать пароль к этой учётной записи.
Административные действия¶
Каждое изменение, которое администратор вносит в конфигурацию экземпляра, записывается в категории admin. Исполнитель — администратор, объект — то, что было изменено (пользователь, роль, настройка, тип карточки), с его названием на тот момент, а подробности перечисляют изменения в виде старых и новых значений, только по полям, которые действительно изменились. Для каждой записи действуют два правила:
- Секреты маскируются. Пароль SMTP, секрет клиента SSO, ключ поставщика ИИ, учётные данные ServiceNow или любое другое секретное значение записывается как
***: запись показывает, что значение изменилось, но никогда — каким оно было или стало. - Текст лицензии и учётные данные никогда не сохраняются. Лицензия расширений идентифицируется, а не копируется, а пароль, который администратор задаёт пользователю, записывается как изменённый, но никогда — со своим значением.
Сохранение, которое ничего не меняет, не записывается, как и изменение пользователем собственного имени или языка в профиле. Объёмная конфигурация — поля, переводы или макет типа карточки, фильтры портала — описывается своим размером, а не копируется; если размер не изменился, добавляется короткий отпечаток содержимого, чтобы запись всё равно показывала, что что-то изменилось. Исключение — переопределения прав типа карточки для отдельных ролей: каждая изменённая ячейка указывается со старым и новым значением, причём пустое значение означает, что действует собственное право роли.
| Область | Действия | Что записывается |
|---|---|---|
| Пользователи и роли | admin.user.created, .updated, .deleted, .bulk_updated, .bulk_deleted, .unlocked; admin.user.invitation.resent, .deleted; admin.role.created, .updated, .archived, .restored; admin.stakeholder_role.created, .updated, .deleted, .archived, .restored |
Учётные записи, которые созданы, изменены, включены или отключены, удалены (по одной или массово) и разблокированы, с изменёнными полями — роль, электронная почта, имя, активность; повторно отправленные или отозванные приглашения; роли приложения и роли стейкхолдеров по типам, с предоставленными или отозванными разрешениями |
| Настройки | admin.settings.updated |
Одна запись на каждую сохранённую настройку — электронная почта, аутентификация и SSO, регистрация, ИИ, MCP, языки, переключатели модулей, оформление, логотип и значок сайта, сроки хранения. Объект — настройка; подробности — её старое и новое значение, секреты замаскированы |
| Метамодель | admin.metamodel.type.* (including .references_generated), admin.metamodel.relation_type.*, admin.metamodel.resource_type.*, admin.principle.* (including .imported), admin.regulation.* |
Типы карточек, типы связей и типы ресурсов, которые созданы, изменены, удалены или восстановлены, с изменёнными свойствами; ссылки карточек, сгенерированные для типа; принципы EA, включая импортированные из каталога; регламенты соответствия |
| Теги и вычисления | admin.tag_group.*, admin.tag.*, admin.calculation.* |
Группы тегов и теги; вычисляемые поля, которые созданы, изменены, удалены, включены или отключены, со старой и новой формулой, а также запуск вычисления для всех карточек (.recalculated) |
| Расширения | admin.extension.install.uploaded, .applied, .discarded; admin.extension.store.claimed, .refreshed, .installed; admin.extension.enabled, .disabled, .uninstalled; admin.extension.license.updated, .removed |
Загруженные, установленные или отменённые пакеты; лицензии и загрузки из магазина расширений; включённые, отключённые и удалённые расширения; заменённая или удалённая лицензия — с расширением и его версией, но никогда с текстом лицензии |
| Перенос рабочей области и миграция | admin.workspace.import.uploaded, .applied, .completed, .discarded; admin.migration.uploaded, .field_mappings.updated, .applied, .deleted |
Загруженный пакет рабочей области, запуск, завершение или отмена его импорта; загруженная миграция платформы, изменение её сопоставлений полей, её применение или удаление |
| Интеграции | admin.servicenow.connection.*, admin.servicenow.mapping.*, admin.servicenow.sync.pulled, .pushed, .applied |
Подключения ServiceNow (учётные данные замаскированы) и сопоставления; каждое получение, отправка и применение подготовленных записей |
| Публичный доступ | admin.web_portal.created, .updated, .deleted; admin.diagram.published, .unpublished |
Веб-порталы и опубликованные диаграммы — всё, что делает данные доступными без учётной записи |
| Опросы | admin.survey.sent, admin.survey.closed |
Опрос, отправленный получателям или закрытый |
| Доступ оператора | admin.ops.rescue_access.granted, .revoked |
Аварийный доступ, предоставленный или отозванный через операционный API, записывается рядом с существующими событиями ops.* |
Что не фиксируется¶
- Обновление токена. Веб-приложение продлевает сеанс по таймеру, поэтому каждая открытая вкладка добавляла бы записи, и ни одна из них ничего бы не значила.
- Запросы, отклонённые из-за истёкшего или недействительного токена сеанса. Они возникают каждый раз, когда сеанс завершается естественным образом.
- Чтение OData-фидов. Excel и Power BI опрашивают OData-фид сохранённого представления по расписанию, так что каждое обновление добавляло бы запись.
- Обычный доступ на чтение — открытие карточки, запуск отчёта, поиск по инвентарю.
Срок хранения¶
По умолчанию записи хранятся 365 дней. Измените это в разделе Администрирование → Настройки → Общие → Управление данными → Срок хранения журнала безопасности: любое число дней до 3650 или 0, чтобы хранить записи бессрочно. Задание раз в ночь удаляет записи старше этого срока и каждый раз перечитывает настройку, так что изменение вступает в силу без перезапуска.
Это задание хранения — единственное, что когда-либо удаляет запись. Ни в интерфейсе, ни в API нет действий для изменения или удаления — ни для одной роли.
Журнал намеренно не входит в Перенос workspace: это история безопасности данного экземпляра, а не содержимое workspace, и при клонировании экземпляра он не копируется.
Поток аудита в формате JSON¶
Каждую запись бэкенд также пишет одной строкой JSON в логгер turbo_ea.audit — в тот же момент, когда она сохраняется. Бэкенд пишет журнал в стандартный вывод, поэтому поток попадает туда же, куда уже собираются журналы ваших контейнеров, — docker compose logs backend, сбор журналов Kubernetes или любой агент доставки в SIEM — без какой-либо настройки в Turbo EA:
docker compose logs -f backend | grep turbo_ea.audit
Строка пишется в момент регистрации записи. Если транзакция запроса после этого завершится ошибкой, строка останется без записи в таблице: таблица — это реестр, поток — живая лента.
Каждая строка содержит те же поля, что и запись:
| Поле | Содержимое |
|---|---|
audit_id, created_at |
Идентификатор записи и момент её записи |
category, action, outcome |
Что произошло и удалось ли это |
actor_user_id, actor_email |
Кто это сделал |
subject_email |
Затронутая учётная запись |
target_type, target_id, target_label |
На что было направлено действие |
ip, user_agent |
Клиент |
origin |
web, api, mcp, ext, ops или system |
impersonator_user_id, impersonated_role |
Заполняются, пока администратор просматривает приложение от имени другой роли |
details |
Коды причин и старые/новые значения, секреты уже замаскированы |
Отправка потока в централизованное хранилище журналов сохраняет копию вне экземпляра, вне досягаемости тех, кто может его администрировать, — именно это нужно для проверки на внутренние угрозы. Как его собирать, см. в разделе Журналы и поток аудита.
IP-адрес клиента¶
Столбец IP фиксирует адрес клиента, а не прокси перед бэкендом. Поставляемый пограничный nginx записывает в заголовок X-Real-IP адрес, с которого он принял соединение, а бэкенд читает этот заголовок, потому что опубликованный образ бэкенда задаёт TRUST_PROXY_HEADERS=true. Значение, не являющееся корректным IP-адресом, отбрасывается, а не записывается.
- Оставьте
TRUST_PROXY_HEADERSвключённым, пока каждый запрос попадает в бэкенд через поставляемый nginx, — так работают стандартный стек, Helm-чарт и шаблоны управляемых контейнеров. - Выключите его (
TRUST_PROXY_HEADERS=false), если вы открываете контейнер бэкенда напрямую, без поставляемого nginx перед ним: тогда клиент может прислать собственныйX-Real-IPи сам выбрать записываемый адрес. - За другим балансировщиком нагрузки поставляемый nginx видит адрес этого балансировщика, и каждая запись фиксирует именно его. Настройка, позволяющая nginx доверять адресу клиента, переданному вашим балансировщиком (
NGINX_TRUSTED_PROXIES), запланирована в одной из следующих версий.