mysql审计开启--两种方法

参考链接

https://blog.youkuaiyun.com/qq_35267530/article/details/76242215

 

 

摘要:第一种方法:安装插件的方式 这里使用的是macfee的mysql audit插件,虽然日志信息比较大,对性能影响大,但是如果想要开启审计,那也应该忍受了。介绍几个参考地址: wiki首页:https://github.

第一种方法:安装插件的方式

这里使用的是macfee的mysql audit插件,虽然日志信息比较大,对性能影响大,但是如果想要开启审计,那也应该忍受了。介绍几个参考地址:

wiki首页:https://github.com/mcafee/mysql-audit/wiki

插件二进制包下载:https://bintray.com/mcafee/mysql-audit-plugin/release/1.1.4-725#files

[root@iZ2zeh44pi6rlahxj7s9azZ data]# ls

audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip  my3307  zzz

[root@iZ2zeh44pi6rlahxj7s9azZ data]# unzip audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip

在配置文件my.cnf的[mysqld]中加入

plugin-load=audit=libaudit_plugin.so

[root@iZ2zeh44pi6rlahxj7s9azZ /]# /data/audit-plugin-mysql-5.7-1.1.4-725/lib/libaudit_plugin.so

[root@iZ2zeh44pi6rlahxj7s9azZ lib]# mv libaudit_plugin.so /opt/mysql/lib/plugin/

[root@iZ2zeh44pi6rlahxj7s9azZ plugin]# chown -R mysql:mysql libaudit_plugin.so

[root@iZ2zeh44pi6rlahxj7s9azZ plugin]# chmod +x libaudit_plugin.so

然后进行插件的加载:

root(none) 04:17:18> INSTALL PLUGIN audit SONAME 'libaudit_plugin.so';

卸载插件的方法:

root(none) 04:17:55> uninstall plugin audit;

插件的加载出现问题(可在error-log中查看):

(1)root@test 05:15:37>INSTALL PLUGIN audit_log SONAME 'libaudit_plugin.so';

ERROR 1127 (HY000): Can't find symbol 'audit_log' in library

原因:是前面说的配置文件中加入的plugin-load=audit=libaudit_plugin.so,中间的audit是对其的命名,如果加载用audit_log则会报错

解决办法:用一致的名字

(2)ERROR 1123 (HY000): Can't initialize function 'audit'; Plugin initialization function failed. 

问题:从报错很明显是因为加载时初始化出现了问题,可能是数据不一致导致的

解决办法:用offest-extract.sh解决,方法如下:

Download the offset-extract.sh script from: https://raw.github.com/mcafee/mysql-audit/master/offset-extract/offset-extract.sh

Note: The offest-extract.sh script changed as the plugin added additional offsets. If you are using a build earlier than 1.0.8-515, you will need to use the script from the 1.0.7 tag: https://raw.githubusercontent.com/mcafee/mysql-audit/v1.0.7/offset-extract/offset-extract.sh . Further more, if you are using a build earlier than 1.0.4-451, you will need to use the script from the 1.0.3 tag: https://raw.github.com/mcafee/mysql-audit/v1.0.3/offset-extract/offset-extract.sh

 

[root@iZ2zeh44pi6rlahxj7s9azZ data]# chmod +x ./offset-extract.sh

[root@iZ2zeh44pi6rlahxj7s9azZ data]# ./offset-extract.sh /opt/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqld

ERROR: gdb not found. Make sure gdb is installed and on the path.

[root@iZ2zeh44pi6rlahxj7s9azZ data]# yum install gdb

[root@iZ2zeh44pi6rlahxj7s9azZ data]# ./offset-extract.sh /opt/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqld

//offsets for: /opt/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqld (5.7.19)

{"5.7.19","b4633eb887552a3bbb5db3a1eea76e48", 7800, 7848, 3624, 4776, 456, 360, 0, 32, 64, 160, 536, 7964, 4352, 3648, 3656, 3660, 6048, 2072, 8, 7032, 7072, 7056},

