千家信息网

mysql中怎么开启用户审计功能

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,mysql中怎么开启用户审计功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。背景:假设这么一个情况,你是某公司mysql-DBA,
千家信息网最后更新 2025年01月21日mysql中怎么开启用户审计功能

mysql中怎么开启用户审计功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

背景:

假设这么一个情况,你是某公司mysql-DBA,某日突然公司中的所有被人为删了。

尽管有数据备份,但是因服务停止而造成的损失上千万,现在公司需要查出那个做删除操作的人。

但是拥有数据库操作权限的人很多,如何排查,证据又在哪?

是不是觉得无能为力?

本身并没有操作审计的功能,那是不是意味着遇到这种情况只能自认倒霉呢?

本文就将讨论一种简单易行的,用于mysql访问审计的思路。

概述:

其实mysql本身已经提供了详细的sql执行记录–general log(详见上篇blog) ,但是开启它有以下几个缺点

无论sql有无语法错误,只要执行了就会记录,导致记录大量无用信息,后期的筛选有难度。

sql并发量很大时,log的记录会对io造成一定的印象,是数据库效率降低。

日志文件很容易快速膨胀,不妥善处理会对磁盘空间造成一定影响。

本文观点:

使用init-connect + binlog的方法进行mysql的操作审计。

由于mysql binlog记录了所有对数据库长生实际修改的sql语句,及其执行时间,和connection_id但是却没有记录connection_id对应的详细用户信息。

因此本文将通过init-connect,在每次连接的初始化阶段,记录下这个连接的用户,和connection_id信息。

在后期审计进行行为追踪时,根据binlog记录的行为及对应的connection-id 结合 之前连接日志记录 进行分析,得出最后的结论。

正文:

1. 设置init-connect

1.1 创建用于存放连接日志的数据库和表

create database accesslog;

CREATE TABLE accesslog.accesslog (`id` int(11) primary key auto_increment, `time` timestamp, `localname` varchar(30), `matchname` varchar(30))

1.2 创建用户权限

可用现成的root用户用于信息的读取

grant read on accesslog.* to root@localhost identified by ‘password’;

如果存在具有to *.* 权限的用户需要进行限制。

当前登录用户需要对accesslog库至少具有insert权限

1.3 设置init-connect

在[mysqld]下添加以下设置:

init-connect=’insert into accesslog.accesslog values(connection_id(),now(),user(),current_user());’—注意insert句子的语法、引号正确,如果错误的话,登录到mysql之后,操作db会提示你与服务器连接丢失。

Eg.提示信息

No connection. Trying to reconnect...

Connection id: 220

Current database: *** NONE ***

ERROR 2013 (HY000): Lost connection to MySQL server during query

log-bin--------如果原来的配置文件已经启用了日志,这里省略

1.4 重启数据库生效

shell> service mysqld restart

2. 记录追踪

2.1 thread_id确认

假设想知道在2009年11月25日,上午9点多的时候,是谁吧test.dummy这个表给删了。可以用以下语句定位

mysqlbinlog –start-datetime=’2009-11-25 09:00:00′ –stop-datetime=’2009-11-25 09:00:00′ binlog.xxxx | grep ‘dummy’-B 5

会得到如下结果(可见thread_id为5):

# at 300777

#091124 16:54:00 server id 10 end_log_pos 301396 Query thread_id=5 exec_time=0 error_code=0

SET TIMESTAMP=1259052840;

drop table test.dummy;

2.2 用户确认

thread_id 确认以后,找到元凶就只是一条sql语句的问题了。

select * from accesslog.accesslog where conn_id=5 ;

就能发现是testuser2@localhost干的了。

+——+——————————-+——————————-+—————————–+

| id | time | localname | matchname |

+——+——————————-+——————————-+—————————–+

| 5 | 2009-11-25 10:57:39 | testuser2@localhost | testuser2@% |

+——+——————————-+——————————-+—————————–+

3. Q&A

Q:使用init-connect会影响服务器性能吗?

A:理论上,只会在用户每次连接时往数据库里插入一条记录,不会对数据库产生很大影响。除非连接频率非常高(当然,这个时候需要注意的就是如何进行连接复用和控制,而非是不是要用这种方法的问题了)

Q:access-log表如何维护?

A: 由于是一个log系统,推荐使用archive存储引擎,有利于数据厄压缩存放。如果数据库连接数量很大的话,建议一定时间做一次数据导出,然后清表。

Q:表有其他用途么?

A:有!access-log表当然不只用于审计,当然也可以用于对于数据库连接的情况进行数据分析,例如每日连接数分布图等等,只有想不到没有做不到。

Q:会有遗漏的记录吗?

A:会的,init-connect 是不会在super用户登录时执行的。所以access-log里不会有数据库超级用户的记录,这也是为什么我们不主张多个超级用户,并且多人使用的原因

关于mysql中怎么开启用户审计功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

数据 用户 数据库 审计 信息 问题 日志 权限 功能 很大 公司 情况 方法 语句 分析 影响 服务 登录 易行 简单易行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百度轻量应用服务器百度轻量 网络技术 职业岗位调查报告 数据库原理单选 长城超云服务器安装红帽6.8 学校网络安全宣传周工作方案 机房服务器管理方法 深圳通讯软件开发零售价 管家婆登陆服务器出错 数据库中日志文件扩展名是 数据库不支持中文 文献检索OA数据库 匿名登录ftp服务器 金风科技工业互联网平台 《网络安全法》带来的改变 南充市电信网络安全 工程造价与软件开发哪个好 中职生的职业认知计算机网络技术 电脑怎么查看服务器的主机名 服务器端口开放过多影响安全 海迅实时数据库运维 数据库系统概述网课 绿联打印共享服务器支持打印机 生态环境大数据库 方舟怎么建设专用服务器 国家网络安全信息化建设 如何学习c语言软件开发 苹果手机下载软件服务器异常 华为服务器面板报警代码 网络安全专业有什么证 软件开发给甲方方案
0