MySQL监视——审计日志

2023-08-31 14:47:40 浏览数 (1)

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”相同。

0 人点赞