在配置文件my.cnf的[mysqld]中加入

audit_offsets=7800, 7848, 3624, 4776, 456, 360, 0, 32, 64, 160, 536, 7964, 4352, 3648, 3656, 3660, 6048, 2072, 8, 7032, 7072, 7056

然后再次加载插件就可以了。通过show plugins;验证是否成功(最后一行)

| partition                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |

| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |

| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL               | GPL     |

| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |

| ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     |

| AUDIT                      | ACTIVE   | AUDIT              | libaudit_plugin.so | GPL     |

+----------------------------+----------+--------------------+--------------------+---------+

开启审计日志:

root@test 04:48:57> SET GLOBAL audit_json_file=ON;

进入datadir目录,看到mysql-audit.json的文件即为审计日志文件

ps:具体有关插件的参数含义见https://github.com/mcafee/mysql-audit/wiki/Configuration

 

第二种:通过init-connect

1、创建审计用的库表。

yuelei@(none) 04:36:31>create database db_monitor ;

Query OK, 1 row affected (0.00 sec)

 

yuelei@(none) 04:36:35>use db_monitor ;

Database changed

yuelei@db_monitor 04:37:17>CREATE TABLE accesslog

    -> ( thread_id int(11) DEFAULT NULL,  #进程id

    ->  log_time datetime default null,  #登录时间

    ->  localname varchar(50) DEFAULT NULL, #登录名称,带详细ip

    ->  matchname varchar(50) DEFAULT NULL, #登录用户

    ->  key idx_log_time(log_time)

    -> )

Query OK, 0 rows affected (0.02 sec)

2、配置init-connect参数

yuelei@db_monitor 04:37:21>set global init_connect='insert into db_monitor.accesslog(thread_id,log_time,localname,matchname) values(connection_id(),now(),user(),current_user())';

Query OK, 0 rows affected (0.00 sec)

yuelei@db_monitor 04:39:34>flush privileges;

Query OK, 0 rows affected (0.00 sec)

3、授予普通用户对accesslog表的insert权限(在root用户下)

root@(none) 04:38:34>create user demon@'%';

Query OK, 0 rows affected (0.00 sec)

root@(none) 04:38:34>grant insert on db_monitor.accesslog to demon@'%';

Query OK, 0 rows affected (0.00 sec)

进入具有insert(普通权限)的用户demon中对数据库进行一系列操作

demon@db_monitor 04:39:42>use test;

Database changed

demon@test 04:40:00>delete from test4 where id =10;

Query OK, 1 row affected (0.01 sec)

demon@test 04:40:16>flush privileges;

Query OK, 0 rows affected (0.00 sec)

进入具有高级权限的用户下,查看表中的记录,配合binlog日志是否能追踪到时哪个用户,,结果是一目了然。

root@test 04:40:23>select * from db_monitor.accesslog;

+-----------+---------------------+-----------------+-----------------+

| thread_id | log_time            | localname       | matchname       |

+-----------+---------------------+-----------------+-----------------+

|         9 | 2017-07-24 16:44:43 | demon@127.0.0.1 | demon@127.0.0.1 |

+-----------+---------------------+-----------------+-----------------+

1 row in set (0.00 sec)

[root@iZ2zeh44pi6rlahxj7s9azZ log]# /opt/mysql/bin/mysqlbinlog mysql-bin.000044;

# at 3563

#170724 16:46:23 server id 1  end_log_pos 3624     GTID    last_committed=17    sequence_number=18    rbr_only=no

SET @@SESSION.GTID_NEXT= '90ad28b0-6d2b-11e7-8eb5-00163e06ff5b:347'/*!*/;

# at 3624

#170724 16:46:23 server id 1  end_log_pos 3699     Query    thread_id=9    exec_time=0    error_code=0

SET TIMESTAMP=1500885983/*!*/;

BEGIN

/*!*/;

