MySQL 企业级特性:安全审计

MySQL 企业级特性:安全审计

ShawnYan Lv.6

MySQL企业版中的审计功能(MySQL Enterprise Audit)是MySQL Enterprise Security的重要组成部分,主要用于记录、监控和分析所有数据库活动。它对于满足严格行业法规合规性要求很关键。本文将对该特性进行具体介绍。

企业级审计的主要特性

MySQL Enterprise Audit 为数据库管理员(DBA)提供了必备工具,以便在新旧应用程序中添加审计合规功能,其主要特性如下:

  • 自定义审计日志事件。可以在 MySQL 审计日志中添加自定义事件,从而提供与 SQL 调用相关的额外信息
  • 加密。审计文件现在可以使用标准的 AES - 256 加密算法进行加密。
  • 压缩。使用压缩技术可以将审计存储空间减少高达 10 倍。
  • JSON 审计数据格式。在审计日志配置中指定所需的输出格式为 JSON 或 XML。
  • 过滤功能以保护敏感数据。您可以使用模板定义要审计的内容,或者使用简单的 JSON 过滤器定义来设计高度自定义的过滤器。
  • 满足监管合规标准。确保按照相关法规的要求正确配置审计日志,记录所有必要的数据库活动。
  • 动态且易于管理。可以动态地启用、禁用审计流,更改过滤规则等,并且无需停机。
  • 移除敏感数据。在审计日志配置中,设置敏感数据掩码规则。
1.png

启用企业级审计

安装审计插件 :在数据库服务器上,使用以下 SQL 命令动态安装审计插件。

1
2
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
Query OK, 0 rows affected (0.01 sec)

查看插件信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> select * from information_schema.plugins where plugin_name = 'audit_log'\G
*************************** 1. row ***************************
PLUGIN_NAME: audit_log
PLUGIN_VERSION: 1.1
PLUGIN_STATUS: ACTIVE
PLUGIN_TYPE: AUDIT
PLUGIN_TYPE_VERSION: 4.1
PLUGIN_LIBRARY: audit_log.so
PLUGIN_LIBRARY_VERSION: 1.11
PLUGIN_AUTHOR: Oracle Corporation
PLUGIN_DESCRIPTION: Auditing events logger
PLUGIN_LICENSE: PROPRIETARY
LOAD_OPTION: ON
1 row in set (0.00 sec)

持久化配置需要修改 MySQL 配置文件 my.cnf

1
audit_log=FORCE_PLUS_PERMANENT

该参数值表示,服务器加载插件,并在服务器运行时防止它被删除。

启用了审计日志插件,它会增加几个系统变量,允许控制日志记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> SHOW VARIABLES LIKE 'audit_log%';
+--------------------------------------+--------------+
| Variable_name | Value |
+--------------------------------------+--------------+
| audit_log_buffer_size | 1048576 |
| audit_log_compression | NONE |
| audit_log_connection_policy | ALL |
| audit_log_current_session | OFF |
| audit_log_database | mysql |
| audit_log_disable | OFF |
| audit_log_encryption | NONE |
| audit_log_exclude_accounts | |
| audit_log_file | audit.log |
| audit_log_filter_id | 0 |
| audit_log_flush | OFF |
| audit_log_flush_interval_seconds | 0 |
| audit_log_format | NEW |
| audit_log_format_unix_timestamp | OFF |
| audit_log_include_accounts | |
| audit_log_max_size | 0 |
| audit_log_password_history_keep_days | 0 |
| audit_log_policy | ALL |
| audit_log_prune_seconds | 0 |
| audit_log_read_buffer_size | 32768 |
| audit_log_rotate_on_size | 0 |
| audit_log_statement_policy | ALL |
| audit_log_strategy | ASYNCHRONOUS |
+--------------------------------------+--------------+
23 rows in set (0.00 sec)

企业级审计的日志格式

日志格式由参数 audit_log_format 进行控制,目前支持三种格式:

  • NEW,新 XML 格式:与旧式 XML 格式相比,这种 XML 格式与 Oracle Audit Vault 的兼容性更好。MySQL 8.4 默认使用 new-style XML 格式。
  • OLD,旧 XML 格式:在旧的 MySQL 系列中默认使用的原始审计日志格式。
  • JSON 格式:将审计日志写入 JSON 数组。只有这种格式支持可选的查询时间和大小统计。

默认情况下,审计日志文件内容以新 XML 格式写入,不压缩或加密。

我们将日志格式调整为 JSON。

1
2
mysql> set persist_only audit_log_format = json;
Query OK, 0 rows affected (0.01 sec)

该参数需要重启后生效。

1
2
mysql> restart;
Query OK, 0 rows affected (0.00 sec)

查看审计日志。

1
2
3
4
5
6
bash-5.1# cat audit.log 
[
{ "timestamp": "2025-03-08 06:05:12", "id": 0, "class": "audit", "event": "startup", "connection_id": 0, "account": { "user": "skip-grants user", "host": "" }, "login": { "user": "", "os": "", "ip": "", "proxy": "" }, "startup_data": { "server_id": 1, "os_version": "x86_64-Linux", "mysql_version": "8.4.4-commercial", "args": ["/usr/sbin/mysqld", "--user=mysql" ] } },
{ "timestamp": "2025-03-08 06:05:19", "id": 0, "class": "connection", "event": "connect", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "", "proxy": "" }, "connection_data": { "connection_type": "socket", "status": 0, "db": "", "connection_attributes": { "_pid": "67", "_platform": "x86_64", "_os": "Linux", "_client_name": "libmysql", "os_user": "root", "_client_version": "8.4.4", "program_name": "mysql" } } },
{ "timestamp": "2025-03-08 06:05:19", "id": 1, "class": "general", "event": "status", "connection_id": 9, "account": { "user": "root", "host": "localhost" }, "login": { "user": "root", "os": "", "ip": "", "proxy": "" }, "general_data": { "command": "Query", "sql_command": "select", "query": "select @@version_comment limit 1", "status": 0 } },
...

禁用审计功能

audit_log_disable 变量允许禁用所有连接和已连接会话的审计日志记录。例如:

1
2
mysql> set global audit_log_disable = true;
Query OK, 0 rows affected (0.00 sec)

当 audit_log_disable 设置为 false 时,会重新启用这个插件。

以 audit_log_disable 设置为 true 时,会产生如下警告。

1
2025-03-08T06:25:56.055951Z 12 [Warning] [MY-013834] [Server] Plugin audit_log reported: 'Audit Log is disabled. Enable it with audit_log_disable = false.'

使用审计注意事项

使用企业级审计时有几点注意事项。

  1. 只有SQL语句被记录。非 SQL API(如memcached、Node.JS和NDB API)所做的更改不会被记录到日志中。

  2. 只有顶级语句被记录,存储程序中的语句、触发器不只被记录。

  3. LOAD DATA 等语句引用的文件内容不会被记录。

总结

本文介绍了 MySQL 企业版的安全特性:审计插件。及其一般使用方式和注意事项。更多企业级特性我们后面逐一介绍。

Have a nice day ~

– / END / –

  • Title: MySQL 企业级特性:安全审计
  • Author: ShawnYan
  • Created at: 2025-03-08 23:00:00
  • Updated at: 2025-03-08 23:00:00
  • Link: https://shawnyan.cn/2025/mysql/mysql-ee-audit/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments