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

Активность, история и аудит

MonoPbx хранит две связанные записи административной деятельности.

  • Журнал аудита показывает, кто, что, когда, откуда и каким способом изменил. Он хранит хеш каждого изменения, но не значения, поэтому его можно хранить долго (7 лет), не храня секреты.
  • История изменений настроек сохраняет замаскированные значения до и после каждого изменения настроек, чтобы вы могли увидеть разницу и откатить её.

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

Страница истории звонков со списком вызовов, их направлением и результатом.

Страница «История звонков» с фильтрами и кнопками экспорта.

Каждая запись содержит исполнителя (user, api_key, device, job или anonymous), канал (ui, api, cli, mcp или system), адрес клиента, action, например auth.login или config.updated, объект (entity_type, entity_id), outcome (success, denied или error) и несколько подробностей, например имена изменённых полей. Канал ui, cli или api — это то, что аутентифицированный клиент передаёт в заголовке X-Mpbx-Channel; ключ API всегда использует канал api.

Сейчас записываются:

  • изменения настроек: пользователи, отделы, внутренние номера, устройства, роли и назначения ролей (созданы, изменены, удалены);
  • входы в систему, успешные и отклонённые (с причиной, например wrong_password или locked), блокировки, выходы, повторное использование refresh-токенов, изменения пароля и двухфакторной аутентификации;
  • администрирование ролей, ключей API и системных ролей, а также вход системного субъекта в компанию;
  • администрирование сертификатов и резервных копий;
  • администрирование поставщиков SMS и номеров.

Пока не записываются: использование ключей API, неудачная аутентификация по bearer-токену, создание и приостановка компаний.

Чтение журнала​

МаршрутПравоЧто возвращает
GET /api/v1/audit-logaudit:read (по умолчанию Владелец; у администратора отдела его нет)Записи вашей компании, сначала новые
GET /api/v1/system/audit-logsystem.audit:read (администратор системы и владелец системы), токен уровня системыТолько записи всей установки

Действуют обычные параметры списков: limit, cursor, filter=field:op:value и sort. Поля фильтра: ts (gt gte lt lte, RFC 3339), actor_type, actor_id, channel, entity_type, entity_id, outcome (eq) и action (eq или starts_with).

GET /api/v1/audit-log?filter=action:starts_with:auth.&filter=outcome:eq:denied&limit=50

Журнал аудита хранится в ClickHouse. Если clickhouse.url не настроен, маршруты отвечают 503 с кодом MPBX-API-NOT-CONFIGURED; записи ждут в Postgres, пока ClickHouse не станет доступен. Запись существует тогда и только тогда, когда её изменение зафиксировано. У журнала нет маршрута для записи. Цепочка хешей, которая обнаруживала бы подмену человеком с правом записи в ClickHouse, не реализована.

История изменений настроек и откат​

GET /api/v1/config-history?filter=entity_type:eq:department&filter=entity_id:eq:<id>&sort=seq
GET /api/v1/config-history/{id}
POST /api/v1/config-history/{id}/revert

Каждая запись показывает, кто, каким способом и когда изменил настройки, а также значения изменённых полей до и после. Записи есть для отделов, пользователей, внутренних номеров, устройств, ролей, назначений ролей и языковых пакетов. Для чтения нужно право audit:read и право чтения соответствующего типа объекта (например, users:read). Записи того типа, который вам читать запрещено, возвращают 404, а не 403.

  • Секреты никогда не отображаются. Любое поле, которое содержит секрет (пароль, токен, TOTP, учётные данные, хеш и подобные), показывается как [masked]. Изменение такого поля указывается только по имени: история может сообщить, что пароль изменился, и ничего больше.
  • Откат — это новое изменение. Ничего не переписывается, а сам откат попадает в историю и журнал аудита.
  • Таблица истории для роли компании допускает только добавление записей.

Для этого в веб-консоли есть страница истории.

События в реальном времени​

Записи аудита и изменения настроек также передаются в темах audit и config WebSocket событий тем, у кого есть соответствующие права.