# at 3699

#170724 16:46:23 server id 1  end_log_pos 3798     Query    thread_id=9    exec_time=0    error_code=0

use `test`/*!*/;

SET TIMESTAMP=1500885983/*!*/;

delete from test3 where id =9

/*!*/;

# at 3798

#170724 16:46:23 server id 1  end_log_pos 3825     Xid = 65

COMMIT/*!*/;

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;

DELIMITER ;

# End of log file

 

总结:

第一种方法缺点:日志信息比较大,对性能影响大。优点:对每一时刻每一用户的操作都有记录

第二种方法缺点:只对有低级权限的用户的操作有记录,权限高的则没有 。优点:日志信息比较小,对性能影响小

<think>我们正在讨论如何开启MySQL审计功能。根据引用内容,MySQL审计功能在不同版本和系统上有不同的配置方式。用户询问的是如何开启audit审计功能,我们需要提供具体的配置方法。首先,注意MySQL企业版和社区版的区别:-企业版自带审计插件(audit_log),可以直接在配置文件中开启-社区版没有内置审计插件,需要额外安装插件,例如使用MariaDB的server_audit插件。根据引用[1]:企业版开启审计功能的方法是在配置文件(my.cnf)中添加相关配置。引用[2][3][4][5]则提到了社区版通过安装第三方插件(如server_audit)来实现。用户没有明确说明是哪个版本,因此我们需要提供两种情况的配置方法。步骤:1.确认MySQL版本和系统环境(Linux或Windows)。2.根据版本选择对应的开启方式。情况一:MySQL企业版(以引用[1]为例)-编辑配置文件(my.cnf或my.ini)-添加配置项:[mysqld]audit_log= ONaudit_log_format =JSON#日志格式,也可以是OLD(XML)或NEW(默认格式)audit_log_policy= ALL#记录所有事件,也可以设置为LOGINS(仅登录)、QUERIES(仅查询)、NONE(无)audit_log_file =/var/log/mysql/audit.log#日志文件路径(Linux)或Windows路径注意:在Windows系统中,路径使用反斜杠,例如:audit_log_file =C:\\mysql\\audit.log情况二:MySQL社区版(需要安装插件)-首先需要获取审计插件文件(server_audit.so或server_audit.dll)。引用[4]提到可以从MariaDB获取(Linux下是.so,Windows下是.dll)。-将插件文件放入MySQL的插件目录(可通过`show variableslike 'plugin_dir';`查看)。-在配置文件中添加配置(或通过SQL命令加载插件并设置参数)。社区版配置步骤(以Linux为例,引用[4][5]):1.获取server_audit.so文件(例如从MariaDB的安装目录中复制)。2.将文件复制到MySQL的插件目录(如/usr/lib/mysql/plugin/)。3.在MySQL配置文件(my.cnf)中添加:[mysqld]plugin-load=server_audit=server_audit.soserver_audit_logging=ONserver_audit_events=CONNECT,QUERY,TABLE#需要记录的事件类型server_audit_file_path=/var/log/mysql/server_audit.logserver_audit_file_rotate_size=30000000#日志文件大小,单位字节server_audit_file_rotations=200#保留的日志文件数量4.重启MySQL服务。或者通过SQL命令动态加载(无需重启):INSTALLPLUGIN server_audit SONAME 'server_audit.so';SETGLOBALserver_audit_logging=ON;...(其他参数也可以通过SET命令设置)注意:Windows系统使用.dll文件,配置方法类似,只需将文件名改为server_audit.dll。另外,引用[5]提到了一些动态设置的参数:SET GLOBAL server_audit_events='query,table';SETGLOBALserver_audit_file_path= 'server_audit.log';SETGLOBALserver_audit_file_rotate_size=300*1024*1024;#300MBSET GLOBAL server_audit_file_rotate_now=ON;#立即轮转日志SETGLOBALserver_audit_logging=1;#开启日志记录但是,通过SQL命令设置的参数在重启后会失效,建议将配置写入配置文件。总结:-企业版:直接配置参数即可。-社区版:需要安装插件,然后配置参数。注意:无论哪种方式,都要确保日志文件的路径MySQL有权限写入。根据用户的问题,我们给出两种情况的配置方法,并提醒用户根据实际版本选择。由于用户没有提供具体的版本和系统,我们提供通用方法。最后,生成相关问题。</think>### 开启 MySQL Audit 审计功能的配置方法 #### 一、MySQL 企业版配置方法(推荐) MySQL 企业版内置审计插件,通过修改配置文件开启: 1. 编辑 MySQL 配置文件: ```bash sudo vim /etc/my.cnf # Linux 系统 # 或修改 my.ini (Windows) ``` 2. 在 `[mysqld]` 段添加配置: ```ini [mysqld] audit_log = ON audit_log_format = JSON # 日志格式:JSON/OLD/NEW audit_log_policy = ALL # 记录策略:ALL/LOGINS/QUERIES/NONE audit_log_file = /var/log/mysql/audit.log # 日志路径 ``` 3. 创建日志目录并授权: ```bash sudo mkdir -p /var/log/mysql sudo chown mysql:mysql /var/log/mysql ``` 4. 重启 MySQL 服务: ```bash sudo systemctl restart mysqld # Linux # Windows: 服务管理器重启 MySQL ``` 5. 验证状态: ```sql SHOW VARIABLES LIKE 'audit_log%'; ``` ![企业版审计状态示例](https://example.com/mysql-audit-status.png) *图:审计功能开启后的状态输出[^1]* #### 二、MySQL 社区版配置方法(需插件) 社区版需安装第三方审计插件(如 MariaDB 的 `server_audit`): 1. **获取插件文件**: - Linux: `server_audit.so`(从 MariaDB 安装包提取) - Windows: `server_audit.dll`([官方下载](https://mariadb.com/kb/en/mariadb-audit-plugin/)) 2. **安装插件**: ```sql INSTALL PLUGIN server_audit SONAME 'server_audit.so'; # Linux -- Windows: INSTALL PLUGIN server_audit SONAME 'server_audit.dll'; ``` 3. **动态配置参数**: ```sql SET GLOBAL server_audit_logging = ON; SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE'; # 监控事件 SET GLOBAL server_audit_file_path = '/var/log/mysql/server_audit.log'; ``` 4. **持久化配置(添加到 my.cnf)**: ```ini [mysqld] plugin-load = server_audit=server_audit.so server_audit_logging = ON server_audit_file_rotate_size = 30000000 # 单个日志大小(30MB) ``` #### 三、关键参数说明 | 参数 | 企业版 | 社区版 | 作用 | |------|--------|--------|------| | 日志格式 | `audit_log_format` | `server_audit_output_type` | JSON/CSV/TEXT | | 事件类型 | `audit_log_policy` | `server_audit_events` | 控制记录的操作类型 | | 日志路径 | `audit_log_file` | `server_audit_file_path` | 日志存储位置 | | 日志轮转 | 系统日志工具 | `server_audit_file_rotate_now` | 触发日志切割 | > **注意**: > 1. Windows 路径需转义:`audit_log_file = C:\\mysql\\audit.log` > 2. 社区版需定期执行 `SET GLOBAL server_audit_file_rotate_now=ON;` 手动轮转日志 > 3. 审计日志可能影响 5-15% 性能,建议仅记录关键操作[^5] #### 四、验证审计效果 ```sql -- 执行测试操作 CREATE TABLE test.t(id INT); SELECT * FROM test.t; -- 查看审计日志(Linux) sudo tail -f /var/log/mysql/audit.log ``` 输出示例(JSON 格式): ```json { "timestamp": "2023-08-20T10:23:45 UTC", "user": "root@localhost", "ip": "192.168.1.10", "action": "QUERY", "query": "SELECT * FROM test.t" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值