zoukankan      html  css  js  c++  java
  • mysql 之审计 init-connect+binlog完成审计功能

    mysql基于init-connect+binlog完成审计功能

    目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版、Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用它来完成审计功能。

    init-connect参数说明:

    http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_init_connect

    step1:创建用户数据库表

    复制代码
    set names utf8
    create database auditlog;
    create table auditlog.t_audit(
      id int not null auto_increment,
      thread_id int not null,
      login_time timestamp,
      localname varchar(50) default null,
      matchname varchar(50) default null, 
      primary key (id)
    )ENGINE=InnoDB default charset=utf8 comment '审计用户登录信息'; 
    复制代码

    step2:授权所有的用户拥有对审计表的插入权限

    select concat("grant insert on auditlog.t_audit to '",user,"'@'",host,"';") from mysql.user;  #拼结授权语句
    然后将这些查出来的sql语句执行,切勿忘记,不执行的话,mysql用户会连接不上!!!! flush privileges;

    或者

    保证所有的用户对此表有写权限

    insert into db (Host,Db,User,Insert_priv) values ('%','auditlog','','Y');
    flush privileges;

    注意,以后每添加一个用户都必须授权此表的插入权限,要不会连接不上!

    step3:设置init_connect参数

    set global init_connect='insert into auditlog.t_audit(id,thread_id,login_time,localname,matchname) values(null,connection_id(),now(),user(),current_user());';
    
    
    
    并在配置文件中增加如下语句:
    init-connect='insert into auditlog.t_audit(id,thread_id,login_time,localname,matchname) values(null,connection_id(),now(),user(),current_user());'
    以便下次重启时能生效 

    验证:

    我们登陆后并删除一条记录,查看binlog,我们可以看到此操作的thread_id为7:

    然后我们来查看此表t_audit表:
    复制代码
    [zejin] 3301>select * from auditlog.t_audit;
    +----+-----------+---------------------+---------------------------+-------------------------+
    | id | thread_id | login_time | localname | matchname |
    +----+-----------+---------------------+---------------------------+-------------------------+
    | 1 | 5 | 2016-08-10 11:01:07 | user_app@192.168.1.240 | user_app@192.168.1.% |
    | 2 | 6 | 2016-08-10 11:02:02 | user_app@192.168.1.236 | user_app@192.168.1.% |
    | 3 | 7 | 2016-08-10 11:19:54 | user_yunwei@192.168.1.240 | user_yunwei@192.168.1.% |
    +----+-----------+---------------------+---------------------------+-------------------------+
    3 rows in set (0.00 sec)
    复制代码
    可以看到thread_id为7的用户为user_yunwei,在192.168.1.240机器上操作删除的,完成了对数据的简单审计。
     
    扩展说明:
    1.init-connect只会在连接时执行,不会对数据库产生大的性能影响
    2.init-connect是在连接时执行的动作命令,故可以用它来完成其它的功能,如:init_connect='SET autocommit=0'
    3.init-connect不会记录拥有super权限的用户记录,为了防止init_connect语句由于语法错误或权限问题而所有用户都登陆不了的情况,保证至少super用户能登陆并修改此值
  • 相关阅读:
    学习摘录2
    实用的html代码
    使用jdom创建xml
    常用eclipse插件地址
    java连接各种数据库 代码
    spring mvc框架 web.xml配置文件 Could not open ServletContext resource [/WEBINF/classes/springservlet.xml] 错误
    第一次添加随笔,哈哈
    WordPress Live Chat – WordPress即时聊天插件
    70个非常酷和时尚的iOS应用程序图标
    20个强大的jQuery翻书插件【 jQuery flipbook】
  • 原文地址:https://www.cnblogs.com/EikiXu/p/9836137.html
Copyright © 2011-2022 走看看