本节介绍如何配置审计日志特性,例如审计日志插件写入事件的文件、写入事件的格式、是否启用日志文件压缩和加密以及空间管理。
有关影响审计日志记录的函数和系统变量的其他信息,请参阅 审计日志函数和 审计日志选项和变量。
审计日志插件还可以根据事件内容或事件发起的帐户来控制将哪些审计事件写入审计日志文件。请参阅 第 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_format
为JSON
,则设置
audit_log_file
为
audit.json
。否则,较新的日志文件将具有与旧文件不同的格式,但它们都将具有相同的基本名称,并且不会指示格式何时更改。
在 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 密码加密)。
要在运行时设置或获取加密密码,请使用这些审计日志函数:
要设置当前加密密码,请调用
audit_log_encryption_password_set()
。此函数将新密码存储在密钥环中。如果启用了加密,它还会执行重命名当前日志文件的日志文件轮换操作,并开始使用密码加密的新日志文件。文件重命名是根据基于大小的日志文件自动轮换的通常规则进行的;请参阅 手动审核日志文件轮换。以前写入的审核日志文件不会使用新密码重新加密。如果您需要手动解密这些文件,请记录以前的密码。
要获取当前的加密密码,请调用
audit_log_encryption_password_get()
,它会从密钥环中检索密码。
有关审核日志加密功能的其他信息,请参阅审核日志功能。
审计日志插件在初始化时,如果发现启用了日志文件加密,则检查keyring是否包含审计日志加密密码。如果没有,插件会自动生成一个随机的初始加密密码并将其存储在密钥环中。要发现此密码,请调用
audit_log_encryption_password_get()
.
如果同时启用压缩和加密,则压缩发生在加密之前。要手动恢复原始文件,请先解密,然后解压缩。请参阅 手动解压缩和解密审计日志文件。
可以使用标准工具解压缩和解密审计日志文件。这应该只对已关闭(存档)且不再使用的日志文件执行,而不是审计日志插件当前正在写入的日志文件。您可以识别归档日志文件,因为它们已被审计日志插件重命名为在基本名称之后的文件名中包含时间戳。
对于此讨论,假设
audit_log_file
设置为
audit.log
。在这种情况下,存档的审核日志文件具有下表中显示的名称之一。
启用的功能 | 归档文件名 |
---|---|
无压缩或加密 | audit. |
压缩 | audit. |
加密 | audit. |
压缩、加密 | audit. |
要手动解压缩压缩日志文件,请使用 gunzip、gzip -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
审核日志文件有可能变得非常大并占用大量磁盘空间。为了管理使用的空间,可以使用日志轮换。这涉及通过重命名来旋转当前日志文件,然后使用原始名称打开一个新的当前日志文件。旋转可以手动执行,或配置为自动发生。
要配置审计日志文件空间管理,请使用以下系统变量:
如果
audit_log_rotate_on_size
为 0(默认值),则禁用自动日志文件轮换:除非手动执行,否则不会发生旋转。
要旋转当前文件,手动重命名它,然后启用
audit_log_flush
关闭它并使用原始名称打开一个新的当前日志文件;请参阅 手动审核日志文件轮换。
如果
audit_log_rotate_on_size
大于 0,则启用自动审核日志文件轮换:当对当前日志文件的写入导致其大小超过该
audit_log_rotate_on_size
值时,以及在某些其他条件下,会发生自动轮转;请参阅 自动审核日志文件轮换。发生轮换时,审计日志插件会重命名当前日志文件并使用原始名称打开一个新的当前日志文件。启用自动旋转后,
audit_log_flush
没有任何效果。
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.
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:
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.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 newaudit.log
file:SET GLOBAL audit_log_flush = ON;
audit_log_flush
is special in that its value remainsOFF
so that you need not disable it explicitly before enabling it again to perform another flush.
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:
During plugin initialization, if a file with the audit log file name already exists (see Naming Conventions for Audit Log Files).
During plugin termination.
When the
audit_log_encryption_password_set()
function is called to set the encryption password.
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 asaudit.20180115T140633.log
. The timestamp is a UTC value in
format. For XML logging, the timestamp indicates rotation time. For JSON logging, the timestamp is that of the last event written to the file.YYYYMMDD
Thhmmss
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 asaudit.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 isaudit.log
, the plugin renames it to a value such asaudit.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 theFROM_UNIXTIME()
function:mysql> SELECT FROM_UNIXTIME(1515934443.7726520); +-----------------------------------+ | FROM_UNIXTIME(1515934443.7726520) | +-----------------------------------+ | 2018-01-14 06:54:03.772652 | +-----------------------------------+
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
是它会在缓冲区已满时丢弃事件。对于负载很重的服务器,审计日志可能缺少事件。