Структуры аудита#
Система Global предоставляет множество инструментов по контролю за изменением данных, позволяющих отслеживать:
Добавление, изменение и удаление данных.
Блокировки и ошибки при работе БД.
Исполнение периодических работ.
Изменение размера таблиц.
Открытие выборок и выполнение операций.
Исполнение JEXL-скриптов.
Все таблицы аудита хранятся в табличном пространстве, указанном в Btk_AuditPkg().schema. По умолчанию это AUD. В этом разделе документации представлена информация по большинству из них.
Аудит классов#
Содержит информацию об создании экземпляров класса, изменении атрибутов, выполнении операций. Позволяет отследить взаимодействия с данными вплоть до конкретного пользователя, секунды и рабочего места. Пользовательский интерфейс доступен в Настройка системы > Аудит \ Аудит открытия форм и выполнения операций.
Записи аудита хранятся в таблицах отдельных для каждого класса-шапки бизнес-объекта. Названия таблиц формируются следующим образом:
Формирование названий таблиц аудита классов
${cистемное имя класса-шапки бизнес-объекта}_dzaud:
Btk_User_dzaudBs_Goods_dzaud
Изменения обрабатываются в SessionImpl#flush(). Сбор информации о значении атрибутов происходит до и после применения изменений сессии к базе данных. Запись в аудит - после
Хранимые поля
idrootclass- id класса-шапки бизнес-объекта.gidrootobj- gid класса-шапки бизнес-объекта.srootobjhl- наименование класса-шапки бизнес-объекта.idclass- id класса.gidobjsobjhlidaction- 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 сообщения.
Общие - ключи есть в каждом сообщении где возможно:
Ключ | Extension key
Описание
suidИмя пользователя клиента
suserФИО клиента
spidSession Id. Идентификатор сессии клиента
srcIP-адрес клиента
shostИмя кластерной ноды
cs6Label«Superuser»
cs6Наличие прав администратора - true/false
endДата и время в которое было зарегистрировано событие
LoginSuccess - успешная авторизация:
Ключ | Extension key
Описание
suidИмя пользователя клиента
suserФИО клиента
srcIP-адрес клиента
sptПорт клиента
dstIP-адрес сервера
dptПорт сервера
requestURL запроса
cs6Label«Superuser»
cs6Наличие прав администратора - true/false
endДата и время в которое было зарегистрировано событие
LoginFailure - неуспешная авторизация:
Ключ | Extension key
Описание
suidИмя пользователя клиента
reasonПричина неуспешного входа
srcIP-адрес клиента
sptПорт клиента
dstIP-адрес сервера
dptПорт сервера
requestURL запроса
endДата и время в которое было зарегистрировано событие
LoginAttempt - превышение количества неудачных попыток ввода пароля:
Ключ | Extension key
Описание
suidИмя пользователя клиента
srcIP-адрес клиента
sptПорт клиента
dstIP-адрес сервера
dptПорт сервера
requestURL запроса
endДата и время в которое было зарегистрировано событие
Session - начало и остановка пользовательской сессии:
Ключ | Extension key
Описание
Общие
Application - открытие и закрытие выборки:
Ключ | Extension key
Описание
Общие
cs1Label«Application Name»
cs1Имя приложения, выборка которого была открыта или закрыта
PasswordChange - изменение пароля:
Ключ | Extension key
Описание
Общие
duidИмя пользователя которому сменили пароль
duserФИО пользователя которому сменили пароль
OutdatedProdPassword - устарел продуктивный пароль (Сброс пароля):
Ключ | Extension key
Описание
Общие
duidИмя пользователя которому нужно сменить пароль
duserФИО пользователя которому нужно сменить пароль
OutdatedTempPassword - устарел временный пароль (Блокировка пользователя):
Ключ | Extension key
Описание
Общие
duidИмя пользователя которому нужно запросить новый пароль
duserФИО пользователя которому нужно запросить новый пароль
JexlExec - успешно/Неуспешно выполнен JEXL скрипт:
Ключ | Extension key
Описание
Общие
cs1Label«JEXL»
cs1JEXL скрипт который выполняли
cs2Label«Source»
cs2GID источника выполнения
deviceCustomDate1Label«ExecStart»
deviceCustomDate1Дата и время начала выполнения
deviceCustomDate2Label«ExecEnd»
deviceCustomDate2Дата и время завершения выполнения
AuditSettings - изменение настроек аудита:
Ключ | Extension key
Описание
Общие
cs1Label«Table Name»
cs1Имя таблицы, настройки которой были изменены
cs3Label«Old values»
cs3Перечень старых атрибутов. Формат - «атрибут: новое значение»
cs4Label«New values»
cs4Перечень измененных атрибутов. Формат - «атрибут: новое значение»
UserPriv - выдача и потеря привилегий пользователя:
Ключ | Extension key
Описание
Общие
sprivПользователь, который получил или потерял привилегию
cs1ФИО клиента
dprivСистемное имя полученной привилегии(Профиль)
cs2Наименование полученной привилегии(Профиль)
ProfilePriv - выдача и потеря привилегий профиля:
Ключ | Extension key
Описание
Общие
sprivПрофиль, который получил или потерял привилегию
cs1Наименование полученной привилегии(Профиль)
dprivСистемное имя полученной привилегии(Роль)
cs2Наименование полученной привилегии(Роль)
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 выключен.
Включить его можно в конфиге БД, либо в консоли.