Структуры аудита#

Система Global предоставляет множество инструментов по контролю за изменением данных, позволяющих отслеживать

  • Добавление, изменение и удаление данных

  • Блокировки и ошибки при работе БД

  • Исполнение периодических работ

  • Изменение размера таблиц

  • Открытие выборок и выполнение операций

  • Исполнение JEXL-скриптов

Все таблицы аудита хранятся в табличном пространстве, указанном в Btk_AuditPkg().schema. По умолчанию это AUD. В этом разделе документации представлена информация по большинству из них

Аудит классов#

Содержит информацию об создании экземпляров класса, изменении атрибутов, выполнении операций. Позволяет отследить взаимодействия с данными вплоть до конкретного пользователя, секунды и рабочего места. Пользовательский интерфейс доступен в Настройка системы > Аудит \ Аудит открытия форм и выполнения операций.

Записи аудита хранятся в таблицах отдельных для каждого класса-шапки бизнес-объекта. Названия таблиц формируются следующим образом:

Формирование названий таблиц аудита классов

${cистемное имя класса-шапки бизнес-объекта}_dzaud:

  • Btk_User_dzaud

  • Bs_Goods_dzaud

Изменения обрабатываются в SessionImpl#flush(). Сбор информации о значении атрибутов происходит до и после применения изменений сессии к базе данных. Запись в аудит - после

Подробнее об аудите классов

Хранимые поля

  • idrootclass - id класса-шапки бизнес-объекта

  • gidrootobj - gid класса-шапки бизнес-объекта

  • srootobjhl - наименование класса-шапки бизнес-объекта

  • idclass - id класса

  • gidobj -

  • sobjhl -

  • idaction - id действия пользователя
    один из Btk_AuditAction: «Создание», «Изменение», «Удаление»

  • joldvalue - JSON-объект
    хранящий значения атрибутов объекта до изменений

  • jnewvalue - JSON-объект
    хранящий новые значения изменённых атрибутов

  • joldvaluehl - JSON-объект
    хранящий наименования ссылочных атрибутов до изменений

  • jnewvaluehl - JSON-объект
    хранящий новые наименования изменённых ссылочных атрибутов

  • ddate - время и дата изменения

  • sremark - примечание

  • suser - имя пользователя

  • sclienthostip - IP-адрес

  • joperinfo -

Журнал блокировок базы данных btk_dblockshistory#

Отображает дерево блокировок сессий БД. Подробнее…

Журнал аудита сторонних систем btk_idextaudit#

Содержит историю изменения идентификатора внешних систем. Выполняется на каждую установку значения в сеттере Btk_ExtSystemAvi.ListMaster#setsKey

Хранимые поля

  • gidObj - объект, к которому подключена внешняя система

  • sOldValue - предыдущее значение

  • sNewValue - изменённое значение

  • idExtSystem - идентификатор внешней системы

  • idExtSystemHL - наименование внешней системы

  • dDate - когда произошло изменение

  • sUser - кем было произведено изменение

  • sClientHostIP - IP-адрес
    Адрес, с которого была инициирована процедура изменения

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_JIdExtPkg.installTable();

Добавление записи#

insertAudInfo(
    gidObj: NGid, 
    idExtSystem: NLong, 
    sOldValue: NString, 
    sNewValue: NString 
);

Журнал выполнения работ btk_jobexechistory#

Содержит историю исполнения регулярно выполняемых работ Quartz Scheduler. Позволяет анализировать исполнение работ: длительность, время запуска и его корректность. Обновляется каждые 15 минут работой Btk_SlowQueryHistoryUpdate

Хранимые поля

  • idJobEvent - идентификатор события

  • sScript - текст исполняемого JEXL-скрипта

  • nPeriod - время исполнения [минуты]

  • bSlow - длительная работа
    Признак для работ, выполняющихся более 15-ти минут

  • bNight - ночная работа
    Признак для работ, выполняющихся с 22:00 до 08:00

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_MonitorDBActivityPkg.dataInstall();

