基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
开启安全审计
更新时间:2026-08-13 19:27:47
通过一系列过滤器实现对特定事件进行安全审计。
审计范围
过滤器可以过滤的维度包括:账号、事件类型、事件属性等。每个过滤器可以选择对过滤出来的事件是否进行审计。
使用限制及注意事项
- 表达式必须直接且唯一地放置在一个
SELECT语句的输出列(即 select item)中,且没有父表达式(parent expr)限制。 - 表达式不能写在子查询中。
- 过滤器定义好之后,还需要设置到用户上才能够最终生效。
- 过滤器和用户是一对多的关系,即一个过滤器可以设置到多个用户上,一个用户上只能设置一个过滤器。
- 建立连接时会确定当前 Session 使用哪个审计过滤器(Audit Filter),在整个 Session 生命周期内不变。
创建过滤器
通过创建过滤器开启审计模式,过滤器支持对审计事件类型进行选择性过滤,目前支持记录所有事件、不记录所有事件和只记录登录登出三种类型的的选择。
语法
通过 AUDIT_LOG_FILTER_SET_FILTER 函数(表达式)创建过滤器,命令如下:
AUDIT_LOG_FILTER_SET_FILTER('filter_name', 'definition_of_filters');
各字段解释如下:
| 字段 | 说明 |
|---|---|
| filter_name | 用于指定过滤器名称。
说明
|
| definition_of_filters | 用于定义审计过滤器的具体配置,采用 JSON 格式进行表述。当前版本的过滤器设计原则与 MySQL 兼容,但只支持对审计事件类型进行过滤。 |
目前支持创建过滤器配置的类型如下:
记录所有事件。
{ "filter": { "log": true } }或
{ "filter": { "log": true, "class": [ { "name": "connection" }, { "name": "general" }, { "name": "table_access" } ] } }不记录所有事件。
{ "filter": { "log": false } }只记录登录登出。
{ "filter": { "log": true, "class": [ { "name": "connection" } ] } }
审计事件分类如下:
| 事件类型 | 说明 |
|---|---|
| connection | 登录退出。 |
| table_access | DML 语句。 |
| general | cmd 语句,parser 失败。 |
示例
创建记录所有事件的过滤器 log_all。
obclient [test]>SELECT AUDIT_LOG_FILTER_SET_FILTER('log_all', '{ "filter": { "log": true } }');
当 DDL 执行成功时,表达式返回
OK。+-------------------------------------------------------------------------+ | AUDIT_LOG_FILTER_SET_FILTER('log_all', '{ "filter": { "log": true } }') | +-------------------------------------------------------------------------+ | OK | +-------------------------------------------------------------------------+ 1 row in set当 DDL 失败时,
SELECT语句仍然执行成功,表达式的输出结果为错误信息。obclient [test]>SELECT AUDIT_LOG_FILTER_SET_FILTER('log_err', '1');返回结果如下:
+---------------------------------------------+ | AUDIT_LOG_FILTER_SET_FILTER('log_err', '1') | +---------------------------------------------+ | ERROR: JSON parsing error. | +---------------------------------------------+ 1 row in set
通过 mysql.audit_log_filter 视图查看审计过滤器的定义。
obclient [test]> select * from mysql.audit_log_filter;
返回结果如下:
+---------+-------------------------------+
| NAME | FILTER |
+---------+-------------------------------+
| log_all | { "filter": { "log": true } } |
+---------+-------------------------------+
1 row in set (0.003 sec)
各字段解释如下:
| 字段名称 | 描述 |
|---|---|
| NAME | 过滤器名称 |
| FILTER | 过滤器定义 |
配置过滤器
通过配置过滤器给对应的用户后,后台线程才能打印审计日志。
语法
通过 AUDIT_LOG_FILTER_SET_USER 函数(表达式)将过滤器设置到用户上。
AUDIT_LOG_FILTER_SET_USER('user_name', 'filter_name');
各字段解释如下:
| 字段 | 说明 |
|---|---|
| user_name | 用于指定用户名称。
说明
|
| filter_name | 用于指定过滤器名称。
说明
|
示例
将过滤器 log_all 设置到用户上 user001。
obclient [test]> SELECT AUDIT_LOG_FILTER_SET_USER('user001', 'log_all');
当 DDL 执行成功时,表达式返回
OK。+-------------------------------------------------+ | AUDIT_LOG_FILTER_SET_USER('user001', 'log_all') | +-------------------------------------------------+ | OK | +-------------------------------------------------+ 1 row in set当 DDL 执行失败时,
SELECT语句仍然执行成功,表达式的输出结果为错误信息。obclient [test]>SELECT AUDIT_LOG_FILTER_SET_USER('log_err', '1');返回结果如下:
+--------------------------------------------+ | AUDIT_LOG_FILTER_SET_USER('log_err', '1') | +--------------------------------------------+ | ERROR: Invalid character in the user name. | +--------------------------------------------+ 1 row in set (0.001 sec)
通过 mysql.audit_log_user 视图查看审计过滤器和用户的映射关系。。
obclient [test]> select * from mysql.audit_log_user;
返回结果如下:
+---------+------+------------+
| USER | HOST | FILTERNAME |
+---------+------+------------+
| user001 | % | log_all |
+---------+------+------------+
1 row in set (0.003 sec)
各字段解释如下:
| 字段名称 | 描述 |
|---|---|
| USER | 用户名 |
| HOST | 主机名 |
| FILTERNAME | 过滤器名称 |
开启审计
通过配置项 audit_log_enable 开启用户租户下的审计功能。
obclient> ALTER SYSTEM SET audit_log_enable=TRUE;