MySQL的企业版中提供了审计日志功能。通过审计日志可以记录用户的登录、连接、执行的查询等行为,输出XML格式或者JSON格式的日志文件。
审计日志功能使用“audit_log”服务器插件和其他的组件实现,提供基于规则的过滤功能,并且能够将规则分别适用于不同的用户。日志的内容包括如下:
- 系统发生的错误
- 客户端的连接与断开
- 连接时执行的查询与操作
- 用户访问了哪些数据库和表
安装
安装审计日志时,需要使用MySQL共享路径"share"下的安装脚本“audit_log_filter_win_install.sql”或“audit_log_filter_linux_install.sql”。脚本将安装服务器插件“audit_log”,该插件用于审计事件,并决定是否将事件记入日志。用户自定义函数用于定义过滤规则、控制日志的行为、加密密码、日志文件的读取。mysql库中的系统表“audit_log_filter”用于保存过滤规则,“audit_log_user”用于保存用户的数据,如果这两个表不存在,审计插件将使用传统的基于策略的方式记录日志。用户可以通过系统变量对审计日志进行配置,还可以利用状态变量查看操作信息。用户需要注意,审计日志一旦安装,将一直驻留在服务器上,如果希望卸载,需要执行一系列的语句,详细请访问官网手册。
配置审计日志
用户可以在服务器启动时,通过“audit_log”选项启用或禁用审计日志插件,并可以设置“FORCE_PLUS_PERMANENT”防止插件在服务器运行时被删除。日志名称默认为“audit.log”,保存在服务器的数据路径下,用户可以通过“audit_log_file”系统变量在服务器启动时,对其名称和路径进行更改。“audit_log_rotate_on_size”选项用于配置日志轮换,如果该选项值大于0,日志文件达到所设定的值大小时,将进行轮换。开启审计日志会对服务器的性能产生一定的影响,用户可以通过配置“audit_log_strategy”选项值,调整其对性能的影响,以达到合规和性能的平衡。
开启过滤
开启过滤时,首先,需要定义一个过滤器“audit_log_filter_set_filter(名称,定义)”,定义需要使用JSON格式,过滤器将保存在mysql.audit_log_filter表中。其次,将过滤器赋予一个用户,使用“audit_log_filter_set_user(用户名,过滤器名)”。注意,用户名使用“user_name@host_name”格式或者使用“%”用于其他任何没有赋予过滤器的用户,该信息将保存在“mysql.audit_log_user”表中。
日志格式
日志包含新旧两种XML格式和JSON格式
XML格式
代码语言:javascript复制<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:06:33 UTC</TIMESTAMP>
<RECORD_ID>1_2019-10-03T14:06:33</RECORD_ID>
<NAME>Audit</NAME>
<SERVER_ID>1</SERVER_ID>
<VERSION>1</VERSION>
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
--socket=/usr/local/mysql/mysql.sock
--port=3306</STARTUP_OPTIONS>
<OS_VERSION>i686-Linux</OS_VERSION>
<MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>2_2019-10-03T14:06:33</RECORD_ID>
<NAME>Connect</NAME>
<CONNECTION_ID>5</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
<CONNECTION_ATTRIBUTES>
<ATTRIBUTE>
<NAME>_pid</NAME>
<VALUE>42794</VALUE>
</ATTRIBUTE>
...
<ATTRIBUTE>
<NAME>program_name</NAME>
<VALUE>mysqladmin</VALUE>
</ATTRIBUTE>
</CONNECTION_ATTRIBUTES>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER/>
<DB>test</DB>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>6_2019-10-03T14:06:33</RECORD_ID>
<NAME>Query</NAME>
<CONNECTION_ID>5</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root[root] @ localhost [127.0.0.1]</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
<SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
<NAME>NoAudit</NAME>
<SERVER_ID>1</SERVER_ID>
</AUDIT_RECORD>
</AUDIT>
JSON格式
代码语言:javascript复制[
{
"timestamp": "2019-10-03 13:50:01",
"id": 0,
"class": "audit",
"event": "startup",
...
},
{
"timestamp": "2019-10-03 15:02:32",
"id": 0,
"class": "connection",
"event": "connect",
...
},
...
{
"timestamp": "2019-10-03 17:37:26",
"id": 0,
"class": "table_access",
"event": "insert",
...
}
...
]
日志中记录的值
审计日志中的时间戳“TIMESTAMP”使用UTC。
“NAME”表示事件的类型,包括:
- “Connect”:登录事件
- “Quit”:客户端连接断开
- “Query”:执行的SQL语句
- “Audit”/“NoAudit”审计的起始点
“STATUS”提供执行命令的状态,代码值与“SHOW ERRORS”相同。