Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.4 安全组件和插件  / 6.4.5 MySQL企业审计  /  6.4.5.5 配置审计日志特征

6.4.5.5 配置审计日志特征

本节介绍如何配置审计日志特性,例如审计日志插件写入事件的文件、写入事件的格式、是否启用日志文件压缩和加密以及空间管理。

有关影响审计日志记录的函数和系统变量的其他信息,请参阅 审计日志函数审计日志选项和变量

审计日志插件还可以根据事件内容或事件发起的帐户来控制将哪些审计事件写入审计日志文件。请参阅 第 6.4.5.7 节,“审计日志过滤”

审计日志文件的命名约定

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

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

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

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

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

启用的功能 有效文件名
无压缩或加密 audit.log
压缩 audit.log.gz
加密 audit.log.enc
压缩、加密 audit.log.gz.enc

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

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

从 MySQL 5.7.21 开始:

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

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

  • 文件重命名(无论是在插件初始化还是终止期间)根据自动基于大小的日志文件轮换的通常规则发生;请参阅 手动审核日志文件轮换

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

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

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

  • 当重命名发生在插件初始化时,重命名的文件有.corrupted, 时间戳,并 .xml添加到末尾。例如,如果文件名为audit.log,插件会将其重命名为诸如 audit.log.corrupted.15081807937726520.xml. 时间戳值类似于 Unix 时间戳,后 7 位表示小数秒部分。有关解释时间戳的信息,请参阅 审计日志文件的空间管理

选择审核日志文件格式

要配置审计日志文件格式,请 audit_log_format在服务器启动时设置系统变量。这些格式可用:

  • NEW: 新型 XML 格式。这是默认值。

  • OLD: 旧式 XML 格式。

  • JSON: JSON 格式。

有关每种格式的详细信息,请参阅 第 6.4.5.4 节,“审计日志文件格式”

如果你改变 audit_log_format了,建议你也改变 audit_log_file。例如,如果您设置audit_log_formatJSON,则设置 audit_log_fileaudit.json。否则,较新的日志文件将具有与旧文件不同的格式,但它们都将具有相同的基本名称,并且不会指示格式何时更改。

笔记

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

  1. 停止服务器。

  2. 要么更改 audit_log_file系统变量的值,以便插件写入不同的文件,要么手动重命名当前的审计日志文件。

  3. 使用新值重新启动服务器 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 密码加密)。

要在运行时设置或获取加密密码,请使用这些审计日志函数:

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

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

  • 要获取当前的加密密码,请调用 audit_log_encryption_password_get(),它会从密钥环中检索密码。

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

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

如果同时启用压缩和加密,则压缩发生在加密之前。要手动恢复原始文件,请先解密,然后解压缩。请参阅 手动解压缩和解密审计日志文件

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

可以使用标准工具解压缩和解密审计日志文件。这应该只对已关闭(存档)且不再使用的日志文件执行,而不是审计日志插件当前正在写入的日志文件。您可以识别归档日志文件,因为它们已被审计日志插件重命名为在基本名称之后的文件名中包含时间戳。

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

启用的功能 归档文件名
无压缩或加密 audit.timestamp.log
压缩 audit.timestamp.log.gz
加密 audit.timestamp.log.enc
压缩、加密 audit.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后缀,对应于这些操作发生的顺序。要手动恢复原始文件,请执行相反的操作。即先解密文件,再解压:

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
审计日志文件的空间管理

审核日志文件有可能变得非常大并占用大量磁盘空间。为了管理使用的空间,可以使用日志轮换。这涉及通过重命名来旋转当前日志文件,然后使用原始名称打开一个新的当前日志文件。旋转可以手动执行,或配置为自动发生。

要配置审计日志文件空间管理,请使用以下系统变量:

笔记

For JSON-format log files, rotation also occurs when the value of the audit_log_format_unix_timestamp system variable is changed at runtime. However, this does not occur for space-management purposes, but rather so that, for a given JSON-format log file, all records in the file either do or do not include the time field.

Note

Rotated (renamed) log files are not removed automatically. For example, with size-based log file rotation, renamed log files have unique names and accumulate indefinitely. They do not rotate off the end of the name sequence. To avoid excessive use of space, remove old files periodically, backing them up first as necessary.

