通过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

posted @ 2023-02-23 11:38  www.cqdba.cn  阅读(202)  评论(0编辑  收藏  举报