Spec-Zone.ru › MySQL 8.4

8.4.5.8 Написание определений фильтров аудита журнала

Определения фильтров являются JSON значениями. Для получения информации об использовании JSON данных в MySQL см. Раздел 13.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" ] }
    ]
  }
}
END_OF_DOCUMENT_MARKER
Ведение журнала конкретных подклассов событий

Для выбора конкретных подклассов событий используйте элемент 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 }
]

Элемент event также может указать, блокировать ли соответствующие события, если он содержит элемент abort. Подробности см. в разделе Блокирование выполнения конкретных событий.

Таблица 8.34, «Комбинации класса и подкласса событий» описывает разрешенные значения подклассов для каждого класса событий.

Таблица 8.34 Комбинации класса и подкласса событий

Таблица 8.34 Комбинации класса и подкласса событий
Класс события Подкласс события Описание
connection connect Инициализация соединения (успешная или неуспешная)
connection change_user Повторная аутентификация пользователя с разными пользователем/паролем во время сессии
connection disconnect Завершение соединения
general status Общая информация об операции
message internal Внутреннее генерируемое сообщение
message user Сообщение, сгенерированное функцией audit_api_message_emit_udf()
table_access read Выражения чтения таблицы, такие как SELECT или INSERT INTO ... SELECT
table_access delete Выражения удаления таблицы, такие как DELETE или TRUNCATE TABLE
table_access insert Выражения вставки в таблицу, такие как INSERT или REPLACE
table_access update Выражения обновления таблицы, такие как UPDATE

Таблица 8.35, «Характеристики регистрации и прерывания по каждой комбинации класса и подкласса события» описывает для каждого подкласса события, может ли он быть зарегистрирован или прерван.

Таблица 8.35 Характеристики регистрации и прерывания по каждой комбинации класса и подкласса события

Таблица 8.35 Характеристики регистрации и прерывания по каждой комбинации класса и подкласса события
Класс события Подкласс события Может быть зарегистрирован Может быть прерван
connection connect Да Нет
connection change_user Да Нет
connection disconnect Да Нет
general status Да Нет
message internal Да Да
message user Да Да
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, события message и события 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 указывает, когда происходит связанная с подключением активность во время сессии, например, подключение или отключение пользователя от сервера. Таблица 8.36, «Поля событий подключения» указывает разрешенные поля для событий connection.

Таблица 8.36 Поля событий подключения

Таблица 8.36 Поля событий подключения
Имя поля Тип поля Описание
status integer

Статус события:

0: OK

В противном случае: Ошибка

connection_id unsigned integer Идентификатор подключения
user.str string Имя пользователя, указанное во время аутентификации
user.length unsigned integer Длина имени пользователя
priv_user.str string Имя аутентифицированного пользователя (имя пользователя учетной записи)
priv_user.length unsigned integer Длина имени аутентифицированного пользователя
external_user.str string Имя внешнего пользователя (предоставленное плагином аутентификации сторонних разработчиков)
external_user.length unsigned integer Длина имени внешнего пользователя
proxy_user.str string Имя пользователя прокси
proxy_user.length unsigned integer Длина имени пользователя прокси
host.str string Хост подключенного пользователя
host.length unsigned integer Длина хоста подключенного пользователя
ip.str string IP-адрес подключенного пользователя
ip.length unsigned integer Длина IP-адреса подключенного пользователя
database.str string Имя базы данных, указанное при подключении
database.length unsigned integer Длина имени базы данных
connection_type integer

Тип подключения:

0 или "::undefined": Неопределено

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

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

3 или "::named_pipe": Имя канала

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

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


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

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

Таблица 8.37 Поля событий общего назначения

Таблица 8.37 Поля событий общего назначения
Имя поля Тип поля Описание
general_error_code integer

Статус события:

0: OK

В противном случае: Ошибка

general_thread_id unsigned integer Идентификатор подключения/потока
general_user.str string Имя пользователя, указанное во время аутентификации
general_user.length unsigned integer Длина имени пользователя
general_command.str string Имя команды
general_command.length unsigned integer Длина имени команды
general_query.str string Текст SQL-запроса
general_query.length unsigned integer Длина текста SQL-запроса
general_host.str string Имя хоста
general_host.length unsigned integer Длина имени хоста
general_sql_command.str string Имя типа SQL-команды
general_sql_command.length unsigned integer Длина имени типа SQL-команды
general_external_user.str string Имя внешнего пользователя (предоставленное плагином аутентификации сторонних разработчиков)
general_external_user.length unsigned integer Длина имени внешнего пользователя
general_ip.str string IP-адрес подключенного пользователя
general_ip.length unsigned integer Длина 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 предоставляет информацию о конкретном типе доступа к таблице. Таблица 8.38, «Поля событий доступа к таблицам» указывает разрешенные поля для событий table_access.

