6.4.5.5 配置审核日志记录 Feature

本节介绍如何配置审核日志记录 Feature,例如审核日志插件向其写入事件的文件,写入事件的格式以及是否启用日志文件压缩和加密。

有关影响审核日志记录的用户定义函数和系统变量的其他信息,请参见审核日志功能审核日志选项和变量

审核日志插件还可以基于事件内容或事件源自的帐户,控制将哪些审核事件写入审核日志文件。参见第 6.4.5.7 节“审核日志过滤”

审核日志文件的命名约定

要配置审核日志文件名,请在服务器启动时设置audit_log_file系统变量。服务器数据目录中的默认名称为audit.log。为了获得最佳安全性,请将审核日志写入只有 MySQL 服务器和有正当理由查看日志的用户才能访问的目录。

从 MySQL 5.7.21 开始,该插件将audit_log_file值解释为由可选的前导目录名称,基本名称和可选的后缀组成。如果启用了压缩或加密,则有效文件名(实际上用于创建日志文件的名称)与配置的文件名不同,因为它具有其他后缀:

  • 如果启用了压缩,则插件会添加后缀.gz

  • 如果启用了加密,则插件会添加后缀.enc。审核日志插件将加密密码存储在密钥环中(请参阅加密审核日志文件

有效的审核日志文件名是将适用的压缩和加密后缀添加到配置的文件名后得到的名称。例如,如果配置的audit_log_file值为audit.log,则有效文件名是下 table 中显示的值之一。

Enabled Features有效文件名
没有压缩或加密audit.log
Compressionaudit.log.gz
Encryptionaudit.log.enc
Compression, encryptionaudit.log.gz.enc

在 MySQL 5.7.21 之前,已配置和有效的日志文件名相同。例如,如果配置的audit_log_file值为audit.log,则审核日志插件将写入audit.log

审核日志插件根据有效的审核日志文件名在初始化和终止期间执行某些操作:

从 MySQL 5.7.21 开始:

  • 在初始化期间,插件检查具有审核日志文件名的文件是否已存在,如果存在,则将其重命名。 (在这种情况下,该插件假定审计日志插件正在运行时,先前的服务器调用意外退出.)然后,该插件写入一个新的空审计日志文件。

  • 在终止期间,插件将重命名审核日志文件。

  • 文件重命名(无论是在插件初始化还是终止期间)都是根据自动日志文件轮换的通常规则进行的;参见自动审核日志文件轮换

在 MySQL 5.7.21 之前,仅 XML 日志格式可用,并且插件执行基本的完整性检查:

  • 在初始化期间,插件会在写入任何<AUDIT_RECORD>元素之前检查文件是否以</AUDIT>标签结尾并截断该标签。如果日志文件存在但不以</AUDIT>结尾,或者</AUDIT>标记不能被截断,则插件会认为该文件格式错误并重命名。 (如果服务器在运行审计日志插件的情况下意外退出,则会发生这种重命名.)然后,该插件将写入新的空审计日志文件。

  • 终止时,不会发生文件重命名。

  • 在插件初始化时发生重命名时,重命名的文件的末尾添加了.corrupted,时间戳和.xml。例如,如果文件名是audit.log,则插件会将其重命名为audit.log.corrupted.15081807937726520.xml之类的值。时间戳值类似于 Unix 时间戳,最后 7 位数字代 table 小数秒部分。有关解释时间戳的信息,请参见审计日志文件的空间 Management 和名称轮换

选择审核日志文件格式

要配置审核日志文件格式,请在服务器启动时设置audit_log_format系统变量。默认情况下,格式为NEW(新样式的 XML 格式)。有关每种格式的详细信息,请参见第 6.4.5.4 节“审核日志文件格式”

如果您更改audit_log_format,建议您也更改audit_log_file。否则,将存在两组具有相同基本名称但格式不同的日志文件。

Note

在 MySQL 5.7.21 之前,更改audit_log_format的值可能会导致将一种格式的日志条目写入包含不同格式的条目的现有日志文件。为避免此问题,请使用以下过程:

  • 停止服务器。

  • 更改audit_log_file系统变量的值,以便插件写入其他文件,或者手动重命名当前审核日志文件。

  • 使用新值audit_log_format重新启动服务器。审核日志插件将创建一个新的日志文件,并以所选格式将条目写入其中。

压缩审核日志文件

从 MySQL 5.7.21 开始,审计日志文件压缩可用。可以为任何日志格式启用压缩。

要配置审核日志文件压缩,请在服务器启动时设置audit_log_compression系统变量。允许的值为NONE(不压缩;默认值)和GZIP(GNU Zip 压缩)。

如果同时启用了压缩和加密,则压缩将在加密之前进行。要手动恢复原始文件,请先对其解密,然后再将其解压缩。参见手动解压缩和解密审核日志文件

加密审核日志文件

从 MySQL 5.7.21 开始,审计日志文件加密可用。可以为任何日志格式启用加密。加密基于用户定义的密码(审核日志插件生成的初始密码除外)。要使用此功能,必须启用 MySQL 密钥环,因为审核日志记录将其用于密码存储。任何钥匙圈插件都可以使用;有关说明,请参见第 6.4.4 节“ MySQL 密钥环”

要配置审核日志文件加密,请在服务器启动时设置audit_log_encryption系统变量。允许的值为NONE(不加密;默认值)和AES(AES-256-CBC 密码加密)。

要在运行时设置或获取加密密码,请使用以下用户定义的函数(UDF):

  • 要设置当前的加密密码,请调用audit_log_encryption_password_set()。此功能将新密码存储在密钥环中。如果启用了加密,它还将执行日志文件轮换操作,重命名当前日志文件,并开始使用密码加密的新日志文件。文件重命名是根据自动循环日志文件的通常规则进行的;参见自动审核日志文件轮换

先前编写的审核日志文件不会使用新密码重新加密。如果您需要手动解密这些文件,请记录以前的密码。

有关审核日志加密 UDF 的其他信息,请参阅审核日志功能

审核日志插件初始化时,如果发现启用了日志文件加密,则会检查密钥环是否包含审核日志加密密码。如果不是,该插件会自动生成一个随机的初始加密密码,并将其存储在密钥环中。要发现此密码,请调用audit_log_encryption_password_get()

如果同时启用了压缩和加密,则压缩将在加密之前进行。要手动恢复原始文件,请先对其解密,然后再将其解压缩。参见手动解压缩和解密审核日志文件

手动解压缩和解密审核日志文件

审计日志文件可以使用标准工具解压缩和解密。仅应对已关闭(存档)且不再使用的日志文件进行此操作,而不应对审计日志插件当前正在写入的日志文件进行此操作。您可以识别已存档的日志文件,因为审核日志插件已将其重命名为在基本名称之后的文件名中包含时间戳。

对于此讨论,假定audit_log_file设置为audit.log。在这种情况下,已存档的审核日志文件具有下 table 中显示的名称之一。

Enabled Features存档文件名
没有压缩或加密audit.timestamp.log
Compressionaudit.timestamp.log.gz
Encryptionaudit.timestamp.log.enc
Compression, encryptionaudit.timestamp.log.gz.enc

要手动解压缩压缩的日志文件,请使用 gunzipgzip -d 或等效命令。例如:

gunzip -c audit.timestamp.log.gz > audit.timestamp.log

要手动解密加密的日志文件,请使用 openssl 命令。例如:

openssl enc -d -aes-256-cbc -pass pass:password -md sha256
    -in audit.timestamp.log.enc
    -out audit.timestamp.log

如果同时为审计日志记录启用了压缩和加密,则压缩将在加密之前进行。在这种情况下,文件名添加了.gz.enc后缀,与这些操作的发生 Sequences 相对应。要手动恢复原始文件,请反向执行操作。也就是说,首先解密文件,然后将其解压缩:

openssl enc -d -aes-256-cbc -pass pass:password -md sha256
    -in audit.timestamp.log.gz.enc
    -out audit.timestamp.log.gz
gunzip -c audit.timestamp.log.gz > audit.timestamp.log
审核日志文件的空间 Management 和名称轮换

审核日志文件可能会变得很大,并占用大量磁盘空间。为了能够 Management 其日志文件使用的空间,审核日志插件提供了手动或自动旋转日志文件的功能。轮换功能使用audit_log_flushaudit_log_rotate_on_size系统变量:

  • 默认情况下,除非手动执行,否则audit_log_rotate_on_size=0并且不会发生日志轮换。在这种情况下,请在手动重命名后使用audit_log_flush关闭并重新打开当前日志文件。

  • 如果audit_log_rotate_on_size大于 0,则对当前日志文件的写入导致其大小超过此值时,将自动旋转。审核日志插件将关闭文件,将其重命名,然后打开一个新的日志文件。启用自动旋转后,audit_log_flush无效。

  • 自动旋转还会在其他几种情况下发生,这将在后面介绍。

Note

重命名的日志文件不会自动删除。例如,在基于大小的日志文件轮换中,重命名的日志文件不会在名称序列的末尾轮换。相反,它们具有唯一的名称并且会无限期地累积。为避免过多使用空间,请定期删除旧文件,并在必要时首先对其进行备份。

以下讨论更详细地描述了日志文件轮换方法。

手动审核日志文件轮换

如果为audit_log_rotate_on_size=0(默认值),则除非手动执行,否则不会发生日志轮换。在这种情况下,当audit_log_flush值从“禁用”更改为“启用”时,审核日志插件将关闭并重新打开日志文件。日志文件重命名必须在服务器外部进行。假设日志文件名是audit.log,并且您要维护三个最新的日志文件,并通过名称audit.log.1audit.log.3循环。在 Unix 上,手动执行旋转,如下所示:

  • 在命令行中,重命名当前日志文件:
mv audit.log.2 audit.log.3
mv audit.log.1 audit.log.2
mv audit.log audit.log.1

此策略将覆盖当前的audit.log.3内容,对已归档日志文件的数量及其使用的空间进行限制。

  • 此时,该插件仍在写入当前日志文件,该日志文件已重命名为audit.log.1。连接到服务器并刷新日志文件,以便插件将其关闭并重新打开一个新的audit.log文件:
SET GLOBAL audit_log_flush = ON;

audit_log_flush的特殊之处在于它的值仍为OFF,因此您无需在再次启用它执行另一次刷新之前明确禁用它。

Note

对于 JSON 格式的日志记录,手动重命名审核日志文件使它们无法用于日志读取功能,因为审核日志插件不再可以确定它们是日志文件序列的一部分(请参见第 6.4.5.6 节“读取审核日志文件”)。考虑将audit_log_rotate_on_size设置为大于 0 以使用基于尺寸的旋转。

自动审核日志文件轮换

如果audit_log_rotate_on_size大于 0,则设置audit_log_flush无效。相反,每当对当前日志文件进行写操作导致其大小超过audit_log_rotate_on_size值时,审核日志插件就会关闭该文件,对其重命名并打开一个新的日志文件。

在以下情况下也会发生自动旋转:

插件将重命名原始文件,如下所示:

  • 从 MySQL 5.7.21 开始,重命名的文件在其基本名称之后和后缀之前插入了一个时间戳。例如,如果文件名是audit.log,则插件会将其重命名为诸如audit.20180115T140633.log的值。时间戳是YYYYMMDDThhmmss格式的 UTC 值。时间戳指示 XML 日志记录的轮转时间,以及上一次写入 JSON 日志文件的事件的时间戳。

  • 在 MySQL 5.7.21 之前,重命名的文件带有时间戳,并在末尾添加了.xml。例如,如果文件名是audit.log,则插件会将其重命名为audit.log.15159344437726520.xml之类的值。时间戳值类似于 Unix 时间戳,最后 7 位数字代 table 小数秒部分。通过插入小数点,可以使用FROM_UNIXTIME()函数解释该值:

mysql> SELECT FROM_UNIXTIME(1515934443.7726520);
+-----------------------------------+
| FROM_UNIXTIME(1515934443.7726520) |
+-----------------------------------+
| 2018-01-14 06:54:03.772652        |
+-----------------------------------+
编写审计日志的策略

审核日志插件可以使用多种策略中的任何一种来进行日志写入。无论采用何种策略,日志记录都是在尽力而为的基础上进行的,并且不能保证一致性。

要指定写策略,请在服务器启动时设置audit_log_strategy系统变量。默认情况下,策略值为ASYNCHRONOUS,并且插件异步记录到缓冲区,await 缓冲区是否已满。可以告诉插件不要 await(PERFORMANCE)或同步登录,可以使用文件系统缓存(SEMISYNCHRONOUS),也可以在每个写入请求(SYNCHRONOUS)之后通过sync()调用强制输出。

对于异步写入策略,audit_log_buffer_size系统变量是缓冲区大小(以字节为单位)。在服务器启动时设置此变量以更改缓冲区大小。插件使用单个缓冲区,它在初始化时分配,并在终止时删除。插件不会为非异步写策略分配此缓冲区。

异步日志记录策略具有以下 Feature:

  • 对服务器性能和可伸缩性的影响最小。

  • 阻塞可在最短时间内生成审核事件的线程;也就是说,分配缓冲区的时间加上将事件复制到缓冲区的时间。

  • 输出进入缓冲区。一个单独的线程处理从缓冲区到日志文件的写入。

使用异步日志记录,如果在写入文件期间发生问题,或者插件无法完全关闭(例如,在服务器主机意外退出的情况下),则可能会损害日志文件的完整性。为了降低这种风险,请将audit_log_strategy设置为使用同步日志记录。

PERFORMANCE策略的缺点是,缓冲区已满时会丢弃事件。对于负载较重的服务器,审核日志可能缺少事件。