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

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

Журнал аудита в разделе Администрирование → Настройки → Журнал аудита (/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), запланирована в одной из следующих версий.