首页 > 数据库 >通过init-connect 实现MYSQL 普通用户登录审计

通过init-connect 实现MYSQL 普通用户登录审计

时间:2023-02-23 11:45:19浏览次数:48  
标签:审计 登录 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

标签:审计,登录,init,connect,MYSQL,日志,普通用户
From: https://www.cnblogs.com/cqdba/p/17147379.html

相关文章

  • mysql允许root用户在任何地方进行远程登录,并具有所有库任何操作权限
    在本机先使用root用户登录mysql:mysql-uroot-p"youpass"进行授权操作:mysql>GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'youpassword'WITHGRANTOPT......
  • php-mysql 函数练习和使用!
    1.回顾:上篇学习和使用了wamp+eclipse的环境搭建2.这篇将学习一个例子,使用mysql函数来学习3.基本操作  3.1设置编码header("Content-type:text/html;charset=utf-8......
  • mysql查询语句简单优化
    showprocesslist;killID;2. explain分析查询语句explainSELECT*FROMCASE_TESTPCPLEFTJOINSYS_USERSUONSU.USERID=PCP.UPDATE_PERSON......
  • 决战圣地玛丽乔亚Day18----关于mysql死锁+ mysql索引的数据结构相关
    Mysql为什么会产生死锁? 事务A、B分别拿到1,4的独占行锁,然后再去拿4,1的行锁,都会由于另一个事务不释放锁等待,造成了循环等待的局面。(1)同一时刻只能有一个事务持有这......
  • python 把mysql数据导入到execl中
    importpymysqlimportpandasaspddb=pymysql.connect(host='127.0.0.1',user='root',passwd='123456',port=3306,database='world',......
  • mysql备份
    mysql备份1.备份的分类完全备份增量备份差异备份2.备份的方式1,使用专用的备份工具---mysqldump(1)对单个库进行完全备份mysqldump-h[mysql_address]-u[userna......
  • 6.mysql优化案例
    1.单表优化;   进行优化:删除原来的三个字段的索引,创建二个字段的索引;    2.两表关联:左连接,在右表创建索引 右连接,在左表创建......
  • 使用云服务器配置MariaDB环境,Navicat远程连接一直出错误代码 "2002 - Can't connect
    使用腾讯云或者阿里云的服务器配置MariaDB数据库环境的时候,用Navicat远程连接在Centos7的Linux上配置MariaDB数据库环境的时候一直出错误代码"2002-Can'tconnecttos......
  • MySQL查询(二)
    MySQL查询(二)函数调用:select函数名(实参列表)[from表]1.常见函数1.1.单行函数字符函数length获取参数值的字节个数,一个字母是1个字节,一个汉字3个字节sele......
  • MySQL函数
     GROUP_CONCATSUBSTRING_INDEX例子:SUBSTRING_INDEX(GROUP_CONCAT(ll.xorderbyll.seqdesc,ll.createdesc),",",2) mysql中函数CONCAT及GROUP_CONCAT的使用ht......