6.4.5.9 旧版模式审核日志过滤
Note
本节描述了旧审核日志过滤,该过滤规则适用于以下两种情况之一:
-
在 MySQL 5.7.13 之前,也就是说,在引入第 6.4.5.7 节“审核日志过滤”中描述的基于规则的审核日志过滤之前。
-
从 MySQL 5.7.13 开始,如果安装了
audit_log
插件,但未安装基于规则的过滤所需的随附审计 table 和 UDF。
审核日志插件可以过滤审核的事件。这使您可以根据事件起源的帐户或事件状态来控制是否将已审计事件写入审计日志文件。对于连接事件和语句事件,状态筛选分别发生。
按帐户过滤事件
要基于原始帐户过滤审核的事件,请在服务器启动或运行时设置以下系统变量之一:
-
audit_log_include_accounts:要包括在审核日志 Logging 的帐户。如果设置了此变量,则仅审核这些帐户。
-
audit_log_exclude_accounts:要从审核日志 Logging 排除的帐户。如果设置了此变量,将审核除这些帐户以外的所有帐户。
任一变量的值都可以是NULL
,也可以是包含一个或多个以逗号分隔的帐户名的字符串,每个名称均为user_name@host_name
格式。默认情况下,两个变量均为NULL
,在这种情况下,不进行帐户筛选,并且对所有帐户进行审核。
对audit_log_include_accounts或audit_log_exclude_accounts的修改仅影响在修改之后创建的连接,而不影响现有的连接。
示例:要仅对user1
和user2
localhost 帐户帐户启用审核日志记录,请设置audit_log_include_accounts系统变量,如下所示:
SET GLOBAL audit_log_include_accounts = 'user1@localhost,user2@localhost';
一次audit_log_include_accounts或audit_log_exclude_accounts只能是非NULL
:
-
如果设置audit_log_include_accounts,则服务器会将audit_log_exclude_accounts设置为
NULL
。 -
如果尝试设置audit_log_exclude_accounts,除非audit_log_include_accounts为
NULL
,否则会发生错误。在这种情况下,必须先将audit_log_include_accounts设置为NULL
来清除它。
-- This sets audit_log_exclude_accounts to NULL
SET GLOBAL audit_log_include_accounts = value;
-- This fails because audit_log_include_accounts is not NULL
SET GLOBAL audit_log_exclude_accounts = value;
-- To set audit_log_exclude_accounts, first set
-- audit_log_include_accounts to NULL
SET GLOBAL audit_log_include_accounts = NULL;
SET GLOBAL audit_log_exclude_accounts = value;
如果检查两个变量的值,请注意SHOW VARIABLES将NULL
显示为空字符串。为避免这种情况,请改用SELECT:
mysql> SHOW VARIABLES LIKE 'audit_log_include_accounts';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| audit_log_include_accounts | |
+----------------------------+-------+
mysql> SELECT @@audit_log_include_accounts;
+------------------------------+
| @@audit_log_include_accounts |
+------------------------------+
| NULL |
+------------------------------+
如果用户名或主机名因为包含逗号,空格或其他特殊字符而需要加引号,请使用单引号将其引起来。如果变量值本身用单引号引起来,则将每个内部单引号加倍或用反斜杠对其进行转义。以下语句每个都启用本地root
帐户的审核日志记录,并且即使引用风格不同,它们也等效:
SET GLOBAL audit_log_include_accounts = 'root@localhost';
SET GLOBAL audit_log_include_accounts = '''root''@''localhost''';
SET GLOBAL audit_log_include_accounts = '\'root\'@\'localhost\'';
SET GLOBAL audit_log_include_accounts = "'root'@'localhost'";
如果启用了ANSI_QUOTES
SQL 模式,则最后一条语句将不起作用,因为在该模式下,双引号 table 示标识符引号,而不是字符串引号。
按状态过滤事件
要基于状态过滤审核的事件,请在服务器启动或运行时设置以下系统变量。这些变量仅适用于旧版审核日志过滤。对于 JSON 审核日志过滤,将应用不同的状态变量。参见审核日志选项和变量。
-
audit_log_connection_policy:连接事件的日志记录策略
-
audit_log_statement_policy:语句事件的日志记录策略
每个变量的值分别为ALL
(记录所有关联的事件;这是默认值),ERRORS
(仅记录失败的事件)或NONE
(不记录事件)。例如,要记录所有语句事件但仅记录失败的连接事件,请使用以下设置:
SET GLOBAL audit_log_statement_policy = ALL;
SET GLOBAL audit_log_connection_policy = ERRORS;
另一个策略系统变量audit_log_policy可用,但不能提供与audit_log_connection_policy和audit_log_statement_policy一样多的控制。只能在服务器启动时设置。在运行时,它是一个只读变量。它的值为ALL
(记录所有事件;这是默认值),LOGINS
(记录连接事件),QUERIES
(记录语句事件)或NONE
(不记录事件)。对于这些值中的任何一个,审核日志插件都会记录所有选定的事件,而不会区分成功还是失败。在启动时使用audit_log_policy的工作方式如下:
-
如果未设置audit_log_policy或将其设置为默认值
ALL
,则将按指定应用audit_log_connection_policy或audit_log_statement_policy的任何显式设置。如果未指定,则默认为ALL
。 -
如果将audit_log_policy设置为非
ALL
值,则该值优先,并用于设置audit_log_connection_policy和audit_log_statement_policy,如下 table 所示。如果您还将这些变量中的任何一个都设置为默认值ALL
以外的其他值,则服务器会将一条消息写入错误日志,以指示它们的值已被覆盖。
启动 audit_log_policy 值 | 产生的 audit_log_connection_policy 值 | 结果 audit_log_statement_policy 值 |
---|---|---|
LOGINS | ALL | NONE |
QUERIES | NONE | ALL |
NONE | NONE | NONE |