Таблица 8.38 Поля событий доступа к таблицам

Таблица 8.38 Поля событий доступа к таблицам
Имя поля Тип поля Описание
connection_id unsigned integer Идентификатор подключения события
sql_command_id integer Идентификатор SQL-команды
query.str string Текст SQL-запроса
query.length unsigned integer Длина текста SQL-запроса
table_database.str string Имя базы данных, связанной с событием
table_database.length unsigned integer Длина имени базы данных
table_name.str string Имя таблицы, связанной с событием
table_name.length unsigned integer Длина имени таблицы

В следующем списке показано, какие запросы генерируют события доступа к таблицам:

  • событие 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)

Блокирование выполнения определенных событий

Элементы могут включать элемент, указывающий, следует ли предотвращать выполнение соответствующих событий. Это позволяет писать правила, которые блокируют выполнение определенных SQL-запросов.

Важно

Теоретически, пользователь с достаточными правами может случайно создать элемент фильтрации журнала аудита, который предотвращает доступ к системе как для себя, так и для других администраторов. Привилегия AUDIT_ABORT_EXEMPT позволяет запросам учетной записи пользователя всегда выполняться, даже если элемент фильтрации журнала аудита их заблокировал. Таким образом, учетные записи с этой привилегией можно использовать для восстановления доступа к системе после неправильной настройки журнала аудита. Запрос по-прежнему регистрируется в журнале аудита, но вместо отклонения он разрешается благодаря привилегии.

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

Элемент abort должен находиться внутри элемента event. Например:

"event": {
  "name": qualifying event subclass names
  "abort": condition
}

Для подклассов событий, выбранных элементом name, действие abort принимает значения «истина» или «ложь» в зависимости от результата оценки condition. Если оценка равна «истина», событие блокируется. В противном случае событие продолжает выполняться.

Спецификация condition может быть простой, например, true или false, или более сложной, так что оценка зависит от характеристик события.

Этот фильтр блокирует INSERT, UPDATE и DELETE операторы:

{
  "filter": {
    "class": {
      "name": "table_access",
      "event": {
        "name": [ "insert", "update", "delete" ],
        "abort": true
      }
    }
  }
}

Этот более сложный фильтр блокирует те же операторы, но только для определенной таблицы (finances.bank_account):

{
  "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

Не все события могут быть заблокированы (см. Таблица 8.35, «Характеристики логирования и прерывания по комбинациям классов и подклассов событий»). Для событий, которые нельзя заблокировать, журнал аудита записывает предупреждение в журнал ошибок вместо блокирования.

При попытке определить фильтр, в котором элемент abort появляется не внутри элемента event, возникает ошибка.

Логические операторы

Логические операторы (and, or, not) позволяют создавать сложные условия, что позволяет создавать более продвинутые конфигурации фильтрации. Следующий элемент log регистрирует только события general с полями general_command, имеющими определённое значение и длину:

{
  "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 } }
              ]
            }
          ]
        }
      }
    }
  }
}
Ссылка на предопределённые переменные

Чтобы сослаться на предопределённую переменную в условии log, используйте элемент variable, который принимает элементы name и value и проверяет равенство имени переменной заданному значению:

"variable": {
  "name": "variable_name",
  "value": comparison_value
}

Это верно, если variable_name имеет значение comparison_value, и ложно в противном случае.

Пример:

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "variable": {
            "name": "audit_log_connection_policy_value",
            "value": "::none"
          }
        }
      }
    }
  }
}

Каждая предопределённая переменная соответствует системной переменной. Написав фильтр, проверяющий предопределённую переменную, вы можете изменить работу фильтра, установив соответствующую системную переменную, без необходимости переопределения фильтра. Например, написав фильтр, проверяющий значение предопределённой переменной audit_log_connection_policy_value, вы можете изменить работу фильтра, изменив значение системной переменной audit_log_connection_policy.

Системные переменные audit_log_xxx_policy используются для устаревшего режима аудита (см. Раздел 8.4.5.10, «Фильтрация журнала аудита в режиме обратной совместимости»). В режиме фильтрации журнала аудита на основе правил эти переменные остаются видимыми (например, используя SHOW VARIABLES), но изменения в них не оказывают никакого влияния, если вы не используете конструкции, которые ссылаются на них в своих фильтрах.

