MySQL8 中文参考(三十)
原文:
dev.mysql.com/doc/refman/8.0/en/keyring-functions-general-purpose.html
8.4.4.15 通用密钥环密钥管理函数
MySQL 服务器支持一个密钥环服务,使内部组件和插件能够安全地存储敏感信息以供以后检索。
MySQL 服务器还包括一个用于密钥环密钥管理的 SQL 接口,实现为一组访问内部密钥环服务提供的功能的通用函数。密钥环函数包含在一个插件库文件中,该文件还包含一个必须在函数调用之前启用的keyring_udf插件。要使用这些函数,必须启用诸如keyring_file或keyring_okv之类的密钥环插件。
这里描述的函数是通用的,旨在与任何密钥环插件一起使用。特定的密钥环插件可能具有专为仅与该插件一起使用的自己的函数;请参见第 8.4.4.16 节,“特定插件的密钥环密钥管理函数”。
下面的章节提供了关于密钥环函数的安装说明,并演示如何使用它们。有关这些函数调用的密钥环服务函数的信息,请参见第 7.6.9.2 节,“密钥环服务”。有关一般密钥环信息,请参见第 8.4.4 节,“MySQL 密钥环”。
-
安装或卸载通用密钥环函数
-
使用通用密钥环函数
-
通用密钥环函数参考
安装或卸载通用密钥环函数
本节描述了如何安装或卸载密钥环函数,这些函数实现在一个插件库文件中,该文件还包含一个keyring_udf插件。有关安装或卸载插件和可加载函数的一般信息,请参见第 7.6.1 节,“安装和卸载插件”,以及第 7.7.1 节,“安装和卸载可加载函数”。
密钥环函数使密钥环密钥管理操作成为可能,但必须安装keyring_udf插件,因为没有它,这些函数无法正常工作。尝试在没有keyring_udf插件的情况下使用这些函数会导致错误。
要使服务器可用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir系统变量命名的目录)。如有必要,在服务器启动时通过设置plugin_dir的值来配置插件目录位置。
插件库文件基本名称为keyring_udf。文件名后缀因平台而异(例如,对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll)。
要安装keyring_udf插件和钥匙环函数,请使用INSTALL PLUGIN和CREATE FUNCTION语句,根据需要调整.so后缀以适应您的平台:
INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_generate RETURNS INTEGER
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_fetch RETURNS STRING
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_store RETURNS INTEGER
SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_remove RETURNS INTEGER
SONAME 'keyring_udf.so';
如果插件和函数在源复制服务器上使用,则还必须在所有副本上安装它们,以避免复制问题。
一旦按照上述方式安装,插件和函数将保持安装状态直到卸载。要删除它们,请使用UNINSTALL PLUGIN和DROP FUNCTION语句:
UNINSTALL PLUGIN keyring_udf;
DROP FUNCTION keyring_key_generate;
DROP FUNCTION keyring_key_fetch;
DROP FUNCTION keyring_key_length_fetch;
DROP FUNCTION keyring_key_type_fetch;
DROP FUNCTION keyring_key_store;
DROP FUNCTION keyring_key_remove;
使用通用钥匙环函数
在使用钥匙环通用函数之前,请根据安装或卸载通用钥匙环函数中提供的说明安装它们。
钥匙环函数受以下约束:
-
要使用任何钥匙环函数,必须启用
keyring_udf插件。否则,会出现错误:ERROR 1123 (HY000): Can't initialize function 'keyring_key_generate'; This function requires keyring_udf plugin which is not installed. Please install要安装
keyring_udf插件,请参阅安装或卸载通用钥匙环函数。 -
钥匙环函数调用钥匙环服务函数(参见第 7.6.9.2 节,“钥匙环服务”)。服务函数反过来使用安装的任何钥匙环插件(例如,
keyring_file或keyring_okv)。因此,要使用任何钥匙环函数,必须启用某个基础钥匙环插件。否则,会出现错误:ERROR 3188 (HY000): Function 'keyring_key_generate' failed because underlying keyring service returned an error. Please check if a keyring plugin is installed and that provided arguments are valid for the keyring you are using.要安装钥匙环插件,请参阅第 8.4.4.3 节,“钥匙环插件安装”。
-
用户必须拥有全局
EXECUTE权限才能使用任何钥匙环函数。否则,会出现错误:ERROR 1123 (HY000): Can't initialize function 'keyring_key_generate'; The user is not privileged to execute this function. User needs to have EXECUTE要向用户授予全局
EXECUTE权限,请使用此语句:GRANT EXECUTE ON *.* TO *user*;或者,如果您希望避免授予全局
EXECUTE权限,同时仍允许用户访问特定的密钥管理操作,可以定义“包装器”存储程序(这是本节稍后描述的一种技术)。 -
由给定用户在密钥环中存储的密钥后续只能由同一用户操作。也就是说,在密钥操作时
CURRENT_USER()函数的值必须与密钥存储在密钥环中时的值相同。(此约束排除了使用密钥环函数来操作实例范围密钥的情况,例如InnoDB创建的用于支持表空间加密的密钥。)为了使多个用户能够对同一密钥执行操作,可以定义“包装器”存储程序(这是本节稍后描述的一种技术)。
-
密钥环函数支持底层密钥环插件支持的密钥类型和长度。有关特定于特定密钥环插件的密钥的信息,请参见第 8.4.4.13 节,“支持的密钥环密钥类型和长度”。
要创建一个新的随机密钥并将其存储在密钥环中,请调用keyring_key_generate(),传递给它一个密钥的 ID,以及密钥类型(加密方法)和以字节为单位的长度。以下调用创建一个名为MyKey的 2,048 位 DSA 加密密钥:
mysql> SELECT keyring_key_generate('MyKey', 'DSA', 256);
+-------------------------------------------+
| keyring_key_generate('MyKey', 'DSA', 256) |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
返回值为 1 表示成功。如果无法创建密钥,则返回值为NULL并出现错误。可能的原因之一是底层密钥环插件不支持指定的密钥类型和密钥长度的组合;请参见第 8.4.4.13 节,“支持的密钥环密钥类型和长度”。
为了能够检查返回类型,无论是否发生错误,请使用SELECT ... INTO @*var_name*并测试变量值:
mysql> SELECT keyring_key_generate('', '', -1) INTO @x;
ERROR 3188 (HY000): Function 'keyring_key_generate' failed because
underlying keyring service returned an error. Please check if a
keyring plugin is installed and that provided arguments are valid
for the keyring you are using.
mysql> SELECT @x;
+------+
| @x |
+------+
| NULL |
+------+
mysql> SELECT keyring_key_generate('x', 'AES', 16) INTO @x;
mysql> SELECT @x;
+------+
| @x |
+------+
| 1 |
+------+
这种技术也适用于其他密钥环函数,对于失败返回一个值和一个错误。
传递给keyring_key_generate()的 ID 提供了在后续函数调用中引用密钥的方法。例如,使用密钥 ID 将其类型作为字符串或其长度作为整数检索:
mysql> SELECT keyring_key_type_fetch('MyKey');
+---------------------------------+
| keyring_key_type_fetch('MyKey') |
+---------------------------------+
| DSA |
+---------------------------------+
mysql> SELECT keyring_key_length_fetch('MyKey');
+-----------------------------------+
| keyring_key_length_fetch('MyKey') |
+-----------------------------------+
| 256 |
+-----------------------------------+
要检索密钥值,请将密钥 ID 传递给keyring_key_fetch()。以下示例使用HEX()显示密钥值,因为它可能包含不可打印的字符。示例还使用了一个简短的密钥以简洁起见,但请注意,更长的密钥提供更好的安全性:
mysql> SELECT keyring_key_generate('MyShortKey', 'DSA', 8);
+----------------------------------------------+
| keyring_key_generate('MyShortKey', 'DSA', 8) |
+----------------------------------------------+
| 1 |
+----------------------------------------------+
mysql> SELECT HEX(keyring_key_fetch('MyShortKey'));
+--------------------------------------+
| HEX(keyring_key_fetch('MyShortKey')) |
+--------------------------------------+
| 1DB3B0FC3328A24C |
+--------------------------------------+
钥匙环函数将密钥 ID、类型和值视为二进制字符串,因此比较区分大小写。例如,MyKey和mykey的 ID 指的是不同的密钥。
要移除一个密钥,请将密钥 ID 传递给keyring_key_remove():
mysql> SELECT keyring_key_remove('MyKey');
+-----------------------------+
| keyring_key_remove('MyKey') |
+-----------------------------+
| 1 |
+-----------------------------+
要混淆和存储您提供的密钥,请将密钥 ID、类型和值传递给keyring_key_store():
mysql> SELECT keyring_key_store('AES_key', 'AES', 'Secret string');
+------------------------------------------------------+
| keyring_key_store('AES_key', 'AES', 'Secret string') |
+------------------------------------------------------+
| 1 |
+------------------------------------------------------+
如前所述,用户必须具有全局EXECUTE权限才能调用钥匙环函数,并且最初将密钥存储在钥匙环中的用户必须是稍后执行密钥操作的同一用户,这是根据每个函数调用中生效的CURRENT_USER()值确定的。为了允许没有全局EXECUTE权限或可能不是密钥“所有者”的用户执行密钥操作,请使用以下技术:
-
定义“包装”存储程序,封装所需的密钥操作,并且
DEFINER值等于密钥所有者。 -
为应该能够调用特定存储程序的个别用户授予
EXECUTE权限。 -
如果包装存储程序实现的操作不包括密钥创建,请提前创建任何必要的密钥,使用存储程序定义中命名为
DEFINER的账户。
该技术使密钥可以在用户之间共享,并为 DBA 提供了更精细的控制权,以确定谁可以对密钥执行什么操作,而无需授予全局权限。
以下示例显示如何设置一个名为SharedKey的共享密钥,由 DBA 拥有,并且提供对当前密钥值的访问的get_shared_key()存储函数。该值可以被具有EXECUTE权限的任何用户检索,该权限是在key_schema模式中创建的。
从 MySQL 管理账户(在此示例中为'root'@'localhost')中,创建管理模式和用于访问密钥的存储函数:
mysql> CREATE SCHEMA key_schema;
mysql> CREATE DEFINER = 'root'@'localhost'
FUNCTION key_schema.get_shared_key()
RETURNS BLOB READS SQL DATA
RETURN keyring_key_fetch('SharedKey');
从管理账户中,确保共享密钥存在:
mysql> SELECT keyring_key_generate('SharedKey', 'DSA', 8);
+---------------------------------------------+
| keyring_key_generate('SharedKey', 'DSA', 8) |
+---------------------------------------------+
| 1 |
+---------------------------------------------+
从管理账户中,创建一个普通用户账户,以便授予密钥访问权限:
mysql> CREATE USER 'key_user'@'localhost'
IDENTIFIED BY 'key_user_pwd';
从key_user账户中,验证,如果没有适当的EXECUTE权限,新账户无法访问共享密钥:
mysql> SELECT HEX(key_schema.get_shared_key());
ERROR 1370 (42000): execute command denied to user 'key_user'@'localhost'
for routine 'key_schema.get_shared_key'
从管理账户中,为存储函数授予EXECUTE给key_user:
mysql> GRANT EXECUTE ON FUNCTION key_schema.get_shared_key
TO 'key_user'@'localhost';
从key_user账户中,验证该密钥现在是可访问的:
mysql> SELECT HEX(key_schema.get_shared_key());
+----------------------------------+
| HEX(key_schema.get_shared_key()) |
+----------------------------------+
| 9BAFB9E75CEEB013 |
+----------------------------------+
通用用途钥匙环函数参考
对于每个通用密钥环函数,本节描述了其目的、调用顺序和返回值。有关可以调用这些函数的条件的信息,请参见使用通用密钥环函数。
-
keyring_key_fetch(*key_id*)给定密钥 ID,解密并返回密钥值。
参数:
key_id: 一个指定密钥 ID 的字符串。
返回值:
返回成功的字符串密钥值,如果密钥不存在则返回
NULL,或者返回NULL和错误。注意
使用
keyring_key_fetch()检索的密钥值受第 8.4.4.13 节,“支持的密钥类型和长度”中描述的一般密钥函数限制的约束。超过该长度的密钥值可以使用密钥环服务函数存储(参见第 7.6.9.2 节,“密钥环服务”),但如果使用keyring_key_fetch()检索,则会被截断为一般密钥环函数限制的长度。示例:
mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 16); +--------------------------------------------+ | keyring_key_generate('RSA_key', 'RSA', 16) | +--------------------------------------------+ | 1 | +--------------------------------------------+ mysql> SELECT HEX(keyring_key_fetch('RSA_key')); +-----------------------------------+ | HEX(keyring_key_fetch('RSA_key')) | +-----------------------------------+ | 91C2253B696064D3556984B6630F891A | +-----------------------------------+ mysql> SELECT keyring_key_type_fetch('RSA_key'); +-----------------------------------+ | keyring_key_type_fetch('RSA_key') | +-----------------------------------+ | RSA | +-----------------------------------+ mysql> SELECT keyring_key_length_fetch('RSA_key'); +-------------------------------------+ | keyring_key_length_fetch('RSA_key') | +-------------------------------------+ | 16 | +-------------------------------------+该示例使用
HEX()来显示密钥值,因为它可能包含不可打印字符。该示例还使用了一个简短的密钥以便简洁,但请注意,更长的密钥提供更���的安全性。 -
keyring_key_generate(*key_id*, *key_type*, *key_length*)生成具有给定 ID、类型和长度的新随机密钥,并将其存储在密钥环中。类型和长度值必须与底层密钥环插件支持的值一致。参见第 8.4.4.13 节,“支持的密钥类型和长度”。
参数:
-
key_id: 一个指定密钥 ID 的字符串。 -
key_type: 一个指定密钥类型的字符串。 -
key_length: 一个指定以字节为单位的密钥长度的整数。
返回值:
返回成功的 1,或者返回
NULL和错误。示例:
mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 384); +---------------------------------------------+ | keyring_key_generate('RSA_key', 'RSA', 384) | +---------------------------------------------+ | 1 | +---------------------------------------------+ -
-
keyring_key_length_fetch(*key_id*)给定密钥 ID,返回密钥长度。
参数:
key_id: 一个指定密钥 ID 的字符串。
返回值:
返回成功的整数字节密钥长度,如果密钥不存在则返回
NULL,或者返回NULL和错误。示例:
请参阅
keyring_key_fetch()的描述。 -
keyring_key_remove(*key_id*)从密钥环中删除具有给定 ID 的密钥。
参数:
key_id: 指定密钥 ID 的字符串。
返回值:
返回成功时为 1,失败时返回
NULL。示例:
mysql> SELECT keyring_key_remove('AES_key'); +-------------------------------+ | keyring_key_remove('AES_key') | +-------------------------------+ | 1 | +-------------------------------+ -
keyring_key_store(*key_id*, *key_type*, *key*)对密钥进行混淆并存储在密钥环中。
参数:
-
key_id: 指定密钥 ID 的字符串。 -
key_type: 指定密钥类型的字符串。 -
key: 指定密钥值的字符串。
返回值:
返回成功时为 1,失败时返回
NULL和错误。示例:
mysql> SELECT keyring_key_store('new key', 'DSA', 'My key value'); +-----------------------------------------------------+ | keyring_key_store('new key', 'DSA', 'My key value') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+ -
-
keyring_key_type_fetch(*key_id*)给定密钥 ID,返回密钥类型。
参数:
key_id: 指定密钥 ID 的字符串。
返回值:
返回成功时的密钥类型字符串,如果密钥不存在则返回
NULL,失败时返回NULL和错误。示例:
参见
keyring_key_fetch()的描述。
原文:
dev.mysql.com/doc/refman/8.0/en/keyring-functions-plugin-specific.html
8.4.4.16 插件特定的密钥环密钥管理函数
对于每个密钥环插件特定的函数,本节描述了其目的、调用顺序和返回值。有关通用密钥环函数的信息,请参见第 8.4.4.15 节,“通用密钥环密钥管理函数”。
-
keyring_aws_rotate_cmk()关联的密钥环插件:
keyring_awskeyring_aws_rotate_cmk()旋转 AWS KMS 密钥。旋转仅更改 AWS KMS 用于后续数据密钥加密操作的密钥。AWS KMS 保留先前的 CMK 版本,因此使用先前 CMK 生成的密钥在旋转后仍然可解密。旋转会更改 AWS KMS 内部使用的 CMK 值,但不会更改用于引用它的 ID,因此在调用
keyring_aws_rotate_cmk()之后无需更改keyring_aws_cmk_id系统变量。此函数需要
SUPER权限。参数:
无。
返回值:
返回 1 表示成功,或者返回
NULL和错误表示失败。 -
keyring_aws_rotate_keys()关联的密钥环插件:
keyring_awskeyring_aws_rotate_keys()用于旋转存储在由keyring_aws_data_file系统变量命名的keyring_aws存储文件中的密钥。旋转将文件中的每个密钥发送到 AWS KMS 进行重新加密,使用keyring_aws_cmk_id系统变量的值作为 CMK 值,并将新加密的密钥存储在文件中。keyring_aws_rotate_keys()在以下情况下用于密钥重新加密:-
在旋转 CMK 之后;也就是在调用
keyring_aws_rotate_cmk()函数之后。 -
在更改
keyring_aws_cmk_id系统变量为不同密钥值之后。
此函数需要
SUPER权限。参数:
无。
返回值:
返回 1 表示成功,或者返回
NULL和错误表示失败。 -
-
keyring_hashicorp_update_config()关联的密钥环插件:
keyring_hashicorp调用
keyring_hashicorp_update_config()函数会导致keyring_hashicorp执行运行时重新配置,如 keyring_hashicorp Configuration 中所述。此函数需要
SYSTEM_VARIABLES_ADMIN权限,因为它修改全局系统变量。参数:
无。
返回值:
返回成功时字符串
'Configuration update was successful.',失败时返回'Configuration update failed.'。
8.4.4.17 密钥环元数据
本节描述了关于密钥环使用的信息来源。
要查看密钥环插件是否已加载,请检查信息模式PLUGINS表或使用SHOW PLUGINS语句(参见第 7.6.2 节,“获取服务器插件信息”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'keyring%';
+--------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+--------------+---------------+
| keyring_file | ACTIVE |
+--------------+---------------+
要查看存在哪些密钥,请检查性能模式keyring_keys表:
mysql> SELECT * FROM performance_schema.keyring_keys;
+-----------------------------+--------------+----------------+
| KEY_ID | KEY_OWNER | BACKEND_KEY_ID |
+-----------------------------+--------------+----------------+
| audit_log-20210322T130749-1 | | |
| MyKey | me@localhost | |
| YourKey | me@localhost | |
+-----------------------------+--------------+----------------+
要查看密钥环组件是否已加载,请检查性能模式keyring_component_status表。例如:
mysql> SELECT * FROM performance_schema.keyring_component_status;
+---------------------+-------------------------------------------------+
| STATUS_KEY | STATUS_VALUE |
+---------------------+-------------------------------------------------+
| Component_name | component_keyring_file |
| Author | Oracle Corporation |
| License | GPL |
| Implementation_name | component_keyring_file |
| Version | 1.0 |
| Component_status | Active |
| Data_file | /usr/local/mysql/keyring/component_keyring_file |
| Read_only | No |
+---------------------+-------------------------------------------------+
Component_status值为Active表示组件初始化成功。如果组件加载但初始化失败,则值为Disabled。
8.4.4.18 密钥环命令选项
MySQL 支持以下与密钥环相关的命令行选项:
-
--keyring-migration-destination=*plugin*命令行格式 --keyring-migration-destination=plugin_name类型 字符串 用于密钥迁移的目标密钥环插件。参见第 8.4.4.14 节,“在密钥环密钥存储之间迁移密钥”。选项值的解释取决于是否指定了
--keyring-migration-to-component:-
如果没有指定,则选项值是一个密钥环插件,解释方式与
--keyring-migration-source相同。 -
如果是,则选项值是一个密钥环组件,指定为插件目录中的组件库名称,包括任何特定于平台的扩展,如
.so或.dll。
注意
--keyring-migration-source和--keyring-migration-destination对于所有密钥环迁移操作都是必需的。源和目标插件必须不同,并且迁移服务器必须支持这两个插件。 -
-
--keyring-migration-host=*host_name*命令行格式 --keyring-migration-host=host_name类型 字符串 默认值 localhost当前正在使用其中一个密钥迁移密钥库的运行服务器的主机位置。参见第 8.4.4.14 节,“在密钥环密钥存储之间迁移密钥”。迁移始终在本地主机上进行,因此该选项始终指定用于连接到本地服务器的值,例如
localhost、127.0.0.1、::1或本地主机 IP 地址或主机名。 -
--keyring-migration-password[=*password*]命令行格式 --keyring-migration-password[=password]类型 字符串 用于连接到当前使用其中一个密钥迁移密钥库的运行服务器的 MySQL 帐户的密码。参见第 8.4.4.14 节,“在密钥环密钥存储之间迁移密钥”。
密码值是可选的。如果未提供,则服务器会提示输入。如果提供了密码,则
--keyring-migration-password=后面必须没有空格。如果未指定密码选项,则默认情况下不发送密码。在命令行上指定密码应被视为不安全。请参见第 8.1.2.1 节,“密码安全的最终用户指南”。您可以使用选项文件来避免在命令行上提供密码。在这种情况下,文件应具有严格的模式,并且只能由用于运行迁移服务器的帐户访问。
-
--keyring-migration-port=*端口号*命令行格式 --keyring-migration-port=端口号类型 数值 默认值 3306对于 TCP/IP 连接,连接到当前使用密钥迁移密钥库之一的运行服务器的端口号。参见第 8.4.4.14 节,“在密钥环密钥存储之间迁移密钥”。
-
--keyring-migration-socket=*路径*命令行格式 --keyring-migration-socket={file_name|pipe_name}类型 字符串 对于 Unix 套接字文件或 Windows 命名管道连接,连接到当前使用密钥迁移密钥库之一的运行服务器的套接字文件或命名管道。参见第 8.4.4.14 节,“在密钥环密钥存储之间迁移密钥”。
-
--keyring-migration-source=*插件*命令行格式 --keyring-migration-source=plugin_name类型 字符串 密钥迁移的源密钥环插件。参见第 8.4.4.14 节,“在密钥环密钥存储之间迁移密钥”。
该选项的值类似于
--plugin-load,但只能指定一个插件库。该值以*plugin_library或name=plugin_library的形式给出,其中plugin_library是包含插件代码的库文件的名称,name*是要加载的插件的名称。如果命名了一个插件库而没有任何前置插件名称,服务器将加载库中的所有插件。有了前置插件名称,服务器将仅从库中加载指定的插件。服务器在由plugin_dir系统变量命名的目录中查找插件库文件。注意
--keyring-migration-source和--keyring-migration-destination对于所有密钥环迁移操作都是必需的。源和目标插件必须不同,并且迁移服务器必须支持这两个插件。 -
--keyring-migration-to-component命令行格式 --keyring-migration-to-component[={OFF|ON}]引入版本 8.0.24 类型 布尔值 默认值 OFF表示密钥迁移是从密钥环插件到密钥环组件的。此选项使得可以从任何密钥环插件迁移密钥到任何密钥环组件,从而便于将 MySQL 安装从密钥环插件过渡到密钥环组件。
对于从一个密钥环组件迁移密钥到另一个密钥环组件,请使用mysql_migrate_keyring实用程序。不支持从密钥环组件迁移到密钥环插件。请参阅第 8.4.4.14 节,“在密钥环密钥库之间迁移密钥”。
-
--keyring-migration-user=*user_name*命令行格式 --keyring-migration-user=user_name类型 字符串 用于连接当前正在使用其中一个密钥迁移密钥库的运行服务器的 MySQL 帐户的用户名。请参阅第 8.4.4.14 节,“在密钥环密钥库之间迁移密钥”。
原文:
dev.mysql.com/doc/refman/8.0/en/keyring-system-variables.html
8.4.4.19 密钥环系统变量
MySQL 密钥环插件支持以下系统变量。使用它们来配置密钥环插件操作。除非安装了适当的密钥环插件(请参阅第 8.4.4.3 节,“密钥环插件安装”),否则这些变量不可用。
-
keyring_aws_cmk_id命令行格式 --keyring-aws-cmk-id=value系统变量 keyring_aws_cmk_id范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 从 AWS KMS 服务器获取并由
keyring_aws插件使用的 KMS 密钥 ID。除非安装了该插件,否则此变量不可用。此变量为必填项。如果未指定,
keyring_aws初始化将失败。 -
keyring_aws_conf_file命令行格式 --keyring-aws-conf-file=file_name系统变量 keyring_aws_conf_file范围 全局 动态 否 SET_VAR提示适用否 类型 文件名 默认值 特定于平台keyring_aws插件的配置文件位置。除非安装了该插件,否则此变量不可用。在插件启动时,
keyring_aws从配置文件中读取 AWS 秘密访问密钥 ID 和密钥。为了使keyring_aws插件成功启动,配置文件必须存在并包含有效的秘密访问密钥信息,初始化如第 8.4.4.9 节,“使用 keyring_aws 亚马逊网络服务密钥环插件”中所述。默认文件名为
keyring_aws_conf,位于默认密钥环文件目录中。此默认目录的位置与keyring_file_data系统变量相同。有关详细信息,请参阅该变量的描述,以及如果手动创建目录时要考虑的注意事项。 -
keyring_aws_data_file命令行格式 --keyring-aws-data-file系统变量 keyring_aws_data_file范围 全局 动态 否 SET_VAR提示适用否 类型 文件名 默认值 特定于平台存储
keyring_aws插件的文件位置。除非安装了该插件,否则此变量不可用。在插件启动时,如果分配给
keyring_aws_data_file的值指定不存在的文件,则keyring_aws插件会尝试创建它(以及必要时的父目录)。如果文件存在,keyring_aws会将文件中包含的任何加密密钥读入其内存缓存中。keyring_aws不会在内存中缓存未加密的密钥。默认文件名为
keyring_aws_data,位于默认密钥环文件目录中。此默认目录的位置与keyring_file_data系统变量相同。有关详细信息,请参阅该变量的描述,以及如果手动创建目录时需要考虑的事项。 -
keyring_aws_region命令行格式 --keyring-aws-region=value系统变量 keyring_aws_region作用域 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 us-east-1有效值(≥ 8.0.30) af-south-1``ap-east-1``ap-northeast-1``ap-northeast-2``ap-northeast-3``ap-south-1``ap-southeast-1``ap-southeast-2``ca-central-1``cn-north-1``cn-northwest-1``eu-central-1``eu-north-1``eu-south-1``eu-west-1``eu-west-2``eu-west-3``me-south-1``sa-east-1``us-east-1``us-east-2``us-gov-east-1``us-iso-east-1``us-iso-west-1``us-isob-east-1``us-west-1``us-west-2有效值(≥ 8.0.17, ≤ 8.0.29) ap-northeast-1``ap-northeast-2``ap-south-1``ap-southeast-1``ap-southeast-2``ca-central-1``cn-north-1``cn-northwest-1``eu-central-1``eu-west-1``eu-west-2``eu-west-3``sa-east-1``us-east-1``us-east-2``us-west-1``us-west-2有效值(≤ 8.0.16) ap-northeast-1``ap-northeast-2``ap-south-1``ap-southeast-1``ap-southeast-2``eu-central-1``eu-west-1``sa-east-1``us-east-1``us-west-1``us-west-2keyring_aws插件的 AWS 区域。除非安装了该插件,否则此变量不可用。 -
keyring_encrypted_file_data命令行格式 --keyring-encrypted-file-data=file_name已弃用 8.0.34 系统变量 keyring_encrypted_file_data作用域 全局 动态 是 SET_VAR提示适用否 类型 文件名 默认值 特定于平台注意
截至 MySQL 8.0.34 版本,
keyring_encrypted_file插件已被弃用,并可能在将来的 MySQL 版本中被移除。考虑使用component_keyring_encrypted_file替代;component_keyring_encrypted_file组件取代了keyring_encrypted_file插件。由
keyring_encrypted_file插件用于安全数据存储的数据文件的路径名。除非安装了该插件,否则此变量不可用。文件位置应位于仅供密钥环插件使用的目录中。例如,不要将文件放在数据目录下。密钥环操作是事务性的:
keyring_encrypted_file插件在写操作期间使用备份文件,以确保如果操作失败,可以回滚到原始文件。备份文件与keyring_encrypted_file_data系统变量的值相同,后缀为.backup。不要为多个 MySQL 实例使用相同的
keyring_encrypted_file数据文件。每个实例应该有自己独特的数据文件。默认文件名为
keyring_encrypted,位于特定于平台的目录中,取决于INSTALL_LAYOUTCMake 选项的值,如下表所示。如果您正在从源代码构建,并且要明确指定文件的默认目录,请使用INSTALL_MYSQLKEYRINGDIRCMake 选项。INSTALL_LAYOUT值默认 keyring_encrypted_file_data值DEB,RPM,SVR4/var/lib/mysql-keyring/keyring_encrypted否则 在 CMAKE_INSTALL_PREFIX值下的keyring/keyring_encrypted在插件启动时,如果分配给
keyring_encrypted_file_data的值指定一个不存在的文件,则keyring_encrypted_file插件会尝试创建它(以及必要时的父目录)。如果您手动创建目录,应该具有严格的模式,并且只能由用于运行 MySQL 服务器的帐户访问。例如,在 Unix 和类 Unix 系统上,要使用
/usr/local/mysql/mysql-keyring目录,以下命令(以root执行)创建目录并设置其模式和所有权:cd /usr/local/mysql mkdir mysql-keyring chmod 750 mysql-keyring chown mysql mysql-keyring chgrp mysql mysql-keyring如果
keyring_encrypted_file插件无法创建或访问其数据文件,它会将错误消息写入错误日志。如果尝试对keyring_encrypted_file_data进行运行时赋值导致错误,则变量值保持不变。重要
一旦
keyring_encrypted_file插件创建了其数据文件并开始使用它,重要的是不要删除该文件。文件丢失会导致使用其密钥加密的数据无法访问。(可以重命名或移动文件,只要您将keyring_encrypted_file_data的值相匹配即可。) -
keyring_encrypted_file_password命令行格式 --keyring-encrypted-file-password=password已弃用 8.0.34 系统变量 keyring_encrypted_file_password作用范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 注意
截至 MySQL 8.0.34 版本,
keyring_encrypted_file插件已被弃用,并可能在未来的 MySQL 版本中被移除。考虑使用component_keyring_encrypted_file替代;component_keyring_encrypted_file组件取代了keyring_encrypted_file插件。keyring_encrypted_file插件使用的密码。除非安装了该插件,否则此变量不可用。此变量是强制性的。如果未指定,
keyring_encrypted_file初始化将失败。如果在选项文件中指定了此变量,则文件应具有限制模式,并且只能由用于运行 MySQL 服务器的帐户访问。
重要
一旦设置了
keyring_encrypted_file_password的值,更改它不会旋转密钥环密码,并且可能导致服务器无法访问。如果提供了错误密码,则keyring_encrypted_file插件无法从加密的密钥环文件中加载密钥。密码数值无法在运行时通过
SHOW VARIABLES或性能模式global_variables表显示,因为显示数值已被混淆。 -
keyring_file_data命令行格式 --keyring-file-data=file_name已弃用 8.0.34 系统变量 keyring_file_data作用范围 全局 动态 是 SET_VAR提示适用否 类型 文件名 默认值 特定于平台注意
截至 MySQL 8.0.34 版本,
keyring_file插件已被弃用,并可能在未来的 MySQL 版本中被移除。考虑使用component_keyring_file替代;component_keyring_file组件取代了keyring_file插件。由
keyring_file插件用于安全数据存储的数据文件的路径名。除非安装了该插件,否则此变量不可用。文件位置应位于仅供密钥环插件使用的目录中。例如,不要将文件放在数据目录下。密钥环操作是事务性的:
keyring_file插件在写操作期间使用备份文件,以确保如果操作失败,它可以回滚到原始文件。备份文件与keyring_file_data系统变量的值相同,后缀为.backup。不要为多个 MySQL 实例使用相同的
keyring_file数据文件。每个实例应具有其自己独特的数据文件。默认文件名为
keyring,位于特定于平台的目录中,并取决于INSTALL_LAYOUTCMake 选项的值,如下表所示。如果您正在从源代码构建,则可以使用INSTALL_MYSQLKEYRINGDIRCMake 选项显式指定文件的默认目录。INSTALL_LAYOUT值默认 keyring_file_data值DEB,RPM,SVR4/var/lib/mysql-keyring/keyring否则 在 CMAKE_INSTALL_PREFIX值下的keyring/keyring在插件启动时,如果分配给
keyring_file_data的值指定一个不存在的文件,则keyring_file插件会尝试创建它(以及必要时的父目录)。如果您手动创建目录,则应具有限制模式,并且只能由用于运行 MySQL 服务器的帐户访问。例如,在 Unix 和类 Unix 系统上,要使用
/usr/local/mysql/mysql-keyring目录,以下命令(以root执行)创建目录并设置其模式和所有权:cd /usr/local/mysql mkdir mysql-keyring chmod 750 mysql-keyring chown mysql mysql-keyring chgrp mysql mysql-keyring如果
keyring_file插件无法创建或访问其数据文件,则会将错误消息写入错误日志。如果对keyring_file_data的尝试运行时赋值导致错误,则变量值保持不变。重要
一旦
keyring_file插件创建了其数据文件并开始使用它,重要的是不要删除该文件。例如,InnoDB使用该文件存储用于解密使用InnoDB表空间加密的数据的主密钥;请参阅第 17.13 节,“InnoDB 数据静态加密”。文件丢失会导致这些表中的数据无法访问。(可以重命名或移动文件,只要您更改keyring_file_data的值以匹配即可。)建议在创建第一个加密表之后立即创建密钥环数据文件的单独备份,并在主密钥轮换之前和之后创建备份。 -
keyring_hashicorp_auth_path命令行格式 --keyring-hashicorp-auth-path=value引入版本 8.0.18 系统变量 keyring_hashicorp_auth_path范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认�� /v1/auth/approle/login在 HashiCorp Vault 服务器中启用 AppRole 认证的认证路径,供
keyring_hashicorp插件使用。除非安装了该插件,否则此变量不可用。 -
keyring_hashicorp_ca_path命令行格式 --keyring-hashicorp-ca-path=file_name引入版本 8.0.18 系统变量 keyring_hashicorp_ca_path范围 全局 动态 是 SET_VAR提示适用否 类型 文件名 默认值 空字符串MySQL 服务器可访问的本地文件的绝对路径名,其中包含供
keyring_hashicorp插件使用的正确格式化的 TLS 证书颁发机构。除非安装了该插件,否则此变量不可用。如果未设置此变量,
keyring_hashicorp插件将在不使用服务器证书验证的情况下打开 HTTPS 连接,并信任 HashiCorp Vault 服务器提供的任何证书。为了安全起见,必须假定 Vault 服务器不是恶意的,且不存在中间人攻击的可能性。如果这些假设是无效的,请将keyring_hashicorp_ca_path设置为受信任 CA 证书的路径。(例如,在证书和密钥准备中的说明中,这是company.crt文件。) -
keyring_hashicorp_caching命令行格式 --keyring-hashicorp-caching[={OFF|ON}]引入 8.0.18 系统变量 keyring_hashicorp_caching范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF是否启用
keyring_hashicorp插件使用的可选内存中密钥缓存,以缓存来自 HashiCorp Vault 服务器的密钥。除非安装了该插件,否则此变量不可用。如果启用了缓存,插件将在初始化期间填充它。否则,插件仅在初始化期间填充密钥列表。启用缓存是一种折衷:它提高了性能,但在内存中保留了敏感密钥信息的副本,这可能不利于安全目的。
-
keyring_hashicorp_commit_auth_path引入 8.0.18 系统变量 keyring_hashicorp_commit_auth_path范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 此变量与
keyring_hashicorp_auth_path相关联,在keyring_hashicorp插件初始化期间从中获取其值。除非安装了该插件,否则此变量不可用。如果初始化成功,它反映了实际用于插件操作的“已提交”值。有关更多信息,请参见 keyring_hashicorp 配置。 -
keyring_hashicorp_commit_ca_path引入 8.0.18 系统变量 keyring_hashicorp_commit_ca_path范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 此变量与
keyring_hashicorp_ca_path相关联,在keyring_hashicorp插件初始化期间从中获取其值。除非安装了该插件,否则此变量不可用。如果初始化成功,它反映了实际用于插件操作的“已提交”值。有关更多信息,请参见 keyring_hashicorp 配置。 -
keyring_hashicorp_commit_caching引入版本 8.0.18 系统变量 keyring_hashicorp_commit_caching范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 此变量与
keyring_hashicorp_caching相关联,在keyring_hashicorp插件初始化期间从中获取其值。除非安装了该插件,否则此变量不可用。如果初始化成功,它反映了实际用于插件操作的“已提交”值。有关更多信息,请参见 keyring_hashicorp 配置。 -
keyring_hashicorp_commit_role_id引入版本 8.0.18 系统变量 keyring_hashicorp_commit_role_id范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 此变量与
keyring_hashicorp_role_id相关联,在keyring_hashicorp插件初始化期间从中获取其值。除非安装了该插件,否则此变量不可用。如果初始化成功,它反映了实际用于插件操作的“已提交”值。有关更多信息,请参见 keyring_hashicorp 配置。 -
keyring_hashicorp_commit_server_url引入版本 8.0.18 系统变量 keyring_hashicorp_commit_server_url范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 此变量与
keyring_hashicorp_server_url相关联,在keyring_hashicorp插件初始化期间从中获取其值。除非安装了该插件,否则此变量不可用。如果初始化成功,它反映了实际用于插件操作的“已提交”值。有关更多信息,请参见 keyring_hashicorp 配置。 -
keyring_hashicorp_commit_store_path引入版本 8.0.18 系统变量 keyring_hashicorp_commit_store_path作用范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 此变量与
keyring_hashicorp_store_path相关联,在keyring_hashicorp插件初始化期间从中获取其值。除非安装了该插件,否则此变量不可用。如果初始化成功,它反映了实际用于插件操作的“已提交”值。有关更多信息,请参阅 keyring_hashicorp 配置。 -
keyring_hashicorp_role_id命令行格式 --keyring-hashicorp-role-id=value引入版本 8.0.18 系统变量 keyring_hashicorp_role_id作用范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认值 空字符串HashiCorp Vault AppRole 认证角色 ID,供
keyring_hashicorp插件使用。除非安装了该插件,否则此变量不可用。值必须采用 UUID 格式。此变量为必填项。如果未指定,
keyring_hashicorp初始化将失败。 -
keyring_hashicorp_secret_id命令行格式 --keyring-hashicorp-secret-id=value引入版本 8.0.18 系统变量 keyring_hashicorp_secret_id作用范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认值 空字符串HashiCorp Vault AppRole 认证秘钥 ID,供
keyring_hashicorp插件使用。除非安装了该插件,否则此变量不可用。值必须采用 UUID 格式。此变量为必填项。如果未指定,
keyring_hashicorp初始化将失败。此变量的值属于敏感信息,因此在显示时会被
*字符掩盖。 -
keyring_hashicorp_server_url命令行格式 --keyring-hashicorp-server-url=value引入版本 8.0.18 系统变量 keyring_hashicorp_server_url作用范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认值 https://127.0.0.1:8200HashiCorp Vault 服务器 URL,供
keyring_hashicorp��件使用。除非安装了该插件,否则此变量不可用。值必须以https://开头。 -
keyring_hashicorp_store_path命令行格式 --keyring-hashicorp-store-path=value引入版本 8.0.18 系统变量 keyring_hashicorp_store_path作用范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认值 空字符串HashiCorp Vault 服务器内的存储路径,在适当提供 AppRole 凭据的情况下由
keyring_hashicorp插件提供写入权限。除非安装了该插件,否则此变量不可用。要指定凭据,请设置keyring_hashicorp_role_id和keyring_hashicorp_secret_id系统变量(例如,在 keyring_hashicorp 配置 中所示)。此变量为必填项。如果未指定,
keyring_hashicorp初始化将失败。 -
keyring_oci_ca_certificate命令行格式 --keyring-oci-ca-certificate=file_name引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_ca_certificate作用范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 默认值 空字符串用于 Oracle Cloud Infrastructure 证书验证的 CA 证书包文件的路径名。除非安装了该插件,否则此变量不可用。
文件包含一个或多个用于对等验证的证书。如果未指定文件,则使用系统上安装的默认 CA 包。如果值为
disabled(区分大小写),keyring_oci将不执行证书验证。 -
keyring_oci_compartment命令行格式 --keyring-oci-compartment=ocid引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_compartment作用范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 keyring_oci插件用作 MySQL 密钥位置的租户区段的 OCID。除非安装了该插件,否则此变量不可用。在使用
keyring_oci之前,如果不存在 MySQL 区段或子区段,则必须创建一个。此区段不应包含任何保险库密钥或保险库密钥。它不应被 MySQL Keyring 以外的系统使用。有关管理区段和获取 OCID 的信息,请参阅管理区段。
此变量是必需的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_encryption_endpoint命令行格式 --keyring-oci-encryption-endpoint=value引入 8.0.22 弃用 8.0.31 系统变量 keyring_oci_encryption_endpoint范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 Oracle Cloud Infrastructure 加密服务器的端点,
keyring_oci插件用于为新密钥生成密文。除非安装了该插件,否则此变量不可用。加密端点是特定于保险库的,Oracle Cloud Infrastructure 在创建保险库时分配它。要获取端点 OCID,请查看您的
keyring_oci保险库的配置详细信息,使用管理保险库中的说明。此变量是必需的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_key_file命令行格式 --keyring-oci-key-file=file_name引入 8.0.22 弃用 8.0.31 系统变量 keyring_oci_key_file范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 包含
keyring_oci插件用于 Oracle Cloud Infrastructure 认证的 RSA 私钥文件的文件路径名。除非安装了该插件,否则此变量不可用。您还必须使用控制台上传相应的 RSA 公钥。控制台显示密钥指纹值,您可以使用它来设置
keyring_oci_key_fingerprint系统变量。有关生成和上传 API 密钥的信息,请参阅必需的密钥和 OCID。
此变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_key_fingerprint命令行格式 --keyring-oci-key-fingerprint=value引入 8.0.22 弃用 8.0.31 系统变量 keyring_oci_key_fingerprint范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 RSA 私钥的指纹,
keyring_oci插件用于 Oracle Cloud Infrastructure 认证。除非安装了该插件,否则此变量不可用。在创建 API 密钥时获取密钥指纹,请执行此命令:
openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c或者,从控制台获取指纹,当您上传 RSA 公钥时,控制台会自动显示指纹。
有关获取密钥指纹的信息,请参阅必需的密钥和 OCID。
此变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_management_endpoint命令行格式 --keyring-oci-management-endpoint=value引入 8.0.22 弃用 8.0.31 系统变量 keyring_oci_management_endpoint范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 Oracle Cloud Infrastructure 密钥管理服务器的端点,
keyring_oci插件用于列出现有密钥。除非安装了该插件,否则此变量不可用。密钥管理端点是特定于保险库的,Oracle Cloud Infrastructure 在创建保险库时分配它。要获取端点 OCID,请查看您的
keyring_oci保险库的配置详细信息,使用管理保险库中的说明。此变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_master_key命令行格式 --keyring-oci-master-key=ocid引入 8.0.22 弃用 8.0.31 系统变量 keyring_oci_master_key范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 keyring_oci插件用于加密秘密的 Oracle Cloud Infrastructure 主加密密钥的 OCID。除非安装了该插件,否则此变量不可用。在使用
keyring_oci之前,如果不存在 Oracle Cloud Infrastructure 区隔的加密密钥,则必须创建一个。为生成的密钥提供一个特定于 MySQL 的名称,并且不要将其用于其他目的。有关密钥创建的信息,请参阅管理密钥。
此变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_secrets_endpoint命令行格式 --keyring-oci-secrets-endpoint=value引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_secrets_endpoint范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 Oracle Cloud Infrastructure 秘密服务器的终端点,
keyring_oci插件用于列出、创建和撤销秘密。除非安装了该插件,否则此变量不可用。秘密终端点是特定于保险库的,Oracle Cloud Infrastructure 在创建保险库时分配它。要获取终端点 OCID,请查看您的
keyring_oci保险库的配置详细信息,使用管理保险库中的说明。此变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_tenancy命令行格式 --keyring-oci-tenancy=ocid引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_tenancy范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 keyring_oci插件用作 MySQL 区隔的 Oracle Cloud Infrastructure 租户的 OCID。除非安装了该插件,否则此变量不可用。在使用
keyring_oci之前,如果不存在租户,则必须创建一个租户。要从控制台获取租户 OCID,请使用必需的密钥和 OCID中的说明。此变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_user命令行格式 --keyring-oci-user=ocid引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_user作用范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 keyring_oci插件用于云连接的 Oracle Cloud Infrastructure 用户的 OCID。除非安装了该插件,否则此变量不可用。在使用
keyring_oci之前,此用户必须存在并被授予使用配置的 Oracle Cloud Infrastructure 租户、区域和 Vault 资源的访问权限。要从控制台获取用户 OCID,请使用必需密钥和 OCID中的说明。
此变量是必需的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_vaults_endpoint命令行格式 --keyring-oci-vaults-endpoint=value引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_vaults_endpoint作用范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 keyring_oci插件用于获取密钥值的 Oracle Cloud Infrastructure Vaults 服务器的端点。除非安装了该插件,否则此变量不可用。Vault 端点是特定于 Vault 的,Oracle Cloud Infrastructure 在创建 Vault 时分配它。要获取端点 OCID,请查看您的
keyring_ociVault 的配置详细信息,使用管理 Vaults中的说明。此变量是必需的。如果未指定,
keyring_oci初始化将失败。 -
keyring_oci_virtual_vault命令行格式 --keyring-oci-virtual-vault=ocid引入版本 8.0.22 已弃用 8.0.31 系统变量 keyring_oci_virtual_vault作用范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 Oracle Cloud Infrastructure Vault 的 OCID,
keyring_oci插件用于加密操作的 Vault。除非安装了该插件,否则此变量不可用。在使用
keyring_oci之前,如果 MySQL 区域不存在,则必须在 MySQL 区域中创建一个新的 Vault。(或者,您可以重用位于 MySQL 区域的父区域中的现有 Vault。)区域用户只能看到并使用其各自区域中的密钥。有关创建保险库并获取保险库 OCID 的信息,请参阅管理保险库。
该变量是强制性的。如果未指定,
keyring_oci初始化将失败。 -
keyring_okv_conf_dir命令行格式 --keyring-okv-conf-dir=dir_name系统变量 keyring_okv_conf_dir范围 全局 动态 是 SET_VAR提示适用否 类型 目录名称 默认值 空字符串存储
keyring_okv插件使用的配置信息的目录路径。除非安装了该插件,否则此变量不可用。该位置应该是仅供keyring_okv插件使用的目录。例如,不要将目录放在数据目录下。默认
keyring_okv_conf_dir值为空。为了让keyring_okv插件能够访问 Oracle Key Vault,该值必须设置为包含 Oracle Key Vault 配置和 SSL 材料的目录。有关设置此目录的说明,请参见第 8.4.4.8 节,“使用 keyring_okv KMIP 插件”。该目录应具有严格的模式,并且只能由用于运行 MySQL 服务器的帐户访问。例如,在 Unix 和类 Unix 系统上,要使用
/usr/local/mysql/mysql-keyring-okv目录,以下命令(以root身份执行)创建目录并设置其模式和所有权:cd /usr/local/mysql mkdir mysql-keyring-okv chmod 750 mysql-keyring-okv chown mysql mysql-keyring-okv chgrp mysql mysql-keyring-okv如果分配给
keyring_okv_conf_dir的值指定了一个不存在的目录,或者不包含启用与 Oracle Key Vault 建立连接的配置信息,keyring_okv会将错误消息写入错误日志。如果对keyring_okv_conf_dir的尝试运行时赋值导致错误,则变量值和 keyring 操作保持不变。 -
keyring_operations系统变量 keyring_operations范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON是否启用了钥匙环操作。此变量在钥匙迁移操作期间使用。参见第 8.4.4.14 节,“在钥匙环密钥存储之间迁移密钥”。修改此变量所需的特权是
ENCRYPTION_KEY_ADMIN,另外还需要SYSTEM_VARIABLES_ADMIN或已弃用的SUPER特权。
8.4.5 MySQL Enterprise Audit
8.4.5.1 MySQL Enterprise Audit 元素
8.4.5.2 安装或卸载 MySQL Enterprise Audit
8.4.5.3 MySQL Enterprise Audit 安全考虑
8.4.5.4 审计日志文件格式
8.4.5.5 配置审计日志记录特性
8.4.5.6 读取审计日志文件
8.4.5.7 审计日志过滤
8.4.5.8 编写审计日志过滤器定义
8.4.5.9 禁用审计日志记录
8.4.5.10 传统模式审计日志过滤
8.4.5.11 审计日志参考
8.4.5.12 审计日志限制
注意
MySQL Enterprise Audit 是包含在 MySQL Enterprise Edition 中的扩展,这是一个商业产品。要了解更多关于商业产品的信息,请参阅 www.mysql.com/products/。
MySQL Enterprise Edition 包括 MySQL Enterprise Audit,使用名为 audit_log 的服务器插件实现。MySQL Enterprise Audit 使用开放的 MySQL Audit API,以启用对特定 MySQL 服务器上执行的连接和查询活动的标准、基于策略的监视、记录和阻止。设计符合 Oracle 审计规范,MySQL Enterprise Audit 为受内部和外部监管指导的应用程序提供了一个开箱即用、易于使用的审计和合规解决方案。
安装后,审计插件使 MySQL 服务器能够生成一个包含服务器活动审计记录的日志文件。日志内容包括客户端连接和断开的时间,以及连接时执行的操作,例如访问哪些数据库和表。从 MySQL 8.0.30 开始,您可以添加每个查询的时间和大小的统计信息以检测异常值。
默认情况下,MySQL Enterprise Audit 使用 mysql 系统数据库中的表来持久存储过滤器和用户帐户数据。要使用不同的数据库,请在服务器启动时设置 audit_log_database 系统变量(从 MySQL 8.0.33 开始)。
安装审计插件后(请参阅 第 8.4.5.2 节,“安装或卸载 MySQL Enterprise Audit”),它会写入一个审计日志文件。默认情况下,文件名为 audit.log,位于服务器数据目录中。要更改文件名,请在服务器启动时设置 audit_log_file 系统变量。
默认情况下,审计日志文件内容以新式 XML 格式编写,不进行压缩或加密。要选择文件格式,请在服务器启动时设置audit_log_format系统变量。有关文件格式和内容的详细信息,请参见 Section 8.4.5.4, “Audit Log File Formats”。
有关控制日志记录方式的更多信息,包括审计日志文件命名和格式选择,请参见 Section 8.4.5.5, “配置审计日志记录特性”。要执行审计事件的过滤,请参见 Section 8.4.5.7, “审计日志过滤”。有关配置审计日志插件所使用的参数的描述,请参见审计日志选项和变量。
如果启用了审计日志插件,则性能模式(参见 Chapter 29, MySQL 性能模式)具有相应的仪器。要识别相关仪器,请使用以下查询:
SELECT NAME FROM performance_schema.setup_instruments
WHERE NAME LIKE '%/alog/%';
8.4.5.1 MySQL 企业审计的元素
MySQL 企业审计基于审计日志插件和相关元素:
-
一个名为
audit_log的服务器端插件检查可审计事件,并确定是否将其写入审计日志。 -
一组函数使得可以操作控制日志行为的过滤定义、加密密码和日志文件读取。
-
mysql系统数据库中的表提供过滤和用户账户数据的持久存储,除非您在服务器启动时设置audit_log_database系统变量以指定不同的数据库。 -
系统变量使审计日志配置生效,状态变量提供运行时操作信息。
-
AUDIT_ADMIN权限使用户能够管理审计日志,并且(从 MySQL 8.0.28 开始)AUDIT_ABORT_EXEMPT权限使系统用户能够执行否则会被审计日志过滤器中的“中止”项阻止的查询。
原文:
dev.mysql.com/doc/refman/8.0/en/audit-log-installation.html
8.4.5.2 安装或卸载 MySQL Enterprise Audit
本节描述了如何安装或卸载 MySQL Enterprise Audit,该功能使用审计日志插件和相关元素实现,详见第 8.4.5.1 节,“MySQL Enterprise Audit 的元素”。有关安装插件的一般信息,请参见第 7.6.1 节,“安装和卸载插件”。
在升级 MySQL 安装时,插件升级不是自动的,一些插件可加载函数必须手动加载(参见安装可加载函数)。或者,您可以在升级 MySQL 后重新安装插件以加载新函数。
重要
在按照说明操作之前,请阅读本节的全部内容。根据您的环境,过程的某些部分可能有所不同。
注意
如果安装了audit_log插件,即使禁用了,也会带来一些最小的开销。为了避免这种开销,请不要安装 MySQL Enterprise Audit,除非你打算使用它。
要被服务器使用,插件库文件必须位于 MySQL 插件目录中(由plugin_dir系统变量命名的目录)。如果需要,通过在服务器启动时设置plugin_dir的值来配置插件目录位置。
要安装 MySQL Enterprise Audit,请查看您的 MySQL 安装的share目录,并选择适合您平台的脚本。可用的脚本在用于引用脚本的文件名上有所不同:
-
audit_log_filter_win_install.sql -
audit_log_filter_linux_install.sql
按照以下方式运行脚本。这里的示例使用 Linux 安装脚本。请根据您的系统进行适当的替换。
在 MySQL 8.0.34 之前:
$> mysql -u root -p < audit_log_filter_linux_install.sql
Enter password: *(enter root password here)*
MySQL 8.0.34 及更高版本:
$> mysql -u root -p -D mysql < audit_log_filter_linux_install.sql
Enter password: *(enter root password here)*
从 MySQL 8.0.34 开始,可以在运行安装脚本时选择用于存储 JSON 过滤表的数据库。首先创建数据库;其名称不应超过 64 个字符。例如:
mysql> CREATE DATABASE IF NOT EXISTS *database-name*;
接下来,使用替代数据库名称运行脚本。
$> mysql -u root -p -D *database-name* < audit_log_filter_linux_install.sql
Enter password: *(enter root password here)*
注意
一些 MySQL 版本已经对 MySQL Enterprise Audit 表的结构进行了更改。为了确保您的表在从 MySQL 8.0 的早期版本升级时是最新的,请执行 MySQL 升级过程,确保使用强制更新选项(参见第三章,“升级 MySQL”)。如果您希望仅对 MySQL Enterprise Audit 表运行更新语句,请参阅以下讨论。
截至 MySQL 8.0.12 版本,对于新的 MySQL 安装,MySQL 企业审计使用的audit_log_user表中的USER和HOST列的定义更好地对应于mysql.user系统表中User和Host列的定义。对于已安装 MySQL 企业审计的升级安装,建议您按照以下方式修改表定义:
ALTER TABLE mysql.audit_log_user
DROP FOREIGN KEY audit_log_user_ibfk_1;
ALTER TABLE mysql.audit_log_filter
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
ALTER TABLE mysql.audit_log_user
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
ALTER TABLE mysql.audit_log_user
MODIFY COLUMN USER VARCHAR(32);
ALTER TABLE mysql.audit_log_user
ADD FOREIGN KEY (FILTERNAME) REFERENCES mysql.audit_log_filter(NAME);
注意
要在源/副本复制、组复制或 InnoDB 集群的上下文中使用 MySQL 企业审计,必须在源节点上运行安装脚本之前准备好副本节点。这是必要的,因为脚本中的INSTALL PLUGIN语句不会被复制。
-
在每个副本节点上,从安装脚本中提取
INSTALL PLUGIN语句,并手动执行它。 -
在源节点上,按照先前描述的方式运行安装脚本。
要验证插件安装,请检查信息模式PLUGINS表,或使用SHOW PLUGINS语句(参见 Section 7.6.2, “Obtaining Server Plugin Information”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'audit%';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| audit_log | ACTIVE |
+-------------+---------------+
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
安装了 MySQL 企业审计后,您可以在后续服务器启动时使用--audit-log选项来控制audit_log插件的激活。例如,为了防止插件在运行时被移除,请使用此选项:
[mysqld]
audit-log=FORCE_PLUS_PERMANENT
如果希望防止服务器在没有审计插件的情况下运行,请使用--audit-log并将值设置为FORCE或FORCE_PLUS_PERMANENT,以强制服务器启动失败,如果插件初始化失败。
重要
默认情况下,基于规则的审计日志过滤不会记录任何用户的可审计事件。这与传统审计日志行为不同,传统审计日志会记录所有用户的所有可审计事件(参见 Section 8.4.5.10, “Legacy Mode Audit Log Filtering”)。如果希望通过基于规则的过滤产生记录所有内容的行为,请创建一个简单的过滤器以启用日志记录,并将其分配给默认帐户:
SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');
分配给%的过滤器用于来自没有明确分配过滤器的任何帐户的连接(最初对所有帐户都是真实的)。
当按照上述描述安装后,MySQL 企业审计将一直保留安装状态,直到被卸载。要在 MySQL 8.0.35 及更高版本中移除它,请运行位于 MySQL 安装的share目录中的卸载脚本。这里的示例指定了默认系统数据库mysql,请根据您的系统进行适当的替换。
$> mysql -u root -p -D mysql < audit_log_filter_uninstall.sql
Enter password: *(enter root password here)*
如果脚本不可用,请执行以下语句手动移除表、插件和函数。
DROP TABLE IF EXISTS mysql.audit_log_user;
DROP TABLE IF EXISTS mysql.audit_log_filter;
UNINSTALL PLUGIN audit_log;
DROP FUNCTION audit_log_filter_set_filter;
DROP FUNCTION audit_log_filter_remove_filter;
DROP FUNCTION audit_log_filter_set_user;
DROP FUNCTION audit_log_filter_remove_user;
DROP FUNCTION audit_log_filter_flush;
DROP FUNCTION audit_log_encryption_password_get;
DROP FUNCTION audit_log_encryption_password_set;
DROP FUNCTION audit_log_read;
DROP FUNCTION audit_log_read_bookmark;
DROP FUNCTION audit_log_rotate;
8.4.5.3 MySQL 企业审计安全考虑
默认情况下,审计日志插件生成的审计日志文件的内容未加密,可能包含敏感信息,如 SQL 语句的文本。出于安全考虑,审计日志文件应写入仅对 MySQL 服务器和有合法查看日志原因的用户可访问的目录。默认文件名为audit.log,位于数据目录中。可以通过在服务器启动时设置audit_log_file系统变量来更改此设置。由于日志轮换,可能存在其他审计日志文件。
为了增强安全性,启用审计日志文件加密。参见加密审计日志文件。
原文:
dev.mysql.com/doc/refman/8.0/en/audit-log-file-formats.html
8.4.5.4 审计日志文件格式
当发生可审计事件时,MySQL 服务器调用审计日志插件将审计记录写入其日志文件。通常,在插件启动后写入的第一条审计记录包含服务器描述和启动选项。随后的元素代表诸如客户端连接和断开事件、执行的 SQL 语句等事件。只记录顶层语句,不记录触发器或存储过程等存储程序中的语句。例如,LOAD DATA 中引用的文件内容不会被记录。
要选择审计日志插件用于编写其日志文件的日志格式,请在服务器启动时设置 audit_log_format 系统变量。这些格式可用:
-
新式 XML 格式(
audit_log_format=NEW):一种与 Oracle Audit Vault 更兼容的 XML 格式,MySQL 8.0 默认使用新式 XML 格式。 -
旧式 XML 格式(
audit_log_format=OLD):默认在旧版 MySQL 系列中使用的原始审计日志格式。 -
JSON 格式(
audit_log_format=JSON):将审计日志写入 JSON 数组。只有此格式支持从 MySQL 8.0.30 开始提供的可选查询时间和大小统计信息。
默认情况下,审计日志文件内容以新式 XML 格式编写,不进行压缩或加密。
如果更改 audit_log_format,建议同时更改 audit_log_file。例如,如果将 audit_log_format 设置为 JSON,则将 audit_log_file 设置为 audit.json。否则,新的日志文件将具有不同的格式,但它们都将具有相同的基本名称,没有任何指示格式何时更改的内容。
-
新式 XML 审计日志文件格式
-
旧式 XML 审计日志文件格式
-
JSON 审计日志文件格式
新式 XML 审计日志文件格式
这是一个以新式 XML 格式(audit_log_format=NEW)编写的示例日志文件,为了可读性稍作重新格式化:
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:06:33 UTC</TIMESTAMP>
<RECORD_ID>1_2019-10-03T14: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.7.21-log</MYSQL_VERSION>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>2_2019-10-03T14: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>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
<CONNECTION_ATTRIBUTES>
<ATTRIBUTE>
<NAME>_pid</NAME>
<VALUE>42794</VALUE>
</ATTRIBUTE>
...
<ATTRIBUTE>
<NAME>program_name</NAME>
<VALUE>mysqladmin</VALUE>
</ATTRIBUTE>
</CONNECTION_ATTRIBUTES>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER/>
<DB>test</DB>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>6_2019-10-03T14: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>2019-10-03T14:09:39 UTC</TIMESTAMP>
<RECORD_ID>8_2019-10-03T14: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>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:43 UTC</TIMESTAMP>
<RECORD_ID>11_2019-10-03T14: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>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
<RECORD_ID>12_2019-10-03T14: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、Statistics、Table Dump、TableDelete、TableInsert、TableRead、TableUpdate、Time。这些值中的许多对应于
my_command.h头文件中列出的COM_*xxx*命令值。例如,Create DB和Change user分别对应于COM_CREATE_DB和COM_CHANGE_USER。具有
Table*XXX*的<NAME>值的事件伴随着Query事件。例如,以下语句生成一个Query事件,两个TableRead事件和一个TableInsert事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table*XXX*事件包含<TABLE>和<DB>元素,用于标识事件所涉及的表和包含表的数据库。 -
<RECORD_ID>审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
*SEQ_TIMESTAMP*。当审计日志插件打开审计日志文件时,它将序列号初始化为审计日志文件的大小,然后为记录的每个记录递增序列号。时间戳是*YYYY-MM-DD*T*hh:mm:ss*格式的 UTC 值,指示审计日志插件打开文件的日期和时间。示例:
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID> -
<TIMESTAMP>代表以
*YYYY-MM-DD*T*hh:mm:ss* UTC格式表示的 UTC 值的字符串,指示生成审计事件的日期和时间。例如,对于从客户端接收的 SQL 语句执行对应的事件,其<时间戳>值发生在语句完成后,而不是接收时。示例:
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
下列元素在<审计记录>元素中是可选的。其中许多元素仅在特定<名称>元素值出现时才会出现。
-
<COMMAND_CLASS>指示执行的操作类型的字符串。
示例:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>这些值对应于
statement/sql/*xxx*命令计数器。例如,*xxx*分别是drop_table和select,用于DROP TABLE和SELECT语句。以下语句显示可能的名称:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name; -
<连接属性>从 MySQL 8.0.19 开始,具有
connect值的<COMMAND_CLASS>事件可能包含一个<连接属性>元素,以显示客户端在连接时传递的连接属性。 (有关这些属性的信息,这些属性也在性能模式表中公开,请参见第 29.12.9 节,“性能模式连接属性表”.)<连接属性>元素包含一个<属性>元素,每个元素包含<名称>和<值>元素,分别指示属性名称和值。示例:
<CONNECTION_ATTRIBUTES> <ATTRIBUTE> <NAME>_pid</NAME> <VALUE>42794</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_os</NAME> <VALUE>macos0.14</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_platform</NAME> <VALUE>x86_64</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_client_version</NAME> <VALUE>8.0.19</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_client_name</NAME> <VALUE>libmysql</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>program_name</NAME> <VALUE>mysqladmin</VALUE> </ATTRIBUTE> </CONNECTION_ATTRIBUTES>如果事件中没有连接属性,则不记录任何属性,也不会出现
<连接属性>元素。这可能发生在连接尝试失败,客户端未传递任何属性,或者连接在内部发生,例如在服务器启动期间或由插件发起时。 -
<连接标识符>代表客户端连接标识符的无符号整数。这与会话中由
CONNECTION_ID()函数返回的值相同。示例:
<CONNECTION_ID>127</CONNECTION_ID> -
<连接类型>与服务器的连接的安全状态。允许的值为
TCP/IP(未加密建立的 TCP/IP 连接),SSL/TLS(加密建立的 TCP/IP 连接),Socket(Unix 套接字文件连接),Named Pipe(Windows 命名管道连接)和Shared Memory(Windows 共享内存连接)。示例:
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE> -
<数据库>代表数据库名称的字符串。
示例:
<DB>test</DB>对于连接事件,此元素指示默认数据库;如果没有默认数据库,则该元素为空。对于表访问事件,该元素指示所访问表所属的数据库。
-
<主机>代表客户端主机名的字符串。
示例:
<HOST>localhost</HOST> -
<IP>代表客户端 IP 地址的字符串。
示例:
<IP>127.0.0.1</IP> -
<MYSQL 版本>一个表示 MySQL 服务器版本的字符串。这与
VERSION()函数或version系统变量的值相同。示例:
<MYSQL_VERSION>5.7.21-log</MYSQL_VERSION> -
<操作系统登录>一个表示在认证过程中使用的外部用户名称的字符串,由用于认证客户端的插件设置。对于本机(内置)MySQL 认证,或者如果插件未设置该值,则此元素为空。该值与
external_user系统变量的值相同(参见第 8.2.19 节,“代理用户”)。示例:
<OS_LOGIN>jeffrey</OS_LOGIN> -
<操作系统版本>一个表示构建或运行服务器的操作系统的字符串。
示例:
<OS_VERSION>x86_64-Linux</OS_VERSION> -
<特权用户>一个表示服务器对客户端进行身份验证的用户的字符串。这是服务器用于权限检查的用户名,可能与
<用户>值不同。示例:
<PRIV_USER>jeffrey</PRIV_USER> -
<代理用户>一个表示代理用户的字符串(参见第 8.2.19 节,“代理用户”)。如果未启用用户代理,则值为空。
示例:
<PROXY_USER>developer</PROXY_USER> -
<服务器 ID>一个表示服务器 ID 的无符号整数。这与
server_id系统变量的值相同。示例:
<SERVER_ID>1</SERVER_ID> -
<SQL 文本>一个表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样,使用 UTF-8 编写(每个字符最多 4 个字节),因此该值可能是转换的结果。例如,原始语句可能已从客户端作为 SJIS 字符串接收。
示例:
<SQLTEXT>DELETE FROM t1</SQLTEXT> -
<启动选项>一个表示在启动 MySQL 服务器时在命令行或选项文件中给定的选项的字符串。第一个选项是服务器可执行文件的路径。
示例:
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log_output=FILE</STARTUP_OPTIONS> -
<状态>一个表示命令状态的无符号整数:成功为 0,发生错误为非零值。这与
mysql_errno()C API 函数的值相同。有关<状态码>与<状态>之间的区别的信息,请参阅描述。审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参阅服务器错误消息参考。
警告未记录。
示例:
<STATUS>1051</STATUS> -
<状态码>一个表示命令状态的无符号整数:成功为 0,发生错误为 1。
STATUS_CODE值与STATUS值不同:STATUS_CODE成功时为 0,错误时为 1,这与 Audit Vault 的 EZ_collector 消费者兼容。STATUS是mysql_errno()C API 函数的值。成功时为 0,错误时为非零,因此错误不一定为 1。例子:
<STATUS_CODE>0</STATUS_CODE> -
<TABLE>代表表名的字符串。
例子:
<TABLE>t3</TABLE> -
<USER>代表客户端发送的用户名的字符串。这可能与
<PRIV_USER>值不同。例子:
<USER>root[root] @ localhost [127.0.0.1]</USER> -
<VERSION>代表审计日志文件格式版本的无符号整数。
例子:
<VERSION>1</VERSION>
旧式 XML 审计日志文件格式
这是一个以旧式 XML 格式(audit_log_format=OLD)稍作调整以提高可读性的示例日志文件:
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:00 UTC"
RECORD_ID="1_2019-10-03T14:25:00"
NAME="Audit"
SERVER_ID="1"
VERSION="1"
STARTUP_OPTIONS="--port=3306"
OS_VERSION="i686-Linux"
MYSQL_VERSION="5.7.21-log"/>
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:24 UTC"
RECORD_ID="2_2019-10-03T14: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"
CONNECTION_TYPE="SSL/TLS"
PRIV_USER="root"
PROXY_USER=""
DB="test"/>
...
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:24 UTC"
RECORD_ID="6_2019-10-03T14: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="2019-10-03T14:25:24 UTC"
RECORD_ID="8_2019-10-03T14: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"
CONNECTION_TYPE="SSL/TLS"/>
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:32 UTC"
RECORD_ID="12_2019-10-03T14: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、Statistics、Table Dump、TableDelete、TableInsert、TableRead、TableUpdate、Time。许多这些值对应于
my_command.h头文件中列出的COM_*xxx*命令值。例如,"Create DB"和"Change user"分别对应于COM_CREATE_DB和COM_CHANGE_USER。具有
NAME值为Table*XXX*的事件伴随着Query事件。例如,以下语句生成一个Query事件,两个TableRead事件和一个TableInsert事件:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;每个
Table*XXX*事件都有TABLE和DB属性,用于标识事件所涉及的表和包含该表的数据库。旧式 XML 审计日志格式的
Connect事件不包括连接属性。 -
RECORD_ID审计记录的唯一标识符。该值由序列号和时间戳组成,格式为
*SEQ_TIMESTAMP*。当审计日志插件打开审计日志文件时,它将序列号初始化为审计日志文件的大小,然后为每个记录递增 1。时间戳是以*YYYY-MM-DD*T*hh:mm:ss*格式的 UTC 值,指示审计日志插件打开文件的日期和时间��示例:
RECORD_ID="12_2019-10-03T14:25:00" -
TIMESTAMP代表以
*YYYY-MM-DD*T*hh:mm:ss* UTC格式的 UTC 值的字符串,指示生成审计事件的日期和时间。例如,对于从客户端接收的 SQL 语句执行对应的事件,TIMESTAMP值发生在语句完成之后,而不是接收时。示例:
TIMESTAMP="2019-10-03T14:25:32 UTC"
<AUDIT_RECORD>元素中以下属性是可选的。其中许多属性仅在具有特定NAME属性值的元素中出现。
-
COMMAND_CLASS表示执行的操作类型的字符串。
示例:
COMMAND_CLASS="drop_table"这些值对应于
statement/sql/*xxx*命令计数器。例如,*xxx*分别为drop_table和select,用于DROP TABLE和SELECT语句。以下语句显示可能的名称:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name; -
CONNECTION_ID代表客户端连接标识符的无符号整数。这与会话中
CONNECTION_ID()函数返回的值相同。示例:
CONNECTION_ID="127" -
CONNECTION_TYPE与服务器的连接的安全状态。允许的值为
TCP/IP(未加密的 TCP/IP 连接建立),SSL/TLS(已加密的 TCP/IP 连接建立),Socket(Unix 套接字文件连接),Named Pipe(Windows 命名管道连接)和Shared Memory(Windows 共享内存连接)。示例:
CONNECTION_TYPE="SSL/TLS" -
DB代表数据库名称的字符串。
示例:
DB="test"对于连接事件,此属性指示默认数据库;如果没有默认数据库,则该属性为空。对于表访问事件,该属性指示访问表所属的数据库。
-
HOST代表客户端主机名的字符串。
示例:
HOST="localhost" -
IP代表客户端 IP 地址的字符串。
示例:
IP="127.0.0.1" -
MYSQL_VERSION代表 MySQL 服务器版本的字符串。这与
VERSION()函数或version系统变量的值相同。示例:
MYSQL_VERSION="5.7.21-log" -
OS_LOGIN代表在认证过程中使用的外部用户名称的字符串,由用于认证客户端的插件设置。对于本地(内置)MySQL 认证,或者如果插件未设置该值,则此属性为空。该值与
external_user系统变量的值相同(参见第 8.2.19 节,“代理用户”)。示例:
OS_LOGIN="jeffrey" -
OS_VERSION代表构建或运行服务器的操作系统的字符串。
示例:
OS_VERSION="x86_64-Linux" -
PRIV_USER代表服务器对客户端进行身份验证的用户的字符串。这是服务器用于特权检查的用户名,可能与
USER值不同。示例:
PRIV_USER="jeffrey" -
PROXY_USER代表代理用户的字符串(参见第 8.2.19 节,“代理用户”)。如果未启用用户代理,则值为空。
示例:
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的区别的信息,请参阅STATUS_CODE的描述。审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参阅服务器错误消息参考。
警告不会被记录。
示例:
STATUS="1051" -
STATUS_CODE代表命令状态的无符号整数:成功为 0,发生错误为 1。
STATUS_CODE值与STATUS值不同:STATUS_CODE对于成功为 0,对于错误为 1,这与 Audit Vault 的 EZ_collector 消费者兼容。STATUS是mysql_errno()C API 函数的值。这对于成功为 0,对于错误为非零,因此并不一定为 1 表示错误。例如:
STATUS_CODE="0" -
TABLE代表表名的字符串。
例如:
TABLE="t3" -
USER代表客户端发送的用户名的字符串。这可能与
PRIV_USER值不同。 -
VERSION代表审计日志文件格式版本的无符号整数。
例如:
VERSION="1"
JSON 审计日志文件格式
对于 JSON 格式的审计日志记录(audit_log_format=JSON),日志文件内容形成一个 JSON 数组,每个数组元素表示一个审计事件,作为一个 JSON 键值对的哈希。完整事件记录的示例稍后在本节中出现。以下是部分事件的摘录:
[
{
"timestamp": "2019-10-03 13:50:01",
"id": 0,
"class": "audit",
"event": "startup",
...
},
{
"timestamp": "2019-10-03 15:02:32",
"id": 0,
"class": "connection",
"event": "connect",
...
},
...
{
"timestamp": "2019-10-03 17:37:26",
"id": 0,
"class": "table_access",
"event": "insert",
...
}
...
]
审计日志文件使用 UTF-8 编写(每个字符最多 4 个字节)。当审计日志插件开始写入新的日志文件时,它会写入开头的 [ 数组标记。当插件关闭日志文件时,它会写入结尾的 ] 数组标记。在文件打开时,结尾标记不存在。
审计记录中的项目具有以下特征:
-
一些项目出现在每个审计记录中。其他项目是可选的,可能会根据审计记录类型而出现。
-
审计记录中项目的顺序不保证。
-
项目值不是固定长度。长值可能会根据稍后给出的项目描述而被截断。
-
"和\字符分别编码为\"和\\。
JSON 格式是唯一支持可选查询时间和大小统计信息的审计日志文件格式,这些信息从 MySQL 8.0.30 开始可用。对于符合条件的查询,此数据在慢查询日志中可用,并且在审计日志的上下文中,类似地有助于检测活动分析的异常值。
要将查询统计信息添加到日志文件中,必须将其设置为使用 audit_log_filter_set_filter() 审计日志函数作为 JSON 过滤语法的服务元素的过滤器。有关如何执行此操作的说明,请参见为异常检测添加查询统计信息。要填充 bytes_sent 和 bytes_received 字段,必须将系统变量 log_slow_extra 设置为 ON。
以下示例展示了不同事件类型的 JSON 对象格式(由 class 和 event 项目指示),稍作调整以提高可读性:
审计启动事件:
{ "timestamp": "2019-10-03 14:21:56",
"id": 0,
"class": "audit",
"event": "startup",
"connection_id": 0,
"startup_data": { "server_id": 1,
"os_version": "i686-Linux",
"mysql_version": "5.7.21-log",
"args": ["/usr/local/mysql/bin/mysqld",
"--loose-audit-log-format=JSON",
"--log-error=log.err",
"--pid-file=mysqld.pid",
"--port=3306" ] } }
当由于服务器启动而启动审计日志插件(而不是在运行时启用)时,connection_id设置为 0,account和login不存在。
审计关闭事件:
{ "timestamp": "2019-10-03 14:28:20",
"id": 3,
"class": "audit",
"event": "shutdown",
"connection_id": 0,
"shutdown_data": { "server_id": 1 } }
当由于服务器关闭而卸载审计日志插件(而不是在运行时禁用)时,connection_id设置为 0,account和login不存在。
连接或更改用户事件:
{ "timestamp": "2019-10-03 14:23:18",
"id": 1,
"class": "connection",
"event": "connect",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
"connection_data": { "connection_type": "ssl",
"status": 0,
"db": "test",
"connection_attributes": {
"_pid": "43236",
...
"program_name": "mysqladmin"
} }
}
断开连接事件:
{ "timestamp": "2019-10-03 14:24:45",
"id": 3,
"class": "connection",
"event": "disconnect",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
"connection_data": { "connection_type": "ssl" } }
查询事件:
{ "timestamp": "2019-10-03 14:23:35",
"id": 2,
"class": "general",
"event": "status",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
"general_data": { "command": "Query",
"sql_command": "show_variables",
"query": "SHOW VARIABLES",
"status": 0 } }
具有用于异常检测的可选查询统计信息的查询事件:
{ "timestamp": "2022-01-28 13:09:30",
"id": 0,
"class": "general",
"event": "status",
"connection_id": 46,
"account": { "user": "user", "host": "localhost" },
"login": { "user": "user", “os": "", “ip": "127.0.0.1", “proxy": "" },
"general_data": { "command": "Query",
"sql_command": "insert",
"query": "INSERT INTO audit_table VALUES(4)",
"status": 1146 }
"query_statistics": { "query_time": 0.116250,
"bytes_sent": 18384,
"bytes_received": 78858,
"rows_sent": 3,
"rows_examined": 20878 } }
表访问事件(读取、删除、插入、更新):
{ "timestamp": "2019-10-03 14:23:41",
"id": 0,
"class": "table_access",
"event": "insert",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" },
"table_access_data": { "db": "test",
"table": "t1",
"query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
"sql_command": "insert" } }
以下列表中的项目出现在 JSON 格式审计记录的顶层:每个项目的值可以是标量或JSON哈希。对于具有哈希值的项目,描述仅列出该哈希内的项目名称。有关第二级哈希项目的更完整描述,请参见本节后面的内容。
-
account与事件关联的 MySQL 账户。该值是一个包含这些项目的哈希,等同于
CURRENT_USER()函数中的值:user,host.示例:
"account": { "user": "root", "host": "localhost" } -
class表示事件类的字符串。类定义了事件的类型,与指定事件子类的
event项目一起。示例:
"class": "connection"以下表格显示了
class和event值的允许组合。表 8.34 审计日志类和事件组合
类值 允许的事件值 auditstartup,shutdownconnectionconnect,change_user,disconnectgeneralstatustable_access_dataread,delete,insert,update -
connection_data有关客户端连接的信息。该值是一个包含这些项目的哈希:
connection_type,status,db,可能还有connection_attributes。此项目仅出现在class值为connection的审计记录中。示例:
"connection_data": { "connection_type": "ssl", "status": 0, "db": "test" }截至 MySQL 8.0.19,具有
class值为connection和event值为connect的事件可能包括一个connection_attributes项目,以显示客户端在连接时传递的连接属性。(有关这些属性的信息,也在性能模式表中公开,参见第 29.12.9 节,“性能模式连接属性表”.)connection_attributes值是一个哈希,通过其名称和值表示每个属性。示例:
"connection_attributes": { "_pid": "43236", "_os": "macos0.14", "_platform": "x86_64", "_client_version": "8.0.19", "_client_name": "libmysql", "program_name": "mysqladmin" }如果事件中没有连接属性,则不记录任何属性,也不会出现
connection_attributes项目。这可能发生在连接尝试失败、客户端未传递任何属性或连接在服务器启动期间内部发生时。 -
connection_id代表客户端连接标识符的无符号整数。这与会话中
CONNECTION_ID()函数返回的值相同。示例:
"connection_id": 5 -
event代表事件类别的子类的字符串。子类定义了事件的类型,当与指定事件类别的
class项目一起考虑时。有关更多信息,请参阅class项目描述。示例:
"event": "connect" -
general_data执行语句或命令的信息。该值是一个包含以下项目的哈希:
command、sql_command、query、status。此项目仅出现在class值为general的审计记录中。示例:
"general_data": { "command": "Query", "sql_command": "show_variables", "query": "SHOW VARIABLES", "status": 0 } -
id代表事件 ID 的无符号整数。
示例:
"id": 2对于具有相同
timestamp值的审计记录,它们的id值可以区分它们并形成一个序列。在审计日志中,timestamp/id对是唯一的。这些对是标识日志中事件位置的书签。 -
login指示客户端如何连接到服务器的信息。该值是一个包含以下项目的哈希:
user、os、ip、proxy。示例:
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" } -
query_statistics用于异常检测的可选查询统计信息。该值是一个包含以下项目的哈希:
query_time、rows_sent、rows_examined、bytes_received、bytes_sent。有关设置查询统计信息的说明,请参见为异常检测添加查询统计信息。示例:
"query_statistics": { "query_time": 0.116250, "bytes_sent": 18384, "bytes_received": 78858, "rows_sent": 3, "rows_examined": 20878 } -
shutdown_data与审计日志插件终止相关的信息。该值是一个包含以下项目的哈希:
server_id。此项目仅出现在class和event值分别为audit和shutdown的审计记录中。示例:
"shutdown_data": { "server_id": 1 } -
startup_data与审计日志插件初始化相关的信息。该值是一个包含以下项目的哈希:
server_id、os_version、mysql_version、args。此项目仅出现在class和event值分别为audit和startup的审计记录中。示例:
"startup_data": { "server_id": 1, "os_version": "i686-Linux", "mysql_version": "5.7.21-log", "args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ] } -
table_access_data访问表格的信息。该值是一个包含以下项目的哈希:
db、table、query、sql_command。此项目仅出现在class值为table_access的审计记录中。示例:
"table_access_data": { "db": "test", "table": "t1", "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)", "sql_command": "insert" } -
time此字段类似于
timestamp字段中的字段,但其值是一个整数,表示生成审计事件的日期和时间的 UNIX 时间戳值。示例:
"time" : 1618498687只有在启用
audit_log_format_unix_timestamp系统变量时,time字段才会出现在 JSON 格式的日志文件中。 -
timestamp代表以*
YYYY-MM-DD hh:mm:ss*格式表示的 UTC 值,指示生成审计事件的日期和时间。例如,对应于从客户端接收的 SQL 语句执行的事件具有timestamp值,该值在语句完成后发生,而不是在接收时发生。示例:
"timestamp": "2019-10-03 13:50:01"对于具有相同
timestamp值的审计记录,它们的id值可以区分它们并形成一个序列。在审计日志中,timestamp/id对是唯一的。这些对是标识日志中事件位置的书签。
这些项目出现在与 JSON 格式审计记录顶级项目关联的哈希值中:
-
args一个数组,其中包含 MySQL 服务器启动时在命令行或选项文件中给定的选项。第一个选项是服务器可执行文件的路径。
示例:
"args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ] -
bytes_received从客户端接收的字节数。此项目是可选查询统计信息的一部分。要填充此字段,必须将系统变量
log_slow_extra设置为ON。示例:
"bytes_received": 78858 -
bytes_sent发送到客户端的字节数。此项目是可选查询统计信息的一部分。要填充此字段,必须将系统变量
log_slow_extra设置为ON。示例:
"bytes_sent": 18384 -
command代表生成审计事件的指令类型,例如服务器从客户端接收的命令。
示例:
"command": "Query" -
connection_type与服务器的连接安全状态相关。允许的值为
tcp/ip(未加密的 TCP/IP 连接)、ssl(已加密的 TCP/IP 连接)、socket(Unix 套接字文件连接)、named_pipe(Windows 命名管道连接)和shared_memory(Windows 共享内存连接)。示例:
"connection_type": "tcp/tcp" -
db代表数据库名称的字符串。对于
connection_data,它是默认数据库。对于table_access_data,它是表数据库。示例:
"db": "test" -
host代表客户端主机名的字符串。
示例:
"host": "localhost" -
ip代表客户端 IP 地址的字符串。
示例:
"ip": "::1" -
mysql_version代表 MySQL 服务器版本的字符串。这与
VERSION()函数或version系统变量的值相同。示例:
"mysql_version": "5.7.21-log" -
os代表在认证过程中使用的外部用户名,由用于认证客户端的插件设置。对于本地(内置)MySQL 认证,或者如果插件未设置该值,则此属性为空。该值与
external_user系统变量的值相同。参见 Section 8.2.19, “Proxy Users”。示例:
"os": "jeffrey" -
os_version代表构建或运行服务器的操作系统的字符串。
示例:
"os_version": "i686-Linux" -
proxy代理用户的字符串表示(参见第 8.2.19 节,“代理用户”)。如果未启用用户代理,则该值为空。
示例:
"proxy": "developer" -
查询一个表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串,就像审计日志文件本身一样,是使用 UTF-8(每个字符最多 4 个字节)编写的,因此该值可能是转换的结果。例如,原始语句可能已从客户端作为 SJIS 字符串接收。
示例:
"query": "DELETE FROM t1" -
query_time查询执行时间(如果选择了
longlong数据类型,则为微秒,如果选择了double数据类型,则为秒)。此项是可选查询统计的一部分。示例:
"query_time": 0.116250 -
rows_examined查询期间访问的行数。此项是可选查询统计的一部分。
示例:
"rows_examined": 20878 -
rows_sent作为结果发送给客户端的行数。此项是可选查询统计的一部分。
示例:
"rows_sent": 3 -
服务器 ID表示服务器 ID 的无符号整数。这与
server_id系统变量的值相同。示例:
"server_id": 1 -
sql_command表示 SQL 语句类型的字符串。
示例:
"sql_command": "insert"这些值对应于
statement/sql/*xxx*命令计数器。例如,*xxx*是drop_table和select分别用于DROP TABLE和SELECT语句。以下语句显示可能的名称:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name; -
状态表示命令状态的无符号整数:成功为 0,发生错误为非零。这与
mysql_errno()C API 函数的值相同。审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联,请参阅服务器错误消息参考。
警告未记录。
示例:
"status": 1051 -
表表示表名的字符串。
示例:
"table": "t1" -
用户表示用户名的字符串。根据
user出现的项的不同,含义也不同:-
在
account项中,user是一个表示服务器对客户端进行身份验证的用户的字符串。这是服务器用于权限检查的用户名。 -
在
login项中,user是表示客户端发送的用户名的字符串。
示例:
"user": "root" -