通过init-connect 实现MYSQL 普通用户登录审计
适用范围
MYSQL 8+
问题概述
数据库审计功能主要将用户对数据库的各类操作行为记录审计日志,以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。我们知道MySQL社区版,标准版没有审计功能,除了企业版的审计插件外,常见的还有三类审计插件Percona Audit Log Plugin、MariaDB Audit Plugin、McAfee MySQL Audit Plugin。除此之外,可以利用init-connect进行连接的初始化,获取用户的登录名称. 如果只审计普通用户的登录的话,也是一种不错的选择.
init_connect是社区版MySQL自带的参数。MySQL官方手册释义:“A string to be executed by the server for each client that connects. The string consists of one or more SQL statements, separated by semicolon characters.”即:在连接客户端时刻,服务器要为每个连接,执行init_connect所定义的字符串。这个字符串可以由一个或多个 SQL 语句组成,以分号字符分隔。《》
解决方案
创建审计日志表
审计日志表记录内容包括:登录数据库的用户、IP、本次登录时间(审计必要信息);
create database auditdb ;
CREATE TABLE `auditdb`.`audit` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`THREAD_ID` int(11) DEFAULT NULL COMMENT '线程ID,这个值很重要',
`USER` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '登录用户名',
`ADRESS` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录IP',
`LOGIN_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '登录时间',
PRIMARY KEY (`ID`),
KEY `IDX_USER` (`USER`),
KEY `IDX_HOST` (`ADRESS`),
KEY `IDX_LOGIN_TIME` (`LOGIN_TIME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='普通用户审计日志表';
开启审计日志表
set global init_connect="insert into auditdb.audit values(null,connection_id(),current_user(),substring_index(user(),'@',-1),now());";
#为了永久生效,必须还要在配置文件中添加如下内容,
[mysqld]
init_connect="insert into auditdb.audit values(null,connection_id(),current_user(),substring_index(user(),'@',-1),now());";
# init-connect
创建普通用户并授
创建普通用户,不能有super权限,init-connect对具有super权限的用户不起作用。
审计原理其实就是用户在登录时刻执行init_connect所指定的内容(对审计日志表进行insert操作),所以同时此用户必须要有INSERT权限,如果没有,登录后的任何操作都会导致MYSQL登录失败。
grant insert,select,update on auditdb.audit to 'user1'@'localhost';
审计日志表结果说明
(1)对于普通用户,需要提前被授予一定权限,否则不会被记录到审计日志表中,并且会导致连接失败('user1'@'%'用户因为没有审计表的insert权限,所以没有被记录)。
(2)对于普通用户,如果init_connect的内容有语法错误,依然会直接导致连接失败(无法执行init_connect的内容)。
(3)对于具有super权限的用户,在登录时并不会执行init_connect的内容(所以审计日志表里也没有super用户的记录)。
(4)对于密码过期的普通用户,登录数据库会直接连接失败,且不会记录也不会报错(无法执行init_connect的内容)。
参考文档
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_init_connect