6.4.5.8 Написание определений фильтров журнала аудита
Определения фильтров являются JSON значениями. Для получения информации об использовании JSON данных в MySQL, см. Раздел 11.5, «Тип данных JSON».
Определения фильтров имеют такой вид, где actions указывает, как происходит фильтрация:
{ "filter": actions }
Следующее обсуждение описывает разрешенные конструкции в определениях фильтров.
Ведение всех событий
Для явного включения или выключения ведения всех событий используйте элемент log в фильтре:
{
"filter": { "log": true }
}
Значение log может быть либо true, либо false.
Представленный фильтр включает ведение всех событий. Он эквивалентен:
{
"filter": { }
}
Поведение ведения зависит от значения log и от того, указаны ли элементы class или event:
При указании
logиспользуется его значение.Без указания
logведение включено, если не указаны элементыclassилиevent, и выключено в противном случае (в этом случаеclassилиeventмогут содержать свой собственный элементlog).
Ведение событий определенных классов
Для ведения событий определенного класса используйте элемент class в фильтре, где поле name указывает имя класса для ведения:
{
"filter": {
"class": { "name": "connection" }
}
}
Значение name может быть connection, general или table_access для ведения событий подключения, общих событий или событий доступа к таблицам соответственно.
Представленный фильтр включает ведение событий класса connection. Это эквивалентно следующему фильтру с явными элементами log:
{
"filter": {
"log": false,
"class": { "log": true,
"name": "connection" }
}
}
Для включения ведения нескольких классов задайте значение class как элемент массива JSON, содержащий имена классов:
{
"filter": {
"class": [
{ "name": "connection" },
{ "name": "general" },
{ "name": "table_access" }
]
}
}
Если в определении фильтра несколько экземпляров данного элемента находятся на одном уровне, их значения могут быть объединены в один экземпляр этого элемента в массиве значений. Представленное определение можно переписать так:
{
"filter": {
"class": [
{ "name": [ "connection", "general", "table_access" ] }
]
}
}
Ведение событий определенных подклассов
Для выбора определенных подклассов событий используйте элемент event, содержащий элемент name с именами подклассов. По умолчанию события, выбранные элементом event, ведётся. Например, этот фильтр включает ведение для указанных подклассов событий:
{
"filter": {
"class": [
{
"name": "connection",
"event": [
{ "name": "connect" },
{ "name": "disconnect" }
]
},
{ "name": "general" },
{
"name": "table_access",
"event": [
{ "name": "insert" },
{ "name": "delete" },
{ "name": "update" }
]
}
]
}
}
Элемент event также может содержать явные элементы log, чтобы указать, нужно ли вести события, которые соответствуют условиям. Этот элемент event выбирает несколько событий и явно указывает поведение ведения для них:
"event": [
{ "name": "read", "log": false },
{ "name": "insert", "log": true },
{ "name": "delete", "log": true },
{ "name": "update", "log": true }
]
Начиная с MySQL 5.7.20, элемент event также может указать, следует ли блокировать соответствующие события, если он содержит элемент abort. Подробности см. в разделе Блокирование выполнения определенных событий.
Таблица 6.26, «Комбинации классов и подклассов событий» описывает допустимые значения подклассов для каждого класса событий.
Таблица 6.26 Комбинации классов и подклассов событий
| Класс события | Подкласс события | Описание |
|---|---|---|
connection | connect | Инициализация подключения (успешная или неуспешная) |
connection | change_user | Повторная аутентификация пользователя с другими данными пользователя/паролем во время сессии |
connection | disconnect | Завершение подключения |
general | status | Общая информация об операциях |
table_access | read | Выражения чтения из таблиц, такие как SELECT или INSERT
INTO ... SELECT
|
table_access | delete | Выражения удаления из таблиц, такие как DELETE или TRUNCATE TABLE
|
table_access | insert | Выражения вставки в таблицы, такие как INSERT или REPLACE
|
table_access | update | Выражения обновления таблиц, такие как UPDATE
|
Таблица 6.27, «Характеристики ведения и прерывания по каждой комбинации класса и подкласса события» описывает для каждого подкласса события, можно ли его вести или прервать.
Таблица 6.27 Характеристики ведения и прерывания по каждой комбинации класса и подкласса события
| Класс события | Подкласс события | Можно вести | Можно прервать |
|---|---|---|---|
connection | connect | Да | Нет |
connection | change_user | Да | Нет |
connection | disconnect | Да | Нет |
general | status | Да | Нет |
table_access | read | Да | Да |
table_access | delete | Да | Да |
table_access | insert | Да | Да |
table_access | update | Да | Да |
Включительно и Исключительно Ведение Журнала
Фильтр может быть определён в режиме включения или исключения:
Режим включения регистрирует только явно указанные элементы.
Режим исключения регистрирует всё, кроме явно указанных элементов.
Для выполнения включительного ведения журнала, отключите ведение журнала глобально и включите ведение журнала для определённых классов. Этот фильтр регистрирует connect и disconnect события в классе connection, и события в классе general:
{
"filter": {
"log": false,
"class": [
{
"name": "connection",
"event": [
{ "name": "connect", "log": true },
{ "name": "disconnect", "log": true }
]
},
{ "name": "general", "log": true }
]
}
}
Для выполнения исключительного ведения журнала, включите ведение журнала глобально и отключите ведение журнала для определённых классов. Этот фильтр регистрирует всё, кроме событий в классе general:
{
"filter": {
"log": true,
"class":
{ "name": "general", "log": false }
}
}
Этот фильтр регистрирует change_user события в классе connection и table_access события, в силу того, что не регистрирует всё остальное:
{
"filter": {
"log": true,
"class": [
{
"name": "connection",
"event": [
{ "name": "connect", "log": false },
{ "name": "disconnect", "log": false }
]
},
{ "name": "general", "log": false }
]
}
}
Тестирование значений полей событий
Для включения регистрации на основе определённых значений полей событий, укажите элемент field внутри элемента log, который указывает имя поля и его ожидаемое значение:
{
"filter": {
"class": {
"name": "general",
"event": {
"name": "status",
"log": {
"field": { "name": "general_command.str", "value": "Query" }
}
}
}
}
}
Каждое событие содержит поля, специфичные для класса события, к которым можно получить доступ в фильтре для выполнения пользовательской фильтрации.
Событие в классе connection указывает, когда во время сессии происходит активность, связанная с подключением, например, когда пользователь подключается к серверу или отключается от него. Таблица 6.28, «Поля событий подключения» указывает разрешённые поля для событий connection.
Таблица 6.28 Поля событий подключения
| Имя поля | Тип поля | Описание |
|---|---|---|
status | целое число |
Статус события: 0: OK В противном случае: Ошибка |
connection_id | целое без знака | Идентификатор подключения |
user.str | строка | Имя пользователя, указанное во время аутентификации |
user.length | целое без знака | Длина имени пользователя |
priv_user.str | строка | Аутентифицированное имя пользователя (имя пользователя учетной записи) |
priv_user.length | целое без знака | Длина аутентифицированного имени пользователя |
external_user.str | строка | Внешнее имя пользователя (предоставленное плагином аутентификации стороннего поставщика) |
external_user.length | целое без знака | Длина внешнего имени пользователя |
proxy_user.str | строка | Имя пользователя прокси |
proxy_user.length | целое без знака | Длина имени пользователя прокси |
host.str | строка | Хост подключённого пользователя |
host.length | целое без знака | Длина хоста подключённого пользователя |
ip.str | строка | IP-адрес подключённого пользователя |
ip.length | целое без знака | Длина IP-адреса подключённого пользователя |
database.str | строка | Имя базы данных, указанное при подключении |
database.length | целое без знака | Длина имени базы данных |
connection_type | целое число |
Тип подключения: 0 или 1 или 2 или 3 или 4 или 5 или |
Значения ":: — это символические псевдоконстанты, которые могут быть указаны вместо буквальных числовых значений. Они должны быть указаны в виде строк и чувствительны к регистру. xxx"
Событие в классе general указывает код состояния операции и её детали. Таблица 6.29, «Общие поля событий» указывает разрешённые поля для событий general.
Таблица 6.29 Общие поля событий
| Имя поля | Тип поля | Описание |
|---|---|---|
general_error_code | целое число |
Статус события: 0: OK В противном случае: Ошибка |
general_thread_id | целое без знака | Идентификатор подключения/потока |
general_user.str | строка | Имя пользователя, указанное во время аутентификации |
general_user.length | целое без знака | Длина имени пользователя |
general_command.str | строка | Имя команды |
general_command.length | целое без знака | Длина имени команды |
general_query.str | строка | Текст SQL-запроса |
general_query.length | целое без знака | Длина текста SQL-запроса |
general_host.str | строка | Имя хоста |
general_host.length | целое без знака | Длина имени хоста |
general_sql_command.str | строка | Имя типа SQL-команды |
general_sql_command.length | целое без знака | Длина имени типа SQL-команды |
general_external_user.str | строка | Внешнее имя пользователя (предоставленное плагином аутентификации стороннего поставщика) |
general_external_user.length | целое без знака | Длина внешнего имени пользователя |
general_ip.str | строка | IP-адрес подключённого пользователя |
general_ip.length | целое без знака | Длина IP-адреса подключённого пользователя |
general_command.str указывает имя команды: Query, Execute, Quit или Change user.
Событие general с полем general_command.str, установленным в Query или Execute, содержит general_sql_command.str, установленное на значение, определяющее тип SQL-команды: alter_db, alter_db_upgrade, admin_commands и так далее. Доступные значения general_sql_command.str можно увидеть как последние компоненты инструментов Performance Schema, отображаемых данным запросом:
mysql> SELECT NAME FROM performance_schema.setup_instruments
WHERE NAME LIKE 'statement/sql/%' ORDER BY NAME;
+---------------------------------------+
| NAME |
+---------------------------------------+
| statement/sql/alter_db |
| statement/sql/alter_db_upgrade |
| statement/sql/alter_event |
| statement/sql/alter_function |
| statement/sql/alter_instance |
| statement/sql/alter_procedure |
| statement/sql/alter_server |
...
Событие в классе table_access предоставляет информацию о конкретном типе доступа к таблице. Таблица 6.30, «Поля событий доступа к таблице» указывает разрешённые поля для событий table_access.
Таблица 6.30 Поля событий доступа к таблице
| Имя поля | Тип поля | Описание |
|---|---|---|
connection_id | целое без знака | Идентификатор подключения события |
sql_command_id | целое число | Идентификатор SQL-команды |
query.str | строка | Текст SQL-запроса |
query.length | целое без знака | Длина текста SQL-запроса |
table_database.str | строка | Имя базы данных, связанное с событием |
table_database.length | целое без знака | Длина имени базы данных |
table_name.str | строка | Имя таблицы, связанное с событием |
table_name.length | целое без знака | Длина имени таблицы |
В следующей таблице показано, какие запросы генерируют события доступа к таблицам:
-
Событие
read:SELECTINSERT ... SELECT(для таблиц, упомянутых в предложенииSELECT)REPLACE ... SELECT(для таблиц, упомянутых в предложенииSELECT)UPDATE ... WHERE(для таблиц, упомянутых в предложенииWHERE)HANDLER ... READ
-
Событие
delete:DELETETRUNCATE TABLE
-
Событие
insert:INSERTINSERT ... SELECT(для таблицы, упомянутой в предложенииINSERT)REPLACEREPLACE ... SELECT(для таблицы, упомянутой в предложенииREPLACE)LOAD DATALOAD XML
-
Событие
update:UPDATEUPDATE ... WHERE(для таблиц, упомянутых в предложенииUPDATE)
Блокирование выполнения определенных событий
Начиная с MySQL 5.7.20, элементы могут включать элемент, который указывает, нужно ли предотвращать выполнение соответствующих событий. Это позволяет задавать правила, которые блокируют выполнение конкретных SQL-запросов.
Элемент должен появляться внутри элемента. Например:
"event": {
"name": qualifying event subclass names
"abort": condition
}
Для подклассов событий, выбранных элементом, действие равно true или false, в зависимости от оценки. Если условие оценивается как true, событие блокируется. В противном случае событие продолжает выполняться.
Спецификация может быть простой, например, или , или может быть более сложной, так что оценка зависит от характеристик события.
Этот фильтр блокирует запросы INSERT, запросы UPDATE и запросы DELETE:
{
"filter": {
"class": {
"name": "table_access",
"event": {
"name": [ "insert", "update", "delete" ],
"abort": true
}
}
}
}
Этот более сложный фильтр блокирует те же запросы, но только для определённой таблицы ():
{
"filter": {
"class": {
"name": "table_access",
"event": {
"name": [ "insert", "update", "delete" ],
"abort": {
"and": [
{ "field": { "name": "table_database.str", "value": "finances" } },
{ "field": { "name": "table_name.str", "value": "bank_account" } }
]
}
}
}
}
}
Запросы, соответствующие фильтру и заблокированные им, возвращают ошибку клиенту:
ERROR 1045 (28000): Statement was aborted by an audit log filter
Не все события могут быть заблокированы (см. Таблица 6.27, «Логирование и отмена по комбинациям класса и подкласса события»). Для события, которое нельзя заблокировать, журнал аудита запишет предупреждение в журнал ошибок вместо блокировки.
Для попыток определить фильтр, в котором элемент появляется не внутри элемента, возникает ошибка.
Логические операторы
Логические операторы ( , , ) позволяют создавать сложные условия, что позволяет создавать более сложные конфигурации фильтрации. Следующий элемент регистрирует только события с полями, имеющими определенное значение и длину:
{
"filter": {
"class": {
"name": "general",
"event": {
"name": "status",
"log": {
"or": [
{
"and": [
{ "field": { "name": "general_command.str", "value": "Query" } },
{ "field": { "name": "general_command.length", "value": 5 } }
]
},
{
"and": [
{ "field": { "name": "general_command.str", "value": "Execute" } },
{ "field": { "name": "general_command.length", "value": 7 } }
]
}
]
}
}
}
}
}
Использование предопределенных переменных
Для ссылки на предопределённую переменную в условии используйте элемент, который принимает элементы и элементы и проверяет равенство именованной переменной заданному значению:
"variable": {
"name": "variable_name",
"value": comparison_value
}
Это верно, если имеет значение , в противном случае — ложно.
Пример:
{
"filter": {
"class": {
"name": "general",
"event": {
"name": "status",
"log": {
"variable": {
"name": "audit_log_connection_policy_value",
"value": "::none"
}
}
}
}
}
}
Каждая предопределённая переменная соответствует системной переменной. Написав фильтр, проверяющий предопределенную переменную, можно изменить работу фильтра, установив соответствующую системную переменную, без переопределения фильтра. Например, написав фильтр, проверяющий значение предопределённой переменной , можно изменить работу фильтра, изменив значение системной переменной .
Системные переменные используются для журнала аудита в режиме обратной совместимости (см. Раздел 6.4.5.10, «Фильтрация журнала аудита в режиме обратной совместимости»). В фильтрации журналов аудита на основе правил эти переменные остаются видимыми (например, с помощью ), но изменения в них не имеют эффекта, если вы не используете конструкции, ссылающиеся на них.
Следующий список описывает разрешённые предопределённые переменные для элементов:
-
Эта переменная соответствует значению системной переменной . Значение — целое без знака. Таблица 6.31, «Значения audit_log_connection_policy_value» показывает разрешённые значения и соответствующие значения .
Таблица 6.31 Значения audit_log_connection_policy_value
Таблица 6.31 Значения audit_log_connection_policy_value Значение Соответствующее значение audit_log_connection_policy или или или Значения являются символическими псевдоконстантами, которые можно использовать вместо числовых значений. Они должны быть указаны в кавычках и чувствительны к регистру.
-
Эта переменная соответствует значению системной переменной . Значение — целое без знака. Таблица 6.32, «Значения audit_log_policy_value» показывает разрешённые значения и соответствующие значения .
Таблица 6.32 Значения audit_log_policy_value
Таблица 6.32 Значения audit_log_policy_value Значение Соответствующее значение audit_log_policy или или или или Значения являются символическими псевдоконстантами, которые можно использовать вместо числовых значений. Они должны быть указаны в кавычках и чувствительны к регистру.
-
Эта переменная соответствует значению системной переменной . Значение — целое без знака. Таблица 6.33, «Значения audit_log_statement_policy_value» показывает разрешённые значения и соответствующие значения .
Таблица 6.33 Значения audit_log_statement_policy_value
Таблица 6.33 Значения audit_log_statement_policy_value Значение Соответствующее значение audit_log_statement_policy или или или Значения являются символическими псевдоконстантами, которые можно использовать вместо числовых значений. Они должны быть указаны в кавычках и чувствительны к регистру.
Использование предопределённых функций
Для ссылки на предопределённую функцию в условии log используйте элемент function, который принимает элементы name и args для указания имени функции и её аргументов соответственно:
"function": {
"name": "function_name",
"args": arguments
}
Элемент name должен содержать только имя функции без скобок и списка аргументов.
Элемент args должен удовлетворять следующим условиям:
Если функция не принимает аргументов, элемент
argsне должен быть указан.Если функция принимает аргументы, необходим элемент
args, и аргументы должны быть указаны в порядке, указанном в описании функции. Аргументы могут ссылаться на предопределённые переменные, поля событий или строковые или числовые константы.
Если количество аргументов неверно или типы аргументов не соответствуют требованиям функции, возникает ошибка.
Пример:
{
"filter": {
"class": {
"name": "general",
"event": {
"name": "status",
"log": {
"function": {
"name": "find_in_include_list",
"args": [ { "string": [ { "field": "user.str" },
{ "string": "@"},
{ "field": "host.str" } ] } ]
}
}
}
}
}
}
Предыдущий фильтр определяет, нужно ли регистрировать события класса general status в зависимости от того, найден ли текущий пользователь в системной переменной audit_log_include_accounts. Этот пользователь создаётся с помощью полей в событии.
В следующем списке описаны разрешённые предопределённые функции для элементов function:
-
audit_log_exclude_accounts_is_null()Проверяет, является ли системная переменная
audit_log_exclude_accountsNULL. Эта функция может быть полезна при определении фильтров, соответствующих реализации аудиторного журнала предыдущей версии.Аргументы:
Нет.
-
audit_log_include_accounts_is_null()Проверяет, является ли системная переменная
audit_log_include_accountsNULL. Эта функция может быть полезна при определении фильтров, соответствующих реализации аудиторного журнала предыдущей версии.Аргументы:
Нет.
-
debug_sleep(millisec)Засыпает на указанное количество миллисекунд. Эта функция используется при измерении производительности.
debug_sleep()доступен только для отладочных сборок.Аргументы:
millisec: Беззнаковое целое число, указывающее количество миллисекунд ожидания.
-
find_in_exclude_list(account)Проверяет, существует ли строка учётной записи в списке исключений аудиторного журнала (значение системной переменной
audit_log_exclude_accounts).Аргументы:
account: Строка, указывающая имя учётной записи пользователя.
-
find_in_include_list(account)Проверяет, существует ли строка учётной записи в списке включений аудиторного журнала (значение системной переменной
audit_log_include_accounts).Аргументы:
account: Строка, указывающая имя учётной записи пользователя.
-
string_find(text, substr)Проверяет, содержится ли значение
substrв значенииtext. Поиск регистрозависимый.Аргументы:
text: Строка текста для поиска.substr: Подстрока для поиска вtext.
Замена фильтра пользователя
В некоторых случаях определение фильтра может динамически изменяться. Для этого определите конфигурацию filter внутри существующего элемента filter. Например:
{
"filter": {
"id": "main",
"class": {
"name": "table_access",
"event": {
"name": [ "update", "delete" ],
"log": false,
"filter": {
"class": {
"name": "general",
"event" : { "name": "status",
"filter": { "ref": "main" } }
},
"activate": {
"or": [
{ "field": { "name": "table_name.str", "value": "temp_1" } },
{ "field": { "name": "table_name.str", "value": "temp_2" } }
]
}
}
}
}
}
}
Новый фильтр активируется, когда элемент activate внутри подфильтра принимает значение true. Использование элемента activate в верхнем уровне filter не разрешено.
Новый фильтр может быть заменён исходным с помощью элемента ref внутри подфильтра для ссылки на исходный фильтр id.
Работа показанного фильтра выглядит следующим образом:
Фильтр
mainожидает событийtable_access, либоupdate, либоdelete.Если происходит событие
updateилиdeletetable_accessна таблицеtemp_1илиtemp_2, фильтр заменяется внутренним фильтром (безid, так как нет необходимости явно ссылаться на него).Если сигнализируется конец команды (событие
general/status), запись записывается в файл аудиторного журнала, и фильтр заменяется фильтромmain.
Фильтр полезен для регистрации заявлений, которые обновляют или удаляют что-либо из таблиц temp_1 или temp_2, например, такой:
UPDATE temp_1, temp_3 SET temp_1.a=21, temp_3.a=23;
Заявление генерирует несколько событий table_access, но в файле аудиторного журнала содержатся только записи general или status.
Любые значения id, используемые в определении, оцениваются только по отношению к этому определению. Они никак не связаны со значением системной переменной audit_log_filter_id.
© 2025 Oracle
Licensed under the GPLv2 License.