配置审计日志特性,包括审计日志插件写入事件的文件、写入事件的格式、是否启用日志文件压缩和加密、日志空间管理等。
这里描述的加密功能适用于MySQL 8.0.17版本,除了比较当前加密功能与以前更有限的功能的部分;看到MySQL 8.0.17之前的审计日志文件加密.
有关影响审计日志记录的用户定义函数和系统变量的其他信息,请参见审计日志功能,审计日志选项和变量.
审计日志插件还可以根据事件内容或事件产生的帐户来控制哪些审计事件被写入审计日志文件。看到第6.4.5.7节“审计日志过滤”.
如果要配置审计日志文件名,请设置audit_log_file
服务器启动时的系统变量。默认名称为audit.log
在服务器数据目录中。为了获得最佳的安全性,请将审计日志写入MySQL服务器和具有合法理由的用户只能访问的目录中。
插件解释audit_log_file
值,由可选的主目录名、基目录名和可选的后缀组成。如果启用了压缩或加密,有效文件名(实际用于创建日志文件的名称)与配置的文件名不同,因为它有额外的后缀:
如果启用了压缩,插件会添加后缀of
. gz
.如果启用了加密,该插件会添加一个后缀
.
,在那里pwd_id
.encpwd_id
指示用于日志文件操作的加密密码。审计日志插件将加密密码存储在密匙环中;看到加密审计日志文件.
有效的审计日志文件名是在配置的文件名中添加了适用的压缩和加密后缀后产生的名称。例如,如果配置了audit_log_file
值是audit.log
,有效文件名是下表中显示的值之一。
启用的特性 | 有效文件名 |
---|---|
没有压缩或加密 | audit.log |
压缩 | audit.log.gz |
加密 | audit.log。 |
压缩、加密 | audit.log.gz。 |
pwd_id
表示加密或解密文件的密码ID。pwd_id
格式是pwd_timestamp-seq
,地点:
pwd_timestamp
是UTC值
指示密码创建时间的格式。名称
Thhmmss
seq
是一个序列号。序号从1开始,如果密码的序号相同,则递增pwd_timestamp
价值。
这里有一些例子pwd_id
密码ID值:
20190403t142359-1 20190403t142400-1 20190403t142400-2
为了构造相应的密匙环id以在密匙环中存储密码,审计日志插件添加了一个前缀audit_log -
到pwd_id
值。对于刚刚显示的示例密码id,对应的密匙环id为:
audit_log-20190403T142359-1 audit_log-20190403T142400-1 audit_log-20190403T142400-2
当前审计日志插件用于加密的密码ID为最大的那个pwd_timestamp
价值。如果有多个密码pwd_timestamp
值,则当前密码ID为序号最大的那个。例如,在前面的密码id集合中,其中两个时间戳最大,20190403 t142400
,则当前密码ID为序列号最大的(2
).
审计日志插件在初始化和终止过程中根据有效的审计日志文件名执行某些操作:
在初始化过程中,插件检查带有审计日志文件名的文件是否已经存在,如果存在则重命名它。(在这种情况下,插件假定之前的服务器调用在审计日志插件运行时意外退出。)然后插件写入一个新的空审计日志文件。
在终止期间,插件重命名审计日志文件。
文件重命名(无论是在插件初始化或终止期间)根据基于大小的日志文件自动旋转的通常规则发生;看到手动审计日志文件旋转.
如果要配置审计日志文件的格式,需要设置audit_log_format
服务器启动时的系统变量。以下格式可供选择:
新
:新型XML格式。这是默认设置。老
:旧式XML格式。JSON
: JSON格式。
关于每种格式的详细信息,请参见第6.4.5.4节“审计日志文件格式”.
如果你改变了audit_log_format
,建议您也更改audit_log_file
.例如,如果你设置audit_log_format
来JSON
,设置audit_log_file
来audit.json
.否则,新日志文件的格式将不同于旧文件,但它们都具有相同的基名,没有任何内容表明格式何时更改。
可以为任何日志格式启用审计日志文件压缩。
设置审计日志文件压缩功能时,需要设置audit_log_compression
服务器启动时的系统变量。允许的值为没有一个
(没有压缩;默认值)和GZIP
(GNU Zip压缩)。
如果同时启用压缩和加密,则压缩先于加密。要手动恢复原始文件,首先解密它,然后解压缩它。看到手动解压缩和解密审计日志文件.
可以为任何日志格式启用审计日志文件加密。加密基于用户定义的密码(审计日志插件生成的初始密码除外)。要使用这个特性,必须启用MySQL密匙环,因为审计日志记录使用它来存储密码。任何密匙环组件或插件都可以使用;有关说明,请参见第6.4.4节“MySQL Keyring”.
如果需要配置审计日志文件加密,请设置audit_log_encryption
服务器启动时的系统变量。允许的值为没有一个
(没有加密;默认值)和AES
(AES-256-CBC密码加密)。
要在运行时设置或获取加密密码,请使用以下用户定义函数(udf):
要设置当前加密密码,请调用
audit_log_encryption_password_set ()
.此函数将新密码存储在密匙环中。如果启用了加密,它还会执行日志文件旋转操作,重命名当前日志文件,并开始使用密码加密的新日志文件。根据基于大小的日志文件自动旋转的通常规则进行文件重命名;看到手动审计日志文件旋转.如果
audit_log_password_history_keep_days
系统变量非零,调用audit_log_encryption_password_set ()
还会导致旧归档审计日志加密密码过期。有关审计日志密码历史记录的信息,包括密码存档和过期,请参见该变量的描述。要获取当前加密密码,请调用
audit_log_encryption_password_get ()
毫无争议。若要按ID获取密码,请传递一个参数,该参数指定当前密码或存档密码的密匙环ID。如果需要确定哪些审计日志密匙环id存在,请查询性能架构
keyring_keys
表:SELECT KEY_ID FROM performance_schema。keyring_keysWHERE KEY_ID LIKE 'audit_log%' ORDER BY KEY_ID; +-----------------------------+ | KEY_ID | +-----------------------------+ | audit_log-20190415T152248-1 | | audit_log-20190415T153507-1 | | audit_log-20190416T125122-1 | | audit_log-20190416T141608-1 | +-----------------------------+
有关审计日志加密udf的更多信息,请参见审计日志功能.
当审计日志插件初始化时,如果它发现日志文件加密已启用,它将检查密匙环是否包含审计日志加密密码。如果没有,插件自动生成一个随机的初始加密密码,并将其存储在密匙环中。要发现此密码,请调用audit_log_encryption_password_get ()
.
如果同时启用压缩和加密,则压缩先于加密。要手动恢复原始文件,首先解密它,然后解压缩它。看到手动解压缩和解密审计日志文件.
审计日志文件可以使用标准工具解压和解密。这应该只针对已关闭(存档)且不再使用的日志文件,而不是针对审计日志插件当前正在写入的日志文件。您可以识别归档的日志文件,因为审计日志插件已对它们进行了重命名,以便在文件名中紧跟在基本名称之后包含一个时间戳。
对于本文的讨论,假设audit_log_file
设置为audit.log
.在这种情况下,归档的审计日志文件具有下表中所示的名称之一。
启用的特性 | 存档文件名 |
---|---|
没有压缩或加密 | 审计。 |
压缩 | 审计。 |
加密 | 审计。 |
压缩、加密 | 审计。 |
如在审计日志文件命名约定,pwd_id
格式是pwd_timestamp-seq
.因此,归档加密日志文件的名称实际上包含两个时间戳。第一个表示文件旋转时间,第二个表示创建加密密码的时间。
考虑以下一组存档加密日志文件名:
audit.20190410T205827.log.20190403T185337-1。内附audit.20190410T210243.log.20190403T185337-1。内附audit.20190415T145309.log.20190414T223342-1。内附audit.20190415t151322.log.20190414t223342 - 2. - enc
每个文件名都有一个惟一的旋转时间戳。相比之下,密码时间戳不是唯一的:
前两个文件具有相同的密码ID和序列号(
20190403 t185337-1
).它们有相同的加密密码。后两个文件具有相同的密码ID (
20190414 t223342
)但序号不同(1
,2
).这些文件具有不同的加密密码。
若要手动解压缩已压缩的日志文件,请使用gunzip,gzip - d,或等效命令。例如:
Gunzip -c审计。时间戳.log.gz >审计。时间戳. log
若要手动解密加密的日志文件,请使用openssl命令。例如:
Openssl enc -d -aes-256-cbc -pass pass:密码无-md sha256 -in audit。时间戳. log。pwd_id.enc -out审计。时间戳. log
要执行该命令,您必须获取密码
,表示加密密码。要做到这一点,使用audit_log_encryption_password_get ()
.例如,审计日志文件名为audit.20190415t151322.log.20190414t223342 - 2. - enc
,密码ID为20190414 t223342-2
密匙环ID为审计日志- 20190414 t223342 - 2
.像这样检索密匙环密码:
选择audit_log_encryption_password_get(“审计日志- 20190414 - t223342 2》);
如果为审计日志同时启用了压缩和加密,则在加密之前进行压缩。在本例中,文件名为. gz
而且.
添加后缀,对应于这些操作发生的顺序。如果需要手动恢复原始文件,请反向操作。也就是说,首先解密文件,然后解压缩它:pwd_id
.enc
Openssl enc -d -aes-256-cbc -pass pass:密码无-md sha256 -in audit。时间戳.log.gz。pwd_id.enc -out审计。时间戳.log.gz gunzip -c审计。时间戳.log.gz >审计。时间戳. log
本节将介绍MySQL 8.0.17之前和MySQL 8.0.17之前审计日志文件加密功能的差异,MySQL 8.0.17是实现密码历史记录的时候(包括密码存档和过期)。它还指示了审计日志插件如何处理从8.0.17以下版本升级到MySQL 8.0.17或更高版本。
功能 | 在MySQL 8.0.17之前 | 从MySQL 8.0.17开始 |
---|---|---|
密码数量 | 只提供单一密码 | 允许使用多个密码 |
加密的日志文件名 | .enc 后缀 |
. 后缀 |
密匙环ID密码 | audit_log |
audit_log - |
密码历史 | 没有 | 是的 |
在MySQL 8.0.17之前,没有密码历史记录,因此设置新密码将使旧密码不可访问,使MySQL企业审计无法读取用旧密码加密的日志文件。如果您预期需要手动解密这些文件,则必须保留以前密码的记录。
如果从低版本升级到MySQL 8.0.17或更高版本时启用了审计日志文件加密,审计日志插件会执行以下升级操作:
在插件初始化期间,插件检查密匙环ID为的加密密码
audit_log
.如果它找到一个,插件使用密匙环ID复制密码audit_log -
格式,并将其作为当前加密密码。(有关详情pwd_id
pwd_id
语法,看审计日志文件命名约定.)现有的加密日志文件后缀为
.enc
.插件不会重命名这些后缀为.
,但只要有ID的密钥就可以读取pwd_id
.encaudit_log
留在钥匙扣里。当密码清除发生时,如果插件过期,任何密码与密匙环ID
audit_log -
格式,它也会使密匙环ID为的密码过期pwd_id
audit_log
,如果存在的话。(此时,后缀为.enc
而不是.
插件无法读取,所以假设你不再需要它们。)pwd_id
.enc
审计日志文件有可能变得相当大,并消耗大量磁盘空间。要管理使用的空间,请使用以下方法:
日志文件旋转。这涉及到通过重命名来旋转当前日志文件,然后使用原始名称打开一个新的当前日志文件。旋转可以手动执行,也可以配置为自动执行。
修剪旋转的json格式日志文件(如果启用了自动旋转)。可以根据日志文件的年龄(MySQL 8.0.24)或合并的日志文件大小(MySQL 8.0.26)执行剪枝。
使用以下系统变量配置审计日志文件空间管理:
如果
audit_log_rotate_on_size
为0(默认值),表示禁用日志文件自动旋转:除非手动执行,否则不会发生旋转。
若要旋转当前文件,请手动重命名它,然后启用
audit_log_flush
关闭它并使用原始名称打开一个新的当前日志文件;看到手动审计日志文件旋转.不会对旋转的json格式日志文件进行修剪;
audit_log_max_size
而且audit_log_prune_seconds
没有效果。
如果
audit_log_rotate_on_size
值大于0时,表示启用审计日志文件自动轮换:当对当前日志文件的写入导致其大小超过
audit_log_rotate_on_size
价值,以及在某些其他条件下;看到自动轮换审计日志文件.当发生自动轮换时,审计日志插件将重命名当前日志文件,并使用原始名称打开新的当前日志文件。如果发生旋转的json格式日志文件修剪
audit_log_max_size
或audit_log_prune_seconds
具有大于0的值。audit_log_flush
没有效果。
旋转(重命名)的日志文件不会自动删除。例如,通过基于大小的日志文件旋转,重命名的日志文件具有惟一的名称并无限累积。它们不会从名称序列的末尾旋转。避免过度使用空间:
从MySQL 8.0.24(针对json格式的日志文件):启用日志文件修剪审计日志文件修剪.
否则(对于非json文件,或在MySQL 8.0.24之前的所有日志格式):定期删除旧文件,根据需要先备份它们。如果备份的日志文件进行了加密,也要将相应的加密密码备份到安全的地方,以便以后需要对文件进行解密。
以下部分将更详细地描述日志文件的旋转和修剪。
手动审计日志文件旋转
如果audit_log_rotate_on_size
为0(默认值),则除非手动执行,否则不会发生日志旋转。在这种情况下,审计日志插件关闭并重新打开日志文件audit_log_flush
从disabled变为enabled。日志文件重命名必须在服务器外部完成。假设日志文件名为audit.log
您想要维护三个最近的日志文件,遍历名称audit.log.1
通过audit.log.3
.在Unix上,像这样手动执行旋转:
在命令行中,重命名当前日志文件:
mv audit.log。2 audit.log。3 mv audit.log。1 audit.log。2mv audit.log audit.log.1
此策略覆盖当前
audit.log.3
内容,对归档日志文件的数量和它们使用的空间设置了限制。此时,插件仍在写入当前日志文件,该文件已重命名为
audit.log.1
.连接到服务器并刷新日志文件,以便插件关闭它并重新打开一个新的audit.log
文件:SET GLOBAL audit_log_flush = ON;
audit_log_flush
它的特殊之处在于它的价值依然存在吗从
因此,在再次启用它以执行另一次刷新之前,不需要显式地禁用它。
如果启用了压缩或加密,则日志文件名包含表示启用的特性的后缀,如果启用了加密,则包含密码ID。如果文件名包含密码ID,请确保在手动重命名的任何文件的名称中保留该ID,以便可以确定用于解密操作的密码。
对于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
值时,审计日志插件将自动重命名当前日志文件,并使用原来的名称打开一个新的当前日志文件。
自动基于大小的旋转也发生在以下条件下:
在插件初始化过程中,如果带有审计日志文件名的文件已经存在(参见审计日志文件命名约定).
在插件终止期间。
当
audit_log_encryption_password_set ()
如果启用加密,则调用该函数设置加密密码。(如果禁用加密,则不会发生旋转。)
该插件通过在原始文件的基名后面插入时间戳来重命名原始文件。例如,如果文件名为audit.log
,插件将其重命名为一个值,例如audit.20210115T140633.log
.时间戳是格式中的UTC值
格式。对于XML日志记录,时间戳指示旋转时间。对于JSON日志记录,时间戳是写入文件的最后一个事件的时间戳。名称
Thhmmss
如果对日志文件进行了加密,则原始文件名已经包含一个时间戳,指示加密密码创建时间(参见审计日志文件命名约定).在本例中,旋转后的文件名包含两个时间戳。例如,一个名为audit.log.20210110t130749 - 1. - enc
重命名为诸如audit.20210115t140633.log.20210110t130749 - 1. - enc
.
审计日志文件修剪
如果启用了自动旋转日志文件,审计日志插件支持对旋转的json格式审计日志文件进行修剪。要使用此功能:
集
audit_log_format
来JSON
.(此外,也要考虑改变audit_log_file
;看到选择审计日志文件格式.)集
audit_log_rotate_on_size
大于0以指定发生自动日志文件旋转的字节大小。默认情况下,不会对自动旋转的json格式日志文件进行修剪。要启用修剪,请将以下系统变量中的一个设置为大于0的值:
集
audit_log_max_size
大于0可指定旋转日志文件的总和大小(以字节为单位),超过该值的文件将受到修剪。audit_log_max_size
MySQL 8.0.26版本可用。集
audit_log_prune_seconds
大于0以指定旋转后的日志文件将受到修剪的秒数。audit_log_prune_seconds
MySQL 8.0.24版本可用。
的非零值
audit_log_max_size
的非零值优先audit_log_prune_seconds
.如果在插件初始化时两者都大于0,则会向服务器错误日志中写入警告。如果客户端在运行时将两者都设置为大于0,则会向客户端返回一个警告。请注意对错误日志的警告被写成Notes,这是信息消息。要确保此类消息出现在错误日志中而不被丢弃,请确保错误日志记录的详细程度足以记录信息消息。例如,如果您正在使用基于优先级的日志过滤,如第5.4.2.5节“基于优先级的错误日志过滤(log_filter_internal)”,设置
log_error_verbosity
系统变量的值为3。
如果启用了json格式的日志文件,修剪的过程如下:
自动旋转时;关于发生这种情况的条件,请参见自动轮换审计日志文件.
当全局
audit_log_max_size
或audit_log_prune_seconds
系统变量在运行时设置。
对于基于组合旋转日志文件大小的修剪,如果组合大小大于指定的限制audit_log_max_size
,审计日志插件会删除最旧的文件,直到它们的总大小不超过限制。
对于基于旋转日志文件年龄的剪枝,剪枝点为当前时间减去的值audit_log_prune_seconds
.在旋转的json格式日志文件中,每个文件名的时间戳部分表示写入文件的最后一个事件的时间戳。审计日志插件使用文件名时间戳来确定哪些文件只包含比修剪点更早的事件,并删除它们。
审计日志插件可以使用几种日志写入策略中的任何一种。无论采用何种策略,日志记录都是在尽最大努力的基础上进行的,不能保证一致性。
要指定写策略,请设置audit_log_strategy
服务器启动时的系统变量。缺省情况下,策略值为异步
插件将异步记录到缓冲区,等待缓冲区是否已满。可以告诉插件不要等待(性能
)或使用文件系统缓存(SEMISYNCHRONOUS
)或强制输出同步()
每次写请求后调用(同步
).
对于异步写策略,则audit_log_buffer_size
系统变量是以字节为单位的缓冲区大小。在服务器启动时设置此变量以更改缓冲区大小。该插件使用一个缓冲区,它在初始化时分配缓冲区,在终止时删除缓冲区。插件不为非异步写策略分配这个缓冲区。
异步日志策略具有以下特点:
对服务器性能和可伸缩性的影响最小。
在尽可能短的时间内阻塞产生审计事件的线程;也就是说,分配缓冲区的时间加上将事件复制到缓冲区的时间。
输出进入缓冲区。一个单独的线程处理从缓冲区到日志文件的写入。
使用异步日志记录,如果在写入文件期间发生问题,或者插件没有完全关闭(例如,在服务器主机意外退出的情况下),日志文件的完整性可能会受到损害。要降低这种风险,请设置audit_log_strategy
使用同步日志记录。
的缺点性能
策略是在缓冲区满时丢弃事件。对于负载严重的服务器,审计日志可能缺少事件。