Обновление#

Btk_MonitorDBActivityPkg.updateSlowQueryHistory();

Журнал информации о работе БД btk_monitordbactivityaud#

Содержит в себе предупреждения и ошибки работы с базой данных. Обновляется каждые 15 минут с помощью работы Btk_SlowQueryHistoryUpdate. Подробнее…

Хранимые поля

  • dcreate - дата и время события

  • stype - тип предупреждения
    из Btk_MonitorDBActivityPkg.DBAlertTypes:
    «DBBloat», «AutoVacuumOff», «SlowTransaction», «SlowQuery», «FastGrowSize», «NotInScheduleJob»

  • sfrom - источник

  • stypefrom - тип источника

  • sshortinfo - сообщение

  • sdescription - описание

  • squery - запрос

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_MonitorDBActivityPkg.dataInstall();

Обновление#

Btk_MonitorDBActivityPkg.updateSlowQueryHistory();

Журнал выполнения медленных задач btk_slowqueryhistory#

Журнал SQL-запросов, выполняющихся дольше 15 минут (время, определяющее какой запрос будет считаться долго выполняющимся определяется в Btk_MonitorDBActivityPkg#getIntervalToAcceptAsSlowQuery). Обновляется каждые 15 минут с помощью работы Btk_SlowQueryHistoryUpdate.

Хранимые поля

  • usename - имя пользователя

  • dcreate - дата создания записи аудита

  • query - текст SQL-запроса

  • nduration - длительность [минут]

  • state - состояние выполнения \

    • idle - сессия БД находится в режиме ожидания. Т.е. подключение к БД есть, но в данный момент никаких запросов не выполняется. Стандартное ожидание для неактивных подключений, которые находятся в пуле подключений сервера приложений

    • active - сессия БД в данный момент выполняет запрос.

    • idle in transaction - сессия БД находится в режиме ожидания, но есть открытая транзакция. Опасное состояние сессии, т.к. длинные открытые транзакции отрицательно влияют на производительность postgresql. Наличие такой сессии сигнализирует о проблеме.

  • sclienthostip - IP-адрес источника запроса

  • sappname - название главной выборки

  • sform - название формы
    отображение, выборка, наименование

  • sclusternode - кластерный узел

  • ssid - sid сеанса

  • stack - трассировка стека

  • saction - действие
    Эта колонка будет заполнена, если:

    • сессия принадлежит выполняемому фоновому заданию, в том числе интеграция

    • выполняется построение печатной формы

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_MonitorDBActivityPkg.dataInstall();

Обновление#

Btk_MonitorDBActivityPkg.updateSlowQueryHistory();

Журнал размера таблиц основных классов btk_tablesizehistory#

История размера таблиц PostgreSQL и системных классов. Позволяет отслеживать изменения размеров таблиц и индексов к ним во времени. Обновляется каждые 20 часов с помощью работы Btk_TableSizeHistoryUpdate

Хранимые поля

  • dcreate - дата и время

  • sname - название таблицы

  • stablespace - табличное пространство

  • nsize - собственный размер таблицы [байт]

  • nindexsize - размер индексов [байт]к

  • ntotalsize - общий размер [байт]

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_MonitorDBActivityPkg.dataInstall();

Обновление#

Btk_MonitorDBActivityPkg.updateTableSizeHistory();

Журнал открытия выборок и выполнения операций selopenhistory#

Это настраиваемая система, позволяющая вести расширенный аудит действий пользователя при открытии форм и элементов внутри формы. Пользовательский интерфейс доступен в Настройка системы > Аудит \ Аудит открытия форм и выполнения операций. Для каждой конкретной формы можно включить\отключить аудит, настроить какие взаимодействия будут сохраняться:

  • Btk_SelSettingAudTypeApi#sFullAud - признак ведения полного аудита

  • Btk_SelSettingAudTypeApi#sOnlySuccess - признак ведения аудита успешно выполненных действий

Существует несколько событий, создающих запись аудита:

  • при открытии формы

    • EntityAvi#onShow() - успешное открытие формы

    • в EntityAvi#onLoadMeta() подписка на события неудачных открытий форм

    • EntityAvi#beforeCloseForm() - закрытие формы

  • при вызове операции

    • в EntityAvi#onLoadMeta() подписка на события исполнения операций

Подробнее об аудите открытия форм и выполнения операция

Хранимые поля

  • id - ИД записи в аудите для текущей выборки

  • suser - имя пользователя

  • ssel - выборка

  • srep - отображение

  • scaption - наименование отображения

  • dstart - время открытия

  • dend - время закрытия

  • gidobject - глобальный идентификатор объекта взаимодействия

  • stype - тип взаимодействия, Btk_SelAuditPkg.SelAuditType
    одно из списка: «Главная выборка», «Операция», «Детальная выборка»

  • sparam - параметры, с которыми открывалась выборка

  • sresult - результат взаимодействия SelAuditResult
    одно из списка: «Успешно», «Ошибка прикладного кода», «Ошибка доступа»

  • soper - операция

  • sopercaption - наименование операции

  • serrortext - текст ошибки

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_SelAuditPkg.dataInstall()

Добавление записи#

Btk_SelAuditPkg.audInsert(
    idSession: NLong,
    id: NLong,
    idParent: NLong,
    sSel: NString,
    sRep: NString,
    sCaption: NString,
    gidObject: NGid,
    sParam: NString,
    sType: NString,
    sResult: NString = SelAuditResult.sSuccess,
    sOper: NString,
    sOperCaption: NString,
    sErrorText: NString
)

Журнал аудита JEXL jexlexechistory#

Содержит информацию о запуске и результате выполнения скриптов на языке JEXL.Пользовательский интерфейс доступен в Настройка системы > Аудит \ Аудит JEXL.

Операции, которые вызывают создании записи в таблице аудита:

  • Btk_JexlScriptLibraryAvi.Card_Script#execScriptwithSettings()

  • Btk_JexlScriptRunnerAvi.Card#execScript()

Хранимые поля

  • id - уникальный ключ записи аудита

  • suser - имя пользователя

  • dstartexec - начало исполнения

  • dendexec - конец исполнения

  • sjexl - текст скрипта

  • nresult - результат выполнения
    1 - успех, 0 - ошибка

  • sstacktrace - трассировка стека ошибки

  • gidsrc - объект, из которого выполнялся вызов скрипта

  • saudinfo -

Скрипты взаимодействия с таблицой#

Регистрация#

Btk_JexlScriptRunnerPkg.audDataInstal();

Добавление записи#

Btk_JexlScriptRunnerPkg.audInsert(
    dpStartExec: NDate
   ,dEndExec: NDate
   ,spJexl: NString
   ,npResult: NNumber
   ,spStackTrace: NString = None.ns
   ,gidpSrc: NGid = None.ng
);

Логирование событий ИБ в формате CEF#

События информационной безопасности пишутся в логгер ru.bitec.app.gtk.audit.InfoSecLogger
Само сообщение отформатировано в формате Common Event Format

прим. CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|[Extension]

События | Signature ID#

Таблицы ключ=значение для [Extension] части CEF сообщения

  1. Общие - Ключи есть в каждом сообщении где возможно

    Ключ | Extension key

    Описание

    suid

    Имя пользователя клиента

    suser

    ФИО клиента

    spid

    Session Id. Идентификатор сессии клиента

    src

    IP-адрес клиента

    shost

    Имя кластерной ноды

    cs6Label

    «Superuser»

    cs6

    Наличие прав администратора - true/false

    end

    Дата и время в которое было зарегистрировано событие

  2. LoginSuccess - Успешная авторизация

    Ключ | Extension key

    Описание

    suid

    Имя пользователя клиента

    suser

    ФИО клиента

    src

    IP-адрес клиента

    spt

    Порт клиента

    dst

    IP-адрес сервера

    dpt

    Порт сервера

    request

    URL запроса

    cs6Label

    «Superuser»

    cs6

    Наличие прав администратора - true/false

    end

    Дата и время в которое было зарегистрировано событие

  3. LoginFailure - Неуспешная авторизация

    Ключ | Extension key

    Описание

    suid

    Имя пользователя клиента

    reason

    Причина неуспешного входа

    src

    IP-адрес клиента

    spt

    Порт клиента

    dst

    IP-адрес сервера

    dpt

    Порт сервера

    request

    URL запроса

    end

    Дата и время в которое было зарегистрировано событие

  4. LoginAttempt - Превышение количества неудачных попыток ввода пароля

    Ключ | Extension key

    Описание

    suid

    Имя пользователя клиента

    src

    IP-адрес клиента

    spt

    Порт клиента

    dst

    IP-адрес сервера

    dpt

    Порт сервера

    request

    URL запроса

    end

    Дата и время в которое было зарегистрировано событие

  5. Session - Начало и остановка пользовательской сессии

    Ключ | Extension key

    Описание

    Общие

  6. Application - Открытие и закрытие выборки

    Ключ | Extension key

    Описание

    Общие

    cs1Label

    «Application Name»

    cs1

    Имя приложения, выборка которого была открыта или закрыта

  7. PasswordChange - Изменение пароля

    Ключ | Extension key

    Описание

    Общие

    duid

    Имя пользователя которому сменили пароль

    duser

    ФИО пользователя которому сменили пароль

  8. OutdatedProdPassword - Устарел продуктивный пароль (Сброс пароля)

    Ключ | Extension key

    Описание

    Общие

    duid

    Имя пользователя которому нужно сменить пароль

    duser

    ФИО пользователя которому нужно сменить пароль

  9. OutdatedTempPassword - Устарел временный пароль (Блокировка пользователя)

    Ключ | Extension key

    Описание

    Общие

    duid

    Имя пользователя которому нужно запросить новый пароль

    duser

    ФИО пользователя которому нужно запросить новый пароль

  10. JexlExec - Успешно/Неуспешно выполнен JEXL скрипт

    Ключ | Extension key

    Описание

    Общие

    cs1Label

    «JEXL»

    cs1

    JEXL скрипт который выполняли

    cs2Label

    «Source»

    cs2

    GID источника выполнения

    deviceCustomDate1Label

    «ExecStart»

    deviceCustomDate1

    Дата и время начала выполнения

    deviceCustomDate2Label

    «ExecEnd»

    deviceCustomDate2

    Дата и время завершения выполнения

  11. AuditSettings - Изменение настроек аудита

    Ключ | Extension key

    Описание

    Общие

    cs1Label

    «Table Name»

    cs1

    Имя таблицы, настройки которой были изменены

    cs3Label

    «Old values»

    cs3

    Перечень старых атрибутов. Формат - «атрибут: новое значение»

    cs4Label

    «New values»

    cs4

    Перечень измененных атрибутов. Формат - «атрибут: новое значение»

  12. UserPriv - Выдача и потеря привилегий пользователя

    Ключ | Extension key

    Описание

    Общие

    spriv

    Пользователь, который получил или потерял привилегию

    cs1

    ФИО клиента

    dpriv

    Системное имя полученной привилегии(Профиль)

    cs2

    Наименование полученной привилегии(Профиль)

  13. ProfilePriv - Выдача и потеря привилегий профиля

    Ключ | Extension key

    Описание

    Общие

    spriv

    Профиль, который получил или потерял привилегию

    cs1

    Наименование полученной привилегии(Профиль)

    dpriv

    Системное имя полученной привилегии(Роль)

    cs2

    Наименование полученной привилегии(Роль)

  14. UpdateRole - Изменения привилегий роли

    Ключ | Extension key

    Описание

    Общие

    spriv

    Роль у которой изменили привилегии

    cs1

    Наименование Роли

    dpriv

    Класс в котором произошли изменения см. список ниже

    cs2

    Наименование класса в котором произошли изменения

    cs3Label

    «Old values»

    cs3

    Перечень старых атрибутов. Формат - «атрибут: новое значение»

    cs4Label

    «New values»

    cs4

    Перечень измененных атрибутов. Формат - «атрибут: новое значение»

Классы по которым ведутся события ИБ

  • Btk_AcRoleItemPrivGrant

  • Btk_AcRoleItemPrivTypeGrant

  • Btk_AcRoleObjPrivGrant

  • Btk_AcRoleObjPrivTypeGrant

  • Btk_AcRoleServerPriv

  • Btk_AcRoleStateChangeGrant

Настройка#

В директории Сервер\application\config добавить в logback-LoggerContext.xml и logback-LoggerContext-session.xml.

<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <!-- syslogHost, port - ссылка на Syslog сервер -->
    <syslogHost>localhost</syslogHost>
    <port>514</port>
    <facility>AUTHPRIV</facility>
   <!-- Паттерн Syslog сообщения. (Обязательные Syslog поля) + %msg(CEF Сообщение)-->
   <suffixPattern>%msg</suffixPattern>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
            <!--Здесь можно указать фильтрацию для событий
                "*" - все события  
            прим.
            <marker>Session</marker>
            <marker>PasswordChange</marker>
            -->
            <marker>*</marker>
        </evaluator>
        <!--Правила фильтрации
            Логировать только указанные события:
                <OnMatch>NEUTRAL</OnMatch>
                <OnMismatch>DENY</OnMismatch>
            Логировать все кроме указанных событий:
                <OnMatch>DENY</OnMatch>
                <OnMismatch>NEUTRAL</OnMismatch>
        -->
        <OnMatch>NEUTRAL</OnMatch>
        <OnMismatch>DENY</OnMismatch>
    </filter>
</appender>

Добавите сам логгер

<!--Добавьте над root'ом если не хоте чтобы логер не унаследовал от root'а level и другие аппендеры-->
<logger name="InfoSecLogger" level="ALL" additivity="false">
    <appender-ref ref="SYSLOG"/>
</logger>

В результате получим SYSLOG CEF сообщение вида
Jan 31 16:09:10 DESKTOP-IPCDPC4 CEF:1|bitec|GlobalERP|0|LoginSuccess|Успешная авторизация|Medium|suid=admin suser=Кузнецов В.М. src=127.0.0.1 spt=56453 dst=localhost dpt=8080 request=http://localhost:8080/login/login.html cs6Label=Superuser cs6=true end=Jan 31 2025 16:09:10

Логирование DDL-операций btk_ddljournal#

Журнал операций изменения структур базы данных. В журнале содержатся записи о таких операциях как CREATE, ALTER, DROP, SECURITY LABEL, COMMENT, GRANT и REVOKE.

Для включения логирования операций требуется выполнить создание триггера. У пользователя, под которым подключается сервер при генерации таблиц, как правило прав на создание триггеров нет, поэтому включение нужно произвести вручную.

CREATE EVENT TRIGGER ddl_audit_trigger
ON ddl_command_end
EXECUTE FUNCTION log_ddl_operations()

Хранимые поля

  • dtimestamp - Время окончания выполнения операции.

  • sdbusername - имя пользователя в текущем контексте выполнения.

  • susername - имя пользователя сеанса.

  • smachinename - наименование хоста клиента.

  • sipaddress - адрес клиента.

  • sschema - имя схемы.

  • sentity - измененный объект.

  • sentitytype - тип измененного объекта.

  • sddl - операция изменения структуры данных.

Наименование хоста клиента не будет логироваться, если в базе данных параметр log_hostname выключен. Включить его можно в конфиге БД, либо в консоли.