每当发生可审计事件时,MySQL 服务器调用审计日志插件将审计记录写入其日志文件。通常在插件启动后写入的第一条审计记录包含服务器描述和启动选项。紧随其后的元素表示诸如客户端连接和断开连接事件、执行的 SQL 语句等事件。仅记录顶级语句,而不记录存储程序(例如触发器或存储过程)中的语句。语句引用的文件内容,例如LOAD
DATA未记录。
要选择审计日志插件用于写入其日志文件的日志格式,请
audit_log_format在服务器启动时设置系统变量。这些格式可用:
新式 XML 格式 (
audit_log_format=NEW):与旧式 XML 格式相比,与 Oracle Audit Vault 具有更好兼容性的 XML 格式。MySQL 5.7 引入了这种格式,从 MySQL 5.6.14 开始向后移植到 MySQL 5.6。旧式 XML 格式 (
audit_log_format=OLD):旧版 MySQL 系列中默认使用的原始审计日志格式。MySQL 5.6 默认使用旧式 XML 格式。
更改 的值
audit_log_format可能导致将一种格式的日志条目写入包含不同格式条目的现有日志文件。为避免此问题,请使用
审计日志文件格式中描述的过程。
审计日志文件内容未加密。请参阅 第 6.4.4.2 节,“MySQL 企业审计安全注意事项”。
以下部分描述了可用的审计日志记录格式:
下面是一个采用新型 XML 格式 ( audit_log_format=NEW) 的示例日志文件,为了便于阅读,稍微重新设置了格式:
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD>
<TIMESTAMP>2017-10-16T14:06:33 UTC</TIMESTAMP>
<RECORD_ID>1_2017-10-16T14: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.6.39-log</MYSQL_VERSION>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2017-10-16T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>2_2017-10-16T14: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>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER/>
<DB>test</DB>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2017-10-16T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>6_2017-10-16T14: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>2017-10-16T14:09:39 UTC</TIMESTAMP>
<RECORD_ID>8_2017-10-16T14:06:33</RECORD_ID>
<NAME>Quit</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>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2017-10-16T14:09:43 UTC</TIMESTAMP>
<RECORD_ID>11_2017-10-16T14:06:33</RECORD_ID>
<NAME>Quit</NAME>
<CONNECTION_ID>6</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>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2017-10-16T14:09:45 UTC</TIMESTAMP>
<RECORD_ID>12_2017-10-16T14:06:33</RECORD_ID>
<NAME>NoAudit</NAME>
<SERVER_ID>1</SERVER_ID>
</AUDIT_RECORD>
</AUDIT>
审计日志文件以 XML 格式编写,使用 UTF-8(每个字符最多 4 个字节)。根元素是
<AUDIT>. 根元素包含
<AUDIT_RECORD>元素,每个元素都提供有关审计事件的信息。当审计日志插件开始写入新的日志文件时,它会写入 XML 声明和打开<AUDIT>
根元素标记。当插件关闭日志文件时,它会写入结束</AUDIT>根元素标记。文件打开时,结束标记不存在。
元素中的<AUDIT_RECORD>
元素具有以下特征:
有些元素出现在每个
<AUDIT_RECORD>元素中。其他是可选的,可能会出现,具体取决于审计记录类型。<AUDIT_RECORD>不保证 元素内元素的顺序 。元素值不是固定长度的。如稍后给出的元素描述中所示,长值可能会被截断。
、
<、和字符分别 编码为>、 、 和 。NUL 字节 (U+00) 被编码为字符。"&<>"&?作为 XML 字符无效的字符使用数字字符引用进行编码。有效的 XML 字符是:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
每个元素中都必须包含以下元素
<AUDIT_RECORD>:
<NAME>表示生成审核事件的指令类型的字符串,例如服务器从客户端接收的命令。
例子:
<NAME>Query</NAME>一些共同的
<NAME>价值观:Audit When auditing starts, which may be server startup time Connect When a client connects, also known as logging in Query An SQL statement (executed directly) Prepare Preparation of an SQL statement; usually followed by Execute Execute Execution of an SQL statement; usually follows Prepare Shutdown Server shutdown Quit When a client disconnects NoAudit Auditing has been turned off可能 的 值为
Audit,Binlog Dump,Change user,Close stmt,Connect Out,Connect,Create DB,Daemon,Debug,Delayed insert,Drop DB,Execute,Fetch,Field List,Init DB,Kill,Long Data,NoAudit,Ping,Prepare,Processlist,Query,Quit,Refresh,Register Slave,Reset stmt,Set option,Shutdown, 。Sleep_StatisticsTable DumpTime除了
Audit和 之外NoAudit,这些值对应 于头文件 中列出的命令值 。例如, 和分别对应于 和 。COM_xxxmysql_com.hCreate DBChange userCOM_CREATE_DBCOM_CHANGE_USER<RECORD_ID>审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
. 当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 1。时间戳是一个 UTC 值, 格式表示审计日志插件打开文件的日期和时间。SEQ_TIMESTAMPYYYY-MM-DDThh:mm:ss例子:
<RECORD_ID>12_2017-10-16T14:06:33</RECORD_ID><TIMESTAMP>表示 UTC 值的字符串,其 格式指示生成审计事件的日期和时间。例如,对应于执行从客户端接收到的 SQL 语句的事件具有 在语句完成之后发生的值,而不是在接收到语句时发生的值。
YYYY-MM-DDThh:mm:ssUTC<TIMESTAMP>例子:
<TIMESTAMP>2017-10-16T14:09:45 UTC</TIMESTAMP>
以下元素在元素中是可选的
<AUDIT_RECORD>。其中许多只出现在特定的<NAME>
元素值中。
<COMMAND_CLASS>指示执行的操作类型的字符串。
例子:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>这些值对应于 指示命令计数的状态变量;例如 and count 和 statements,分别。以下语句显示可能的名称:
Com_xxxCom_drop_tableCom_selectDROP TABLESELECTSELECT LOWER(REPLACE(VARIABLE_NAME, 'COM_', '')) AS name FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'COM%' ORDER BY name;<CONNECTION_ID>表示客户端连接标识符的无符号整数。
CONNECTION_ID()这与会话中函数 返回的值相同 。例子:
<CONNECTION_ID>127</CONNECTION_ID><DB>表示默认数据库名称的字符串。
例子:
<DB>test</DB><HOST>表示客户端主机名的字符串。
例子:
<HOST>localhost</HOST><IP>表示客户端 IP 地址的字符串。
例子:
<IP>127.0.0.1</IP><MYSQL_VERSION>表示 MySQL 服务器版本的字符串。
VERSION()这与函数或version系统变量 的值相同 。例子:
<MYSQL_VERSION>5.6.39-log</MYSQL_VERSION><OS_LOGIN>表示身份验证过程中使用的外部用户名的字符串,由用于对客户端进行身份验证的插件设置。使用本机(内置)MySQL 身份验证,或者如果插件未设置该值,则此元素为空。
external_user该值与系统变量的值相同(请参阅第 6.2.12 节,“代理用户”)。例子:
<OS_LOGIN>jeffrey</OS_LOGIN><OS_VERSION>表示构建或运行服务器的操作系统的字符串。
例子:
<OS_VERSION>x86_64-Linux</OS_VERSION><PRIV_USER>一个字符串,表示服务器将客户端验证为的用户。这是服务器用于权限检查的用户名,可能与
<USER>值不同。例子:
<PRIV_USER>jeffrey</PRIV_USER><PROXY_USER>表示代理用户的字符串(请参阅 第 6.2.12 节,“代理用户”)。如果用户代理未生效,则该值为空。
例子:
<PROXY_USER>developer</PROXY_USER><SERVER_ID>表示服务器 ID 的无符号整数。
server_id这与系统变量 的值相同 。例子:
<SERVER_ID>1</SERVER_ID><SQLTEXT>表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,是使用 UTF-8 编写的(每个字符最多 4 个字节),因此该值可能是转换后的结果。例如,原始语句可能是作为 SJIS 字符串从客户端收到的。
例子:
<SQLTEXT>DELETE FROM t1</SQLTEXT><STARTUP_OPTIONS>一个字符串,表示在启动 MySQL 服务器时在命令行或选项文件中给出的选项。第一个选项是服务器可执行文件的路径。
例子:
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log_output=FILE</STARTUP_OPTIONS><STATUS>表示命令状态的无符号整数:0 表示成功,非零表示发生错误。
mysql_errno()这与C API 函数的值相同 。<STATUS_CODE>有关它与 的区别的信息, 请参阅说明<STATUS>。审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参阅 服务器错误消息参考。
不记录警告。
例子:
<STATUS>1051</STATUS><STATUS_CODE>表示命令状态的无符号整数:0 表示成功,1 表示发生错误。
该
STATUS_CODE值与 以下值不同STATUS:STATUS_CODE0 表示成功,1 表示错误,这与 Audit Vault 的 EZ_collector 消费者兼容。STATUS是mysql_errno()C API 函数的值。这是 0 表示成功,非零表示错误,因此不一定是 1 表示错误。例子:
<STATUS_CODE>0</STATUS_CODE><USER>代表客户端发送的用户名的字符串。这可能与
<PRIV_USER>值不同。例子:
<USER>root[root] @ localhost [127.0.0.1]</USER><VERSION>表示审计日志文件格式版本的无符号整数。
例子:
<VERSION>1</VERSION>
以下是旧式 XML 格式 ( audit_log_format=OLD) 的示例日志文件,为了便于阅读,略微重新设置了格式:
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD
TIMESTAMP="2017-10-16T14:25:00 UTC"
RECORD_ID="1_2017-10-16T14:25:00"
NAME="Audit"
SERVER_ID="1"
VERSION="1"
STARTUP_OPTIONS="--port=3306"
OS_VERSION="i686-Linux"
MYSQL_VERSION="5.6.39-log"/>
<AUDIT_RECORD
TIMESTAMP="2017-10-16T14:25:24 UTC"
RECORD_ID="2_2017-10-16T14:25:00"
NAME="Connect"
CONNECTION_ID="4"
STATUS="0"
STATUS_CODE="0"
USER="root"
OS_LOGIN=""
HOST="localhost"
IP="127.0.0.1"
COMMAND_CLASS="connect"
PRIV_USER="root"
PROXY_USER=""
DB="test"/>
...
<AUDIT_RECORD
TIMESTAMP="2017-10-16T14:25:24 UTC"
RECORD_ID="6_2017-10-16T14:25:00"
NAME="Query"
CONNECTION_ID="4"
STATUS="0"
STATUS_CODE="0"
USER="root[root] @ localhost [127.0.0.1]"
OS_LOGIN=""
HOST="localhost"
IP="127.0.0.1"
COMMAND_CLASS="drop_table"
SQLTEXT="DROP TABLE IF EXISTS t"/>
...
<AUDIT_RECORD
TIMESTAMP="2017-10-16T14:25:24 UTC"
RECORD_ID="8_2017-10-16T14:25:00"
NAME="Quit"
CONNECTION_ID="4"
STATUS="0"
STATUS_CODE="0"
USER="root"
OS_LOGIN=""
HOST="localhost"
IP="127.0.0.1"
COMMAND_CLASS="connect"
<AUDIT_RECORD
TIMESTAMP="2017-10-16T14:25:32 UTC"
RECORD_ID="12_2017-10-16T14:25:00"
NAME="NoAudit"
SERVER_ID="1"/>
</AUDIT>
审计日志文件以 XML 格式编写,使用 UTF-8(每个字符最多 4 个字节)。根元素是
<AUDIT>. 根元素包含
<AUDIT_RECORD>元素,每个元素都提供有关审计事件的信息。当审计日志插件开始写入新的日志文件时,它会写入 XML 声明和打开<AUDIT>
根元素标记。当插件关闭日志文件时,它会写入结束</AUDIT>根元素标记。文件打开时,结束标记不存在。
元素的属性<AUDIT_RECORD>具有以下特征:
有些属性出现在每个
<AUDIT_RECORD>元素中。其他是可选的,可能会出现,具体取决于审计记录类型。<AUDIT_RECORD>不保证元素 内属性的顺序 。属性值不是固定长度的。如稍后给出的属性描述中所示,长值可能会被截断。
、
<、和字符分别 编码为>、 、 和 。NUL 字节 (U+00) 被编码为字符。"&<>"&?作为 XML 字符无效的字符使用数字字符引用进行编码。有效的 XML 字符是:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
以下属性在每个
<AUDIT_RECORD>元素中都是必需的:
NAME表示生成审核事件的指令类型的字符串,例如服务器从客户端接收的命令。
例子:
NAME="Query"一些共同的
NAME价值观:Audit When auditing starts, which may be server startup time Connect When a client connects, also known as logging in Query An SQL statement (executed directly) Prepare Preparation of an SQL statement; usually followed by Execute Execute Execution of an SQL statement; usually follows Prepare Shutdown Server shutdown Quit When a client disconnects NoAudit Auditing has been turned off可能 的 值为
Audit,Binlog Dump,Change user,Close stmt,Connect Out,Connect,Create DB,Daemon,Debug,Delayed insert,Drop DB,Execute,Fetch,Field List,Init DB,Kill,Long Data,NoAudit,Ping,Prepare,Processlist,Query,Quit,Refresh,Register Slave,Reset stmt,Set option,Shutdown, 。Sleep_StatisticsTable DumpTime除了
"Audit"和 之外"NoAudit",这些值对应于头文件 中列出的命令值 。例如, 和分别对应于 和 。COM_xxxmysql_com.h"Create DB""Change user"COM_CREATE_DBCOM_CHANGE_USERRECORD_ID审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
. 当审计日志插件打开审计日志文件时,它会将序列号初始化为审计日志文件的大小,然后为记录的每条记录将序列号递增 1。时间戳是一个 UTC 值, 格式表示审计日志插件打开文件的日期和时间。SEQ_TIMESTAMPYYYY-MM-DDThh:mm:ss例子:
RECORD_ID="12_2017-10-16T14:25:00"TIMESTAMP表示 UTC 值的字符串,其 格式指示生成审计事件的日期和时间。例如,对应于执行从客户端接收到的 SQL 语句的事件具有在语句完成之后发生的值,而不是在接收到语句时发生的值。
YYYY-MM-DDThh:mm:ssUTCTIMESTAMP例子:
TIMESTAMP="2017-10-16T14:25:32 UTC"
以下属性在
<AUDIT_RECORD>元素中是可选的。其中许多只发生在具有特定属性值的元素中
NAME。
COMMAND_CLASS指示执行的操作类型的字符串。
例子:
COMMAND_CLASS="drop_table"这些值对应于 指示命令计数的状态变量;例如 and count 和 statements,分别。以下语句显示可能的名称:
Com_xxxCom_drop_tableCom_selectDROP TABLESELECTSELECT LOWER(REPLACE(VARIABLE_NAME, 'COM_', '')) AS name FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'COM%' ORDER BY name;CONNECTION_ID表示客户端连接标识符的无符号整数。
CONNECTION_ID()这与会话中函数 返回的值相同 。例子:
CONNECTION_ID="127"DB表示默认数据库名称的字符串。
例子:
DB="test"HOST表示客户端主机名的字符串。
例子:
HOST="localhost"IP表示客户端 IP 地址的字符串。
例子:
IP="127.0.0.1"MYSQL_VERSION表示 MySQL 服务器版本的字符串。
VERSION()这与函数或version系统变量 的值相同 。例子:
MYSQL_VERSION="5.6.39-log"OS_LOGIN表示身份验证过程中使用的外部用户名的字符串,由用于对客户端进行身份验证的插件设置。使用本机(内置)MySQL 身份验证,或者如果插件未设置该值,则此属性为空。
external_user该值与系统变量的值相同(请参阅第 6.2.12 节,“代理用户”)。例子:
OS_LOGIN="jeffrey"OS_VERSION表示构建或运行服务器的操作系统的字符串。
例子:
OS_VERSION="x86_64-Linux"PRIV_USER一个字符串,表示服务器将客户端验证为的用户。这是服务器用于权限检查的用户名,它可能与
USER值不同。例子:
PRIV_USER="jeffrey"PROXY_USER表示代理用户的字符串(请参阅 第 6.2.12 节,“代理用户”)。如果用户代理未生效,则该值为空。
例子:
PROXY_USER="developer"SERVER_ID表示服务器 ID 的无符号整数。
server_id这与系统变量 的值相同 。例子:
SERVER_ID="1"SQLTEXT表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,是使用 UTF-8 编写的(每个字符最多 4 个字节),因此该值可能是转换后的结果。例如,原始语句可能是作为 SJIS 字符串从客户端收到的。
例子:
SQLTEXT="DELETE FROM t1"STARTUP_OPTIONS一个字符串,表示在启动 MySQL 服务器时在命令行或选项文件中给出的选项。
例子:
STARTUP_OPTIONS="--port=3306 --log_output=FILE"STATUS表示命令状态的无符号整数:0 表示成功,非零表示发生错误。
mysql_errno()这与C API 函数的值相同 。STATUS_CODE有关它与 的区别的信息,请参阅说明STATUS。审核日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参阅 服务器错误消息参考。
不记录警告。
例子:
STATUS="1051"STATUS_CODE表示命令状态的无符号整数:0 表示成功,1 表示发生错误。
该
STATUS_CODE值与 以下值不同STATUS:STATUS_CODE0 表示成功,1 表示错误,这与 Audit Vault 的 EZ_collector 消费者兼容。STATUS是mysql_errno()C API 函数的值。这是 0 表示成功,非零表示错误,因此不一定是 1 表示错误。例子:
STATUS_CODE="0"USER代表客户端发送的用户名的字符串。这可能与
PRIV_USER值不同。VERSION表示审计日志文件格式版本的无符号整数。
例子:
VERSION="1"