Следующий список описывает разрешённые предопределённые переменные для элементов variable:

  • audit_log_connection_policy_value

    Эта переменная соответствует значению системной переменной audit_log_connection_policy. Значение — целое без знака. Таблица 8.39, «Значения audit_log_connection_policy_value» показывает разрешённые значения и соответствующие значения audit_log_connection_policy.

    Таблица 8.39 Значения audit_log_connection_policy_value

    Таблица 8.39 Значения audit_log_connection_policy_value
    Значение Соответствующее значение audit_log_connection_policy
    0 или "::none" NONE
    1 или "::errors" ERRORS
    2 или "::all" ALL

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

  • audit_log_policy_value

    Эта переменная соответствует значению системной переменной audit_log_policy. Значение — целое без знака. Таблица 8.40, «Значения audit_log_policy_value» показывает разрешённые значения и соответствующие значения audit_log_policy.

    Таблица 8.40 Значения audit_log_policy_value

    Таблица 8.40 Значения audit_log_policy_value
    Значение Соответствующее значение audit_log_policy
    0 или "::none" NONE
    1 или "::logins" LOGINS
    2 или "::all" ALL
    3 или "::queries" QUERIES

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

  • audit_log_statement_policy_value

    Эта переменная соответствует значению системной переменной audit_log_statement_policy. Значение — целое без знака. Таблица 8.41, «Значения audit_log_statement_policy_value» показывает разрешённые значения и соответствующие значения audit_log_statement_policy.

    Таблица 8.41 Значения audit_log_statement_policy_value

    Таблица 8.41 Значения audit_log_statement_policy_value
    Значение Соответствующее значение audit_log_statement_policy
    0 или "::none" NONE
    1 или "::errors" ERRORS
    2 или "::all" ALL

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

Использование предопределенных функций

Для ссылки на предопределённую функцию в условии 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: Строка, определяющая имя пользователя учётной записи.

  • query_digest([str])

    Поведение этой функции зависит от наличия аргумента:

    • Без аргумента, query_digest возвращает значение дайджеста утверждения, соответствующего тексту утверждения в текущем событии.

    • С аргументом, query_digest возвращает булево значение, указывающее, равно ли аргумент текущему дайджесту утверждения.

    Аргументы:

    • str: Этот аргумент необязателен. Если указан, он задаёт дайджест утверждения для сравнения с дайджестом утверждения в текущем событии.

    Примеры:

    Этот элемент function не содержит аргумента, поэтому query_digest возвращает текущий дайджест утверждения в виде строки:

    "function": {
      "name": "query_digest"
    }
    

    Этот элемент function содержит аргумент, поэтому query_digest возвращает булево значение, указывающее, равно ли аргумент текущему дайджесту утверждения:

    "function": {
      "name": "query_digest",
      "args": "SELECT ?"
    }
    
  • string_find(text, substr)

    Проверяет, содержится ли значение substr в значении text. Этот поиск учитывает регистр.

    Аргументы:

    • text: Искомая строка текста.

    • substr: Подстрока для поиска в text.

Замена значений полей событий

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

Замена полей в событиях аудита происходит следующим образом:

  • Замены полей указываются в определениях фильтров аудита, поэтому фильтрация журналов аудита должна быть включена, как описано в разделе 8.4.5.7 «Фильтрация журналов аудита».

  • Не все поля могут быть заменены. Таблица 8.42 «Поля событий, подлежащие замене» показывает, какие поля могут быть заменены в каких классах событий.

    Таблица 8.42 Поля событий, подлежащие замене

    Таблица 8.42 Поля событий, подлежащие замене
    Класс события Имя поля
    general general_query.str
    table_access query.str

  • Замена является условной. Каждое указание замены в определении фильтра включает в себя условие, позволяющее изменить заменяемое поле или оставить его без изменений в зависимости от результата условия.

  • Если замена происходит, в указании замены указывается значение замены с использованием функции, разрешенной для этой цели.

Как показывает Таблица 8.42 «Поля событий, подлежащие замене», в настоящее время единственными заменяемыми полями являются те, которые содержат текст заявления (что происходит в событиях классов general и table_access). Кроме того, единственная разрешенная функция для указания значения замены — query_digest. Это означает, что единственная разрешенная операция замены — это замена буквального текста заявления соответствующим дайджестом.

Поскольку замена полей происходит на ранней стадии аудита (во время фильтрации), выбор между записью буквального текста заявления или значения дайджеста применяется независимо от формата журнала, записанного позже (то есть, независимо от того, создает ли плагин журнала аудита выходные данные XML или JSON).

Замена полей может происходить на различных уровнях гранулярности событий:

  • Чтобы выполнить замену полей для всех событий в классе, отфильтруйте события на уровне класса.

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

В определении фильтра укажите замену полей, включив элемент print, имеющий следующий синтаксис:

"print": {
  "field": {
    "name": "field_name",
    "print": condition,
    "replace": replacement_value
  }
}

Внутри элемента print элемент field принимает эти три элемента, чтобы указать, как и происходит ли замена:

  • name: Поле, для которого (возможно) происходит замена. field_name должно быть одним из тех, которые показаны в таблице 8.42 «Поля событий, подлежащие замене».

  • print: Условие, определяющее, сохранять ли исходное значение поля или заменить его:

    • Если condition оценивается как true, поле остается без изменений.

    • Если condition оценивается как false, замена происходит, используя значение элемента replace.

    Чтобы безусловно заменить поле, укажите условие следующим образом:

    "print": false
    
  • replace: Значение замены для использования, когда условие print оценивается как false. Укажите replacement_value, используя элемент function.

Например, это определение фильтра применяется ко всем событиям класса general, заменяя буквальный текст заявления его дайджестом:

{
  "filter": {
    "class": {
      "name": "general",
      "print": {
        "field": {
          "name": "general_query.str",
          "print": false,
          "replace": {
            "function": {
              "name": "query_digest"
            }
          }
        }
      }
    }
  }
}

Предыдущий фильтр использует элемент print для безусловной замены буквального текста заявления, содержащегося в general_query.str, его дайджестом:

"print": {
  "field": {
    "name": "general_query.str",
    "print": false,
    "replace": {
      "function": {
        "name": "query_digest"
      }
    }
  }
}

Элементы print могут быть записаны различными способами для реализации различных стратегий замены. Элемент replace, только что показанный, указывает текст замены, используя эту конструкцию function для возвращения строки, представляющей текущий дайджест заявления:

"function": {
  "name": "query_digest"
}

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

"function": {
  "name": "query_digest",
  "args": "digest"
}

В этом случае query_digest возвращает true или false в зависимости от того, совпадает ли текущий дайджест заявления с дайджестом сравнения. Использование query_digest таким образом позволяет определениям фильтров обнаруживать заявления, которые соответствуют определенным дайджестам. Условие в следующей конструкции истинно только для заявлений, которые имеют дайджест, равный SELECT ?, тем самым обеспечивая замену только для заявлений, которые не соответствуют дайджесту:

"print": {
  "field": {
    "name": "general_query.str",
    "print": {
      "function": {
        "name": "query_digest",
        "args": "SELECT ?"
      }
    },
    "replace": {
      "function": {
        "name": "query_digest"
      }
    }
  }
}

Чтобы выполнить замену только для заявлений, которые соответствуют дайджесту, используйте not для инвертирования условия:

"print": {
  "field": {
    "name": "general_query.str",
    "print": {
      "not": {
        "function": {
          "name": "query_digest",
          "args": "SELECT ?"
        }
      }
    },
    "replace": {
      "function": {
        "name": "query_digest"
      }
    }
  }
}

Предположим, что журнал аудита должен содержать только дайджесты заявлений, а не буквальные заявления. Для достижения этого необходимо выполнить замену для всех событий, которые содержат текст заявления, то есть, для событий в классах general и table_access. Более раннее определение фильтра показало, как безусловно заменить текст заявления для событий general. Чтобы сделать то же самое для событий table_access, используйте фильтр, аналогичный, но меняющий класс с general на table_access, а имя поля с general_query.str на query.str:

{
  "filter": {
    "class": {
      "name": "table_access",
      "print": {
        "field": {
          "name": "query.str",
          "print": false,
          "replace": {
            "function": {
              "name": "query_digest"
            }
          }
        }
      }
    }
  }
}

Комбинирование фильтров general и table_access приводит к единому фильтру, который выполняет замену для всех событий, содержащих текст заявления:

{
  "filter": {
    "class": [
      {
        "name": "general",
        "print": {
          "field": {
            "name": "general_query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        }
      },
      {
        "name": "table_access",
        "print": {
          "field": {
            "name": "query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        }
      }
    ]
  }
}

Чтобы выполнить замену только для некоторых событий внутри класса, добавьте элементы в фильтр, которые более конкретно указывают, когда происходит замена. Следующий фильтр применяется к событиям класса table_access, но выполняет замену только для событий insert и update (оставляя события read и delete без изменений):

{
  "filter": {
    "class": {
      "name": "table_access",
      "event": {
        "name": [
          "insert",
          "update"
        ],
        "print": {
          "field": {
            "name": "query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        }
      }
    }
  }
}

Этот фильтр выполняет замену для событий класса general, соответствующих перечисленным заявлениям управления учетными записями (эффект заключается в скрытии значений учетных данных и данных в заявлениях):

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "print": {
          "field": {
            "name": "general_query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        },
        "log": {
          "or": [
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "alter_user"
              }
            },
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "alter_user_default_role"
              }
            },
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "create_role"
              }
            },
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "create_user"
              }
            }
          ]
        }
      }
    }
  }
}

Сведения о возможных значениях general_sql_command.str см. в разделе «Тестирование значений полей событий».

Замена фильтра пользователя

В некоторых случаях определение фильтра можно динамически изменить. Для этого определите конфигурацию 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, фильтр заменяется внутренним (без необходимости явной ссылки, поскольку она не нужна).

  • Если происходит сигнал окончания команды (событие 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-8.4-en/audit-log-filter-definitions.html

Spec-Zone.ru

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