MySQL安全审计(init_connect)
1、常规安全
在说审计之前我们先提一点一般我们常用的MySQL的安全注意事项。
- 指定完善的MySQL安全流程
- 用户授权邮件备注
- 每个人对应权限均需留底
- 所有用户非管理员及特殊账户,均精细化授权
2、sql审计
MySQL安全审计,对于小公司来说既没有数据库中间件平台,也没有SQL审计平台,那么如果做一个简单高性能的数据库审计呢?今日浏览global属性时发现 init_connect的属性,这个属性可以执行用户连接后做的操作,官方使用的autocommit 做的实例,而且可以支持动态修改。那我们是不是可以利用这个特性和binlog记录实践ID,审计所有人都做了在什么时间登录做了什么事情。
官方资料: https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
此实验的难点:
- 用户授权,所有用户及对该表有select,insert权限
- 研究在主从情况模式下如何区分对待(级联)
- 对链接的性能会有多大差距(主要针对非连接池或链接复用的情况下)
2.1 实验
创建存储用户数据的表
(root@localhost:mysql.sock) [(none)]>create database accesslog;
Query OK, 1 row affected (0.08 sec)
(root@localhost:mysql.sock) [(none)]>use accesslog
CREATE TABLE accesslog (`id` int(11) primary key auto_increment,
`thread_id` bigint COMMENT '线程ID',
`time` datetime COMMENT '时间',
`localname` varchar(100) COMMENT '连接的ID用户+地址',
`matchname` varchar(100) COMMENT '匹配到的用户ID');
创建所有需要监控的账号,给予INSERT权限
(root@localhost:mysql.sock) [accesslog]>select connection_id(), now(), user(), current_user();
+-----------------+---------------------+----------------+----------------+
| connection_id() | now() | user() | current_user() |
+-----------------+---------------------+----------------+----------------+
| 5 | 2017-06-20 09:02:12 | root@localhost | root@localhost |
+-----------------+---------------------+----------------+----------------+
1 row in set (0.05 sec)
想必大家看到如上信息,就明白了我们要干什么了,对吧。
那我们配置init_connect
SET GLOBAL init_connect='INSERT INTO accesslog.accesslog(thread_id,time,localname,matchname) values(connection_id(), now(), user(), current_user());';
接下来,见证奇迹的时刻到了
需要注意的就是,官方为了保证安全,有super权限的将not exec,原文如下(所以super。。。。):
For users that have the SUPER privilege, the content of init_connect is not executed. This is done so that an erroneous value for init_connect does not prevent all clients from connecting. For example, the value might contain a statement that has a syntax error, thus causing client connections to fail. Not executing init_connect for users that have the SUPER privilege enables them to open a connection and fix the init_connect value.
创建测试用户:
(root@localhost:mysql.sock) [(none)]>grant create ,drop, select ,insert, update on testdemo.* to evantest@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.05 sec)
(root@localhost:mysql.sock) [(none)]>grant insert on accesslog.* to evantest@'%';
Query OK, 0 rows affected (0.00 sec)
测试效果
[root@MySQL-Node-07 mysql_test_data]# mysql -uevantest -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
(evantest@localhost:mysql.sock) [(none)]>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| accesslog |
| testdemo |
+--------------------+
3 rows in set (0.00 sec)
(evantest@localhost:mysql.sock) [(none)]>use testdemo
Database changed
(evantest@localhost:mysql.sock) [testdemo]>create table testtable(id int comment 'test');
Query OK, 0 rows affected (0.02 sec)
查看数据库:
(root@localhost:mysql.sock) [accesslog]>select * from accesslog;
+----+-----------+---------------------+--------------------+----------------+
| id | thread_id | time | localname | matchname |
+----+-----------+---------------------+--------------------+----------------+
| 1 | 6 | 2017-06-20 09:06:32 | root@localhost | root@localhost |
| 2 | 10 | 2017-06-20 09:17:35 | evantest@localhost | evantest@% |
+----+-----------+---------------------+--------------------+----------------+
2 rows in set (0.00 sec)
查看执行了那些操作:
解析binlog
# at 2895
#170620 9:17:35 server id 1 end_log_pos 2926 CRC32 0x45ce5d15 Xid = 67
COMMIT/*!*/;
# at 2926
#170620 9:18:02 server id 1 end_log_pos 2991 CRC32 0x86520809 Anonymous_GTID last_committed=11 sequence_number=12
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2991
#170620 9:18:02 server id 1 end_log_pos 3118 CRC32 0xf03899c0 Query thread_id=10 exec_time=0 error_code=0
use `testdemo`/*!*/;
SET TIMESTAMP=1497921482/*!*/;
create table testtable(id int comment 'test')
/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
这样我们就可以通过线程ID + 时间锁定对应的人在对应的时间做了那些事情。
MySQL安全审计(init_connect)的更多相关文章
- MySql 性能调优策略
本主题调优针对于my.cnf配置来做详细的参数说明 示例配置如下: #cat my.cnf # MySQL client library initialization. [client] port = ...
- 更改 AWS RDS mysql时区 -摘自网络
AWS RDS AWS上搭建数据库的时候,不是DB on EC2就是RDS,但是选择RDS时,Timezone怎么处理? 「面向全球提供的AWS来讲理所当然的是UTC」,而RDS也不是例外.把服务器迁 ...
- linux MySQL5.7 rpm安装(转)
删除旧包: # rpm -qa | grep -i mysql # rpm -ev mysql-libs-* --nodeps 安装rpm包: # rpm -ivh mysql-community-c ...
- 10-MySQlL DBA笔记-基础知识
第四部分 运维篇 首先来了解一下数据库的定义,数据库是高效的.可靠的.易用的.安全的多用户存储引擎,我们可以通过它访问大量的持久化数据.我们管理和维护数据库,本质上也是要确保如上的特性,尽可能地保证数 ...
- Mysql-从库只读设置
主从设置中,如果从库在my.cnf中使用init_connect来限制只读权限的话,从库使用非超级用户(super权限)登陆数据时,无法进行任何操作,仅可维持主从复制. init_connect='S ...
- CentOS7下Jumpserver V3.0 部署
环境准备 # 准备一台 2核4G (最低)且可以访问互联网的 64 位 Centos 7 主机 [root@localhost ~]# hostnamectl --static set-hostnam ...
- mysql init_connect 参数的其他用处
http://blog.itpub.net/133735/viewspace-691196/ init_connect 是可以动态在线调整的,这样就有了一些其他的用处 经过测试init_conne ...
- MySQL5.7 (审计)通过init_connect + binlog 实现MySQL审计功能
转载自:https://blog.51cto.com/13941177/2173620 一.简介 1.概述 mysql本身已经提供了详细的sql执行记录–general log ,但是开启它有以下几个 ...
- mysql 5.7添加server_audit 安全审计功能
mysql 5.7添加server_audit 安全审计功能 一.根据链接下载插件 参考链接下载 http://blog.itpub.net/31441024/viewspace-2213103 l ...
随机推荐
- Refit集成consul在asp.net core中的实践
前言 github:https://github.com/alphayu/ Refit.WebApiClient.Feign等都是支持声名式的Restful服务调用的开源组件. 这个几个组件都综合研究 ...
- Hive 中的四种排序详解,再也不会混淆用法了
Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...
- python之random 、os 、sys 模块
一.random模块 import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3 ...
- LeetCode 长度最小的子数组
题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0. 思路: 非常明显用滑动窗口处 ...
- NOIP初赛篇——05计算机语言
程序 程序就是一系列的操作步骤,计算机程序就是由人实现规定的计算机完成某项工作的操作步骤.每一步骤的具体内容能够理解的指令来描述,这些指令告诉计算机"做什么"和"怎么 ...
- 获取json格式的数据变成了undefined!?
今天在做一个简单的登陆功能时,当一切准备就绪,点击登陆时,什么都没发生..然后开始debug,打断点调试,然后发现了这个.向页面传递数据flag是true代表该用户的账号密码验证码等信息正确可以登录, ...
- (二)数据源处理2-xlrd操作excel
import xlrd3workbook = xlrd3.open_workbook('test_data.xlsx')sheet =workbook.sheet_by_name('Sheet1')p ...
- 【Oracle】查看哪些用户被授予了DBA权限
查看哪些用户被授予了DBA权限 select * from dba_role_privs where granted_role='DBA'; 回收权限: revoke dba from xxx;
- P1273 有线电视网(树形动规,分组背包)
题目链接: https://www.luogu.org/problemnew/show/P1273 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树 ...
- Eureka详解系列(一)--先谈谈负载均衡器
这个系列开始研究 Eureka,在此之前,先来谈谈负载均衡器. 本质上,Eureka 就是一个负载均衡器,可能有的人会说,它是一个服务注册中心,用来注册服务的,这种说法不能说错,只是有点片面. 在这篇 ...