Spec-Zone.ru › MySQL 5.7

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 Комбинации классов и подклассов событий

Таблица 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 Характеристики ведения и прерывания по каждой комбинации класса и подкласса события

Таблица 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 Поля событий подключения

Таблица 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 или "::undefined": Неопределённый

1 или "::tcp/ip": TCP/IP

2 или "::socket": Сокет

3 или "::named_pipe": Именованная труба

4 или "::ssl": TCP/IP с шифрованием

5 или "::shared_memory": Общая память


Значения "::xxx" — это символические псевдоконстанты, которые могут быть указаны вместо буквальных числовых значений. Они должны быть указаны в виде строк и чувствительны к регистру.

Событие в классе general указывает код состояния операции и её детали. Таблица 6.29, «Общие поля событий» указывает разрешённые поля для событий general.

Таблица 6.29 Общие поля событий

Таблица 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 Поля событий доступа к таблице

Таблица 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:

    • SELECT

    • INSERT ... SELECT (для таблиц, упомянутых в предложении SELECT)

    • REPLACE ... SELECT (для таблиц, упомянутых в предложении SELECT)

    • UPDATE ... WHERE (для таблиц, упомянутых в предложении WHERE)

    • HANDLER ... READ

  • Событие delete:

    • DELETE

    • TRUNCATE TABLE

  • Событие insert:

    • INSERT

    • INSERT ... SELECT (для таблицы, упомянутой в предложении INSERT)

    • REPLACE

    • REPLACE ... SELECT (для таблицы, упомянутой в предложении REPLACE)

    • LOAD DATA

    • LOAD XML

  • Событие update:

    • UPDATE

    • UPDATE ... 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_accounts NULL. Эта функция может быть полезна при определении фильтров, соответствующих реализации аудиторного журнала предыдущей версии.

    Аргументы:

    Нет.

  • audit_log_include_accounts_is_null()

    Проверяет, является ли системная переменная audit_log_include_accounts NULL. Эта функция может быть полезна при определении фильтров, соответствующих реализации аудиторного журнала предыдущей версии.

    Аргументы:

    Нет.

  • 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 или delete table_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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/audit-log-filter-definitions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API