The following sections describe log file rotation in greater detail.

Manual Audit Log File Rotation

If audit_log_rotate_on_size is 0 (the default), no log rotation occurs unless performed manually. In this case, the audit log plugin closes and reopens the log file when the audit_log_flush value changes from disabled to enabled. Log file renaming must be done externally to the server. Suppose that the log file name is audit.log and you want to maintain the three most recent log files, cycling through the names audit.log.1 through audit.log.3. On Unix, perform rotation manually like this:

  1. From the command line, rename the current log files:

    mv audit.log.2 audit.log.3
    mv audit.log.1 audit.log.2
    mv audit.log audit.log.1

    This strategy overwrites the current audit.log.3 contents, placing a bound on the number of archived log files and the space they use.

  2. At this point, the plugin is still writing to the current log file, which has been renamed to audit.log.1. Connect to the server and flush the log file so the plugin closes it and reopens a new audit.log file:

    SET GLOBAL audit_log_flush = ON;

    audit_log_flush is special in that its value remains OFF so that you need not disable it explicitly before enabling it again to perform another flush.

Note

For JSON-format logging, renaming audit log files manually makes them unavailable to the log-reading functions because the audit log plugin can no longer determine that they are part of the log file sequence (see Section 6.4.5.6, “Reading Audit Log Files”). Consider setting audit_log_rotate_on_size greater than 0 to use size-based rotation instead.

Automatic Audit Log File Rotation

If audit_log_rotate_on_size is greater than 0, setting audit_log_flush has no effect. Instead, whenever a write to the current log file causes its size to exceed the audit_log_rotate_on_size value, the audit log plugin automatically renames the current log file and opens a new current log file using the original name.

Automatic size-based rotation also occurs under these conditions:

The plugin renames the original file as follows:

  • As of MySQL 5.7.21, the renamed file has a timestamp inserted after its base name and before its suffix. For example, if the file name is audit.log, the plugin renames it to a value such as audit.20180115T140633.log. The timestamp is a UTC value in YYYYMMDDThhmmss format. For XML logging, the timestamp indicates rotation time. For JSON logging, the timestamp is that of the last event written to the file.

    If log files are encrypted, the original file name already contains a timestamp indicating the encryption password creation time (see Naming Conventions for Audit Log Files). In this case, the file name after rotation contains two timestamps. For example, an encrypted log file named audit.log.20180110T130749-1.enc is renamed to a value such as audit.20180115T140633.log.20180110T130749-1.enc.

  • Prior to MySQL 5.7.21, the renamed file has a timestamp and .xml added to the end. For example, if the file name is audit.log, the plugin renames it to a value such as audit.log.15159344437726520.xml. The timestamp value is similar to a Unix timestamp, with the last 7 digits representing the fractional second part. By inserting a decimal point, the value can be interpreted using the FROM_UNIXTIME() function:

    mysql> SELECT FROM_UNIXTIME(1515934443.7726520);
    +-----------------------------------+
    | FROM_UNIXTIME(1515934443.7726520) |
    +-----------------------------------+
    | 2018-01-14 06:54:03.772652        |
    +-----------------------------------+
Write Strategies for Audit Logging

The audit log plugin can use any of several strategies for log writes. Regardless of strategy, logging occurs on a best-effort basis, with no guarantee of consistency.

To specify a write strategy, set the audit_log_strategy system variable at server startup. By default, the strategy value is ASYNCHRONOUS and the plugin logs asynchronously to a buffer, waiting if the buffer is full. It's possible to tell the plugin not to wait (PERFORMANCE) or to log synchronously, either using file system caching (SEMISYNCHRONOUS) or forcing output with a sync() call after each write request (SYNCHRONOUS).

For asynchronous write strategy, the audit_log_buffer_size system variable is the buffer size in bytes. Set this variable at server startup to change the buffer size. The plugin uses a single buffer, which it allocates when it initializes and removes when it terminates. The plugin does not allocate this buffer for nonasynchronous write strategies.

Asynchronous logging strategy has these characteristics:

  • Minimal impact on server performance and scalability.

  • Blocking of threads that generate audit events for the shortest possible time; that is, time to allocate the buffer plus time to copy the event to the buffer.

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

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

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