[[toc]]
# 适用范围
mysql 8.+
# 问题概述
Mysql 8.0.30 ,开启了审计加密和压缩,在这种情况下,用户想查看当下准实时的审计日志信息,但是发现审计日志文件的时间并没有发生变化。强制解密当前审计日志文件,解密失败。
现象如下:
## 环境准备
```
# 查看当前审计的密匙
mysql> SELECT KEY_ID FROM performance_schema.keyring_keys
-> WHERE KEY_ID LIKE 'audit_log%'
-> ORDER BY KEY_ID;
+-----------------------------+
| KEY_ID |
+-----------------------------+
| audit_log-20230320T082416-1 |
|+-----------------------------+
# 查看审计密码
mysql> SELECT audit_log_encryption_password_get('audit_log-20230320T082416-1');
+------------------------------------------------------------------+
| audit_log_encryption_password_get('audit_log-20230320T082416-1') |
+------------------------------------------------------------------+
| !W9RdU3%no1HSXPa |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
#审计参数
mysql> show variables like '%audit%' ;
+--------------------------------------+-------------------------------------+
| Variable_name | Value |
+--------------------------------------+-------------------------------------+
| audit_log_buffer_size | 1048576 |
| audit_log_compression | GZIP |
| audit_log_connection_policy | ALL |
| audit_log_current_session | OFF |
| audit_log_disable | OFF |
| audit_log_encryption | AES |
| audit_log_exclude_accounts | |
| audit_log_file | /u01/mysql/data/uat1/logs/audit.log |
| audit_log_filter_id | 2 |
| audit_log_flush | OFF |
| 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 | 104857600 |
| audit_log_statement_policy | ALL |
| audit_log_strategy | ASYNCHRONOUS |
+--------------------------------------+-------------------------------------+
21 rows in set (0.00 sec)
#当前审计策略,和审计用户
mysql> select * from mysql.audit_log_filter ;
+-----------------+-----------------------------------------------+
| NAME | FILTER |
+-----------------+-----------------------------------------------+
| log_all | {"filter": {"log": true}} |
| log_conn_events | {"filter": {"class": {"name": "connection"}}} |
+-----------------+-----------------------------------------------+
2 rows in set (0.00 sec)
mysql> select * from mysql.audit_log_user ;
+------+-----------+-----------------+
| USER | HOST | FILTERNAME |
+------+-----------+-----------------+
| root | localhost | log_all |
| % | | log_conn_events |
+------+-----------+-----------------+
2 rows in set (0.00 sec)
```
## 问题还原
```
# 审计日志文件时间 Mar 20 16:24
[root@s2ahuzcloud01 logs]# ll
total 24
-rw-r----- 1 mysql mysql 48 Mar 20 16:24 audit.log.gz.20230320T082416-1.enc
# 模拟登录失败
[root@s2ahuzcloud01 logs]# mysql -u root -p'123' --socket=/u01/mysql/data/uat1/run/mysql3306.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
# 审计时间并没有发生变化
[root@s2ahuzcloud01 logs]# ll
total 24
-rw-r----- 1 mysql mysql 48 Mar 20 16:24 audit.log.gz.20230320T082416-1.enc
# 强制解密 失败
[root@s2ahuzcloud01 logs]# openssl enc -d -aes-256-cbc -pass pass:'!W9RdU3%no1HSXPa' -md sha256 -in audit.log.gz.20230320T082416-1.enc -out audit.log.gz
bad decrypt
140368205059984:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592:
```
# 问题原因
1.由于日志未完成切换,还不是一个完整的加密文件 ,所以不能直接对没有切换的审计文件进行解密
2.这是由于审计日志开启了异步写入的机制,所以不能及时看到审计日志文件的更新
审计日志插件可以使用多种日志写入策略中的任何一种。无论策略如何,日志记录都是在尽力而为的基础上进行的,不保证一致性。
要指定写入策略,请 audit_log_strategy在服务器启动时设置系统变量。
默认情况下,策略值为 ASYNCHRONOUS,插件异步记录到缓冲区,等待缓冲区是否已满。可以告诉插件不要等待 ( PERFORMANCE) 或同步记录,使用文件系统缓存 ( SEMISYNCHRONOUS) 或 sync()在每次写入请求后通过调用强制输出 ( SYNCHRONOUS)。
```
[mysqld]
audit_log_strategy=SYNCHRONOUS
# 该参数需重启DB
```
对于异步写入策略, audit_log_buffer_size系统变量是以字节为单位的缓冲区大小。在服务器启动时设置此变量以更改缓冲区大小。该插件使用单个缓冲区,它在初始化时分配并在终止时删除。该插件不会为非异步写入策略分配此缓冲区。
异步日志记录策略具有以下特点:
1. 对服务器性能和可伸缩性的影响最小。
2. 在尽可能短的时间内阻塞生成审计事件的线程;也就是说,分配缓冲区的时间加上将事件复制到缓冲区的时间。
3. 输出进入缓冲区。一个单独的线程处理从缓冲区到日志文件的写入。
使用异步日志记录时,如果在写入文件期间出现问题或插件未完全关闭(例如,在服务器主机意外退出的情况下),则日志文件的完整性可能会受到损害。为了降低这种风险,设置 audit_log_strategy为使用同步日志记录。
策略的一个缺点PERFORMANCE是它会在缓冲区已满时丢弃事件。对于负载很重的服务器,审计日志可能缺少事件。
# 解决方案
该问题只需要强制完成一次日志的切换即可
1.由于我们设置了audit_log_rotate_on_size 大于 0,无法手动设置 audit_log_flush让其生效,所以我可以通通过设置参数的方案让期切换。
```
#8.0.31 前需手动移动文件
cd /mysql/data/$env/logs/
logname=`/usr/bin/ls -l audit.log.gz*enc|awk '{print $9}'`
/usr/bin/mv $logname `date +%Y%m%d%M%S`.${logname}
#然后在手动刷新
set global audit_log_rotate_on_size=0 ;
set global audit_log_flush=on ;
#8.0.31后可以执行以下命令
set global audit_log_rotate_on_size=0 ;
SELECT audit_log_rotate();
```
2.我们可以通过 audit_log_encryption_password_set() 函数重设加密密码,触发让其强制切换。
```
#重设密码
mysql> select audit_log_encryption_password_set('123') ;
+------------------------------------------+
| audit_log_encryption_password_set('123') |
+------------------------------------------+
| 1 |
+------------------------------------------+
1 row in set (0.01 sec)
# 日志发换了切换
[root@s2ahuzcloud01 logs]# ll
total 24
-rw-r----- 1 mysql mysql 752 Mar 20 16:24 audit.20230320T082416.log.gz.20230314T031345-1.enc
-rw-r----- 1 mysql mysql 48 Mar 20 16:24 audit.log.gz.20230320T082416-1.enc
#解密 用原来的密码
[root@s2ahuzcloud01 logs]# openssl enc -d -aes-256-cbc -pass pass:'!W9RdU3%no1HSXPa' -md sha256 -in audit.20230320T082416.log.gz.20230314T031345-1.enc -out audit.20230320T082416.log.gz
[root@s2ahuzcloud01 logs]# ll
total 24
-rw-r--r-- 1 root root 729 Mar 20 16:24 audit.20230320T082416.log.gz
-rw-r----- 1 mysql mysql 752 Mar 20 16:24 audit.20230320T082416.log.gz.20230314T031345-1.enc
-rw-r----- 1 mysql mysql 48 Mar 20 16:24 audit.log.gz.20230320T082416-1.enc
#解压缩
[root@s2ahuzcloud01 logs]# gunzip audit.20230320T082416.log.gz > audit.20230320T082416.log
# 查看刚刚登录失败的日志
# cat audit.20230320T082416.log
...
<AUDIT_RECORD>
<TIMESTAMP>2023-03-20T08:39:52 UTC</TIMESTAMP>
<RECORD_ID>7_2023-03-20T08:24:16</RECORD_ID>
<NAME>Connect</NAME>
<CONNECTION_ID>12</CONNECTION_ID>
<STATUS>1045</STATUS>
<STATUS_CODE>1</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP/>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<CONNECTION_TYPE>Socket</CONNECTION_TYPE>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER/>
<DB/>
</AUDIT_RECORD>
...
```
# 参考文档
https://dev.mysql.com/doc/refman/8.0/en/audit-log-logging-configuration.html#audit-log-file-name
https://dev.mysql.com/doc/refman/8.0/en/audit-log-logging-configuration.html
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
2878次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
840次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
487次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
424次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
371次阅读
2025-04-15 14:48:05
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
274次阅读
2025-04-15 15:27:53
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
272次阅读
2025-04-30 17:37:37
SQL优化 - explain查看SQL执行计划(下)
金同学
261次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
242次阅读
2025-04-30 12:17:54
MySQL 8.4 新特性深度解析:功能增强、废弃项与移除项全指南
JiekeXu
226次阅读
2025-04-18 20:21:32
TA的专栏
热门文章
pgbench 使用介绍及示例
2022-02-19 6432浏览
TDSQL 安装部署附图
2020-09-21 6234浏览
【逻辑备份】之 pg_dump使用及示例
2022-02-20 4862浏览
APEX安装中文语言包
2020-04-02 4697浏览
MYSQL "Waiting for table metadata lock" 问题处理
2022-06-30 4593浏览
最新文章
PG在转换null值时,需要注意 CASE WHEN与 COALESCE 的区别
2023-07-03 624浏览
SELinux 影响 bash: Permission denied
2023-06-06 374浏览
一个MYSQL监控与CONNECTION_CONTROL引起的问题
2023-06-06 1720浏览
MYSQL 通过管理端口处理ERROR 1040 (HY000): Too many connections 问题
2023-05-16 3668浏览
MySQL5.7 访问Information_schema.TABLES 导至内存持续增长
2023-05-03 1438浏览