6.4.5.7 Фильтрация аудиторского журнала
Начиная с MySQL 5.7.13, для работы фильтрации аудиторского журнала, как описано здесь, должен быть установлен плагин аудиторского журнала и соответствующие аудиторские таблицы и функции. Если плагин установлен без необходимых для фильтрации по правилам аудиторских таблиц и функций, плагин работает в режиме совместимости, описанном в разделе 6.4.5.10 «Режим совместимости фильтрации аудиторского журнала». Режим совместимости — это поведение фильтрации, как оно было до MySQL 5.7.13; то есть, до внедрения фильтрации по правилам.
Свойства фильтрации аудиторского журнала
Плагин аудиторского журнала имеет возможность управлять регистрацией аудиторских событий, фильтруя их:
-
Аудиторские события могут быть отфильтрованы по следующим характеристикам:
Аккаунт пользователя
Класс аудиторского события
Подкласс аудиторского события
Поля аудиторского события, такие как те, которые указывают на статус операции или выполняемый SQL-запрос
-
Фильтрация аудита основана на правилах:
Определение фильтра создаёт набор правил аудита. Определения могут быть сконфигурированы для включения или исключения событий для регистрации на основе описанных характеристик.
Начиная с MySQL 5.7.20, правила фильтрации могут блокировать (прерывать) выполнение соответствующих событий, помимо существующих возможностей регистрации событий.
Можно определить несколько фильтров, и любой заданный фильтр может быть назначен любому количеству учётных записей пользователей.
Можно определить фильтр по умолчанию для использования с любой учётной записью пользователя, для которой не задан явный фильтр.
Сведения о написании правил фильтрации см. в разделе 6.4.5.8 «Написание определений фильтра аудиторского журнала».
Фильтры аудиторского журнала можно определять и изменять с помощью SQL-интерфейса, основанного на вызовах функций. По умолчанию определения фильтров аудиторского журнала хранятся в базе данных системы
mysql, и вы можете отобразить фильтры аудита, запросив таблицуmysql.audit_log_filter. Вместо этого вы можете использовать другую базу данных для этой цели, в этом случае вам нужно будет запросить таблицу. Дополнительную информацию см. в разделе 6.4.5.2 «Установка или удаление MySQL Enterprise Audit».database_name.audit_log_filterВ рамках текущей сессии значение только для чтения системной переменной
audit_log_filter_idуказывает, назначен ли фильтр для сессии.
По умолчанию фильтрация аудиторского журнала по правилам не регистрирует какие-либо аудируемые события для любых пользователей. Чтобы регистрировать все аудируемые события для всех пользователей, используйте следующие операторы, которые создают простой фильтр для включения регистрации и назначают его по умолчанию для учётной записи:
SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');
Фильтр, назначенный для %, используется для подключений от любой учётной записи, для которой не задан явный фильтр (что изначально верно для всех учётных записей).
Как уже упоминалось, SQL-интерфейс для управления фильтрацией аудита основан на функциях. Следующий список кратко описывает эти функции:
audit_log_filter_set_filter(): Определение фильтра.audit_log_filter_remove_filter(): Удаление фильтра.audit_log_filter_set_user(): Начало фильтрации учётной записи пользователя.audit_log_filter_remove_user(): Остановка фильтрации учётной записи пользователя.audit_log_filter_flush(): Сброс ручных изменений в таблицы фильтров для применения текущей фильтрации.
Примеры использования и полные сведения о функциях фильтрации см. в разделах «Использование функций фильтрации аудиторского журнала» и «Функции аудиторского журнала».
Ограничения функций фильтрации аудиторского журнала
Функции фильтрации аудиторского журнала ограничены следующими условиями:
Для использования любой функции фильтрации должен быть включён плагин
audit_log, в противном случае произойдёт ошибка. Кроме того, должны существовать аудиторские таблицы, иначе произойдёт ошибка. Инструкции по установке плагинаaudit_logи его сопутствующих функций и таблиц см. в разделе 6.4.5.2 «Установка или удаление MySQL Enterprise Audit».-
Для использования любой функции фильтрации пользователь должен обладать правом
SUPER, иначе произойдёт ошибка. Чтобы предоставить правоSUPERпользователю, используйте следующее утверждение:GRANT SUPER ON *.* TO
user;В качестве альтернативы, если вы хотите избежать предоставления права
SUPER, но при этом разрешить пользователям доступ к определённым функциям фильтрации, можно определить хранимые программы «“обёртки”». Данный приём описан в контексте функций ключей в разделе «Использование функций ключей общего назначения»; его можно адаптировать для использования с функциями фильтрации. -
Плагин
audit_logработает в режиме совместимости, если он установлен, но соответствующие аудиторские таблицы и функции не созданы. Плагин записывает эти сообщения в журнал ошибок при запуске сервера:[Warning] Plugin audit_log reported: 'Failed to open the audit log filter tables.' [Warning] Plugin audit_log reported: 'Audit Log plugin supports a filtering, which has not been installed yet. Audit Log plugin will run in the legacy mode, which will be disabled in the next release.'
В режиме совместимости фильтрация может быть выполнена только на основе учётной записи события или его статуса. Подробности см. в разделе 6.4.5.10 «Режим совместимости фильтрации аудиторского журнала».
Использование функций фильтрации журнала аудита
Перед использованием функций журнала аудита установите их в соответствии с инструкциями, предоставленными в разделе 6.4.5.2, «Установка или удаление MySQL Enterprise Audit». Для использования любой из этих функций требуется привилегия SUPER.
Функции фильтрации журнала аудита позволяют контролировать фильтрацию, предоставляя интерфейс для создания, изменения и удаления определений фильтров и назначения фильтров учетным записям пользователей.
Определения фильтров представляют собой JSON значения. Сведения об использовании JSON данных в MySQL см. в разделе 11.5, «Тип данных JSON». В этом разделе показаны некоторые простые определения фильтров. Дополнительные сведения об определениях фильтров см. в разделе 6.4.5.8, «Написание определений фильтров журнала аудита».
При подключении соединения плагин журнала аудита определяет используемый фильтр для новой сессии, выполняя поиск имени учетной записи пользователя в текущих назначениях фильтров:
Если пользователю назначен фильтр, журнал аудита использует этот фильтр.
В противном случае, если назначение фильтра для конкретного пользователя не существует, но существует фильтр, назначенный для учетной записи по умолчанию (
%), журнал аудита использует фильтр по умолчанию.В противном случае, журнал аудита не выбирает события аудита из сессии для обработки.
Если в течение сессии происходит операция смены пользователя (см. ), назначение фильтра для сессии обновляется по тем же правилам, но для нового пользователя.
По умолчанию ни одной учетной записи не назначен фильтр, поэтому для любой учетной записи не происходит обработки событий, подлежащих аудиту.
Предположим, что вы хотите изменить значение по умолчанию на протоколирование только связанной с подключением активности (например, для просмотра событий подключения, смены пользователя и отключения, но не SQL-запросов, выполняемых пользователями во время подключения). Для этого определите фильтр (называемый здесь log_conn_events), который позволяет протоколировать только события в классе connection, и назначьте этот фильтр учетной записи по умолчанию, представленной именем учетной записи %:
SET @f = '{ "filter": { "class": { "name": "connection" } } }';
SELECT audit_log_filter_set_filter('log_conn_events', @f);
SELECT audit_log_filter_set_user('%', 'log_conn_events');
Теперь журнал аудита использует этот фильтр учетной записи по умолчанию для подключений от любой учетной записи, которой явно не определен фильтр.
Чтобы явно назначить фильтр конкретной учетной записи пользователя или нескольким учетным записям, определите фильтр, а затем назначьте его соответствующим учетным записям:
SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('user1@localhost', 'log_all');
SELECT audit_log_filter_set_user('user2@localhost', 'log_all');
Теперь полное протоколирование включено для user1@localhost и user2@localhost. Подключения от других учетных записей по-прежнему фильтруются с использованием фильтра учетной записи по умолчанию.
Чтобы отвязать учетную запись пользователя от текущего фильтра, либо отменить назначение фильтра, либо назначить другой фильтр:
-
Чтобы отменить назначение фильтра для учетной записи пользователя:
SELECT audit_log_filter_remove_user('user1@localhost');Фильтрация текущих сессий для учетной записи не изменяется. Последующие подключения от учетной записи фильтруются с использованием фильтра учетной записи по умолчанию, если он существует, и не протоколируются в противном случае.
-
Чтобы назначить другой фильтр для учетной записи пользователя:
SELECT audit_log_filter_set_filter('log_nothing', '{ "filter": { "log": false } }'); SELECT audit_log_filter_set_user('user1@localhost', 'log_nothing');Фильтрация текущих сессий для учетной записи не изменяется. Последующие подключения от учетной записи фильтруются с использованием нового фильтра. В данном случае это означает, что протоколирование новых подключений от
user1@localhostне производится.
Для фильтрации журнала аудита сравнения имен пользователей и имен хостов регистрозависимые. Это отличается от сравнений для проверки привилегий, для которых сравнения имен хостов не регистрозависимые.
Для удаления фильтра выполните следующие действия:
SELECT audit_log_filter_remove_filter('log_nothing');
Удаление фильтра также отменяет его назначение для всех пользователей, которым он был назначен, включая текущие сессии для этих пользователей.
Описанные выше функции фильтрации аудита влияют на фильтрацию аудита немедленно и обновляют таблицы журнала аудита в базе данных системы mysql, в которых хранятся фильтры и учетные записи пользователей (см. Таблицы журнала аудита). Также возможно напрямую изменять таблицы журнала аудита с помощью таких операторов, как INSERT, UPDATE и DELETE, но такие изменения не влияют на фильтрацию немедленно. Чтобы применить внесенные изменения и сделать их действующими, вызовите audit_log_filter_flush():
SELECT audit_log_filter_flush();
audit_log_filter_flush() следует использовать только после непосредственного изменения таблиц аудита для принудительной перезагрузки всех фильтров. В противном случае следует избегать использования этой функции. По сути, это упрощенная версия выгрузки и перезагрузки плагина audit_log с помощью UNINSTALL PLUGIN плюс INSTALL PLUGIN.
audit_log_filter_flush() влияет на все текущие сессии и отсоединяет их от предыдущих фильтров. Текущие сессии больше не протоколируются, если они не отключатся и не подключатся заново или не выполнят операцию смены пользователя.
Чтобы определить, назначен ли фильтр текущей сессии, проверьте значение сессии для системной переменной только для чтения audit_log_filter_id. Если значение равно 0, фильтр не назначен. ненулевое значение указывает внутренний ID назначенного фильтра:
mysql> SELECT @@audit_log_filter_id;
+-----------------------+
| @@audit_log_filter_id |
+-----------------------+
| 2 |
+-----------------------+
© 2025 Oracle
Licensed under the GPLv2 License.