暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL Enterprise Audit实战

原创 黄超 2021-06-25
1798

应客户需求,启用mysql的审计日志记录事项,已成功设置,事后整理资料如下。

说明:适用于 MySQL 5.7.13 或更高版本

MySQL 企业版包括 MySQL Enterprise Audit,使用名为 audit_log. MySQL Enterprise Audit 使用开放的 MySQL Audit API 来启用标准的、基于策略的监控、日志记录和阻止在特定 MySQL 服务器上执行的连接和查询活动。
安装后,审计插件使 MySQL 服务器能够生成包含服务器活动审计记录的日志文件。日志内容包括客户端何时连接和断开连接,以及它们在连接时执行的操作,例如它们访问的数据库和表。

选择审计日志文件格式
要配置审计日志文件格式,请audit_log_format在服务器启动时设置 系统变量。这些格式可用:
NEW: 新式 XML 格式。这是默认设置。
OLD: 旧式 XML 格式。
JSON: JSON 格式。

压缩审计日志文件
审计日志文件压缩从 MySQL 5.7.21 开始可用。可以为任何日志格式启用压缩。
要配置审计日志文件压缩,请audit_log_compression在服务器启动时设置 系统变量。允许的值为 NONE(无压缩;默认值)和 GZIP(GNU Zip 压缩)。

加密审计日志文件
审计日志文件加密从 MySQL 5.7.21 开始可用。可以为任何日志格式启用加密。加密基于用户定义的密码(审计日志插件生成的初始密码除外)。要使用此功能,必须启用 MySQL 密钥环,因为审计日志使用它来存储密码。
要配置审计日志文件加密,请audit_log_encryption在服务器启动时设置 系统变量。允许的值为 NONE(无加密;默认)和 AES(AES-256-CBC 密码加密。

手动解压缩和解密审计日志文件
如果为审计日志启用了压缩和加密,则在加密之前进行压缩。在这种情况下,文件名添加了.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

过滤事件类和子类组合
事件类 事件子类 描述
connection connect 连接启动(成功或不成功)
connection change_user 在会话期间使用不同的用户/密码重新验证用户
connection disconnect 连接终止
general status 一般操作信息
table_access read 表读取语句,例如SELECT或 INSERT INTO … SELECT
table_access delete 表删除语句,例如DELETE 或TRUNCATE TABLE
table_access insert 表插入语句,例如INSERT 或REPLACE
table_access update 表更新语句,例如 UPDATE

相关函数:
audit_log_encryption_password_set():设置加密密码
audit_log_encryption_password_get():获得加密密码
audit_log_read():从审计日志中读取事件或关闭读取过程。
audit_log_read_bookmark(): 返回最近写入的审计日志事件的书签
audit_log_filter_set_filter(): 设置一个过滤器
audit_log_filter_remove_filter(): 移走一个过滤器
audit_log_filter_set_user(): 捆绑一个过滤账号
audit_log_filter_remove_user(): 移走过滤账号
audit_log_filter_flush(): 刷新对筛选表的手动更改以影响正在进行的筛选,若是账号规则改变,需要重启mysql

案例:
需求:
1.记录所有mysql的启停
2.记录所有用户的connection
3.针对维护人员root账号的所有操作记录

要安装 MySQL Enterprise Audit,请查看share MySQL 安装目录并选择适合您平台的脚本。可用脚本的不同之处在于用于引用插件库文件的后缀:
• audit_log_filter_win_install.sql:为.dll用作文件名后缀的Windows 系统选择此脚本 。
• audit_log_filter_linux_install.sql: 为 Linux 和类似系统选择此脚本 .so作为文件名后缀。

audit_log_filter_linux_install.sql的内容如下:
cat audit_log_filter_linux_install.sql
USE mysql;

CREATE TABLE IF NOT EXISTS audit_log_filter(NAME VARCHAR(64) BINARY NOT NULL PRIMARY KEY, FILTER JSON NOT NULL) engine= InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
CREATE TABLE IF NOT EXISTS audit_log_user(USER VARCHAR(32) CHARACTER SET utf8 BINARY NOT NULL, HOST VARCHAR(60) CHARACTER SET utf8 BINARY NOT NULL, FILTERNAME VARCHAR(64) BINARY NOT NULL, PRIMARY KEY (USER, HOST), FOREIGN KEY (FILTERNAME) REFERENCES mysql.audit_log_filter(NAME)) engine= InnoDB CHARACTER SET utf8 COLLATE utf8_bin;

INSTALL PLUGIN audit_log SONAME ‘audit_log.so’;

CREATE FUNCTION audit_log_filter_set_filter RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_filter_remove_filter RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_filter_set_user RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_filter_remove_user RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_filter_flush RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_read_bookmark RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_read RETURNS STRING SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_encryption_password_set RETURNS INTEGER SONAME ‘audit_log.so’;
CREATE FUNCTION audit_log_encryption_password_get RETURNS STRING SONAME ‘audit_log.so’;

SELECT audit_log_filter_flush() AS ‘Result’;

导入安装sql:
shell> mysql -u root -p < audit_log_filter_linux_install.sql

my.cnf里面配置
plugin_load = audit_log.so
audit_log = FORCE_PLUS_PERMANENT #防止插件在运行时被删除
audit_log_file = /opt/mysql/data/log/audit/audit.log
audit_log_format = NEW #值=NEW,OLD,JSON
audit_log_strategy = ASYNCHRONOUS
audit_log_buffer_size = 1048576
audit_log_rotate_on_size = 5242880 #审计日志文件大小触发自动轮换
audit_log_policy = ALL
audit_log_connection_policy = ALL
audit_log_statement_policy = ALL
audit_log_exclude_accounts = NULL
audit_log_include_accounts = NULL

验证插件安装:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE ‘audit%’;
±------------±--------------+
| PLUGIN_NAME | PLUGIN_STATUS |
±------------±--------------+
| audit_log | ACTIVE |
±------------±--------------+

设置过滤规则和账号:
select audit_log_filter_set_filter(‘log_connect’,’{“filter”: {“class”: {“name”: “connection”}}}’);
select audit_log_filter_set_user(’%’,‘log_connect’);

select audit_log_filter_filter(‘log_general’,’{“filter”: {“class”: {“name”: “general”}}}’);
select audit_log_filter_user(‘root’,‘log_general’)

select audit_log_filter_set_filter(‘log_table_access_data’,’{“filter”: {“class”: {“name”: “table_access”}}}’);
select audit_log_filter_set_user(‘root’,‘log_table_access_data’);
select audit_log_filter_flush();

参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/audit-log.html

最后修改时间:2021-06-25 16:35:36
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论