Перейти к основному содержанию
`Ctrl`+`K`

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

Система 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` выключен. Включить его можно в конфиге БД, либо в консоли.