zoukankan      html  css  js  c++  java
  • mysql 用init-connect+binlog实现用户操作追踪做access的ip的log记录

    MYSQL中,每个连接都会先执行init-connect,进行连接的初始化。我们可以在这里获取用户的登录名称和thread的ID值。然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等。实现审计。

    实验过程:
    1:创建登录日志库,登录日志表

    CREATE DATABASE `accesslog`;

    USE `accesslog`;

    CREATE TABLE `accesslog` 

    (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `thread_id` int(11) DEFAULT NULL, #线程ID,这个值很重要

      `log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, #登录时间

      `localname` varchar(30) DEFAULT NULL, #登录名称带IP

      `matchname` varchar(30) DEFAULT NULL, #登录用户,user的全称

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    2:在配置文件中配置init-connect参数。登录时插入日志表。如果这个参数是个错误的SQL语句,登录就会失败。
    Linux 下的配置文件为 my.cnf,windows下my.ini

    init-connect='insert into accesslog.accesslog values(null,connection_id(),now(),user(),current_user());'

    log-bin

    重启service mysqld 以使其配置文件生效

    3:创建普通用户,不能有super权限。init-connect对具有super权限的用户不起作用。同时此用户必须要有INSERT权限,如果没有,登录后的任何操作都会导致MYSQL登录失败。

    grant insert,select,update on *.* to 'user1'@'localhost'; #带INSERT权限

    grant select,update on *.* to 'user2'@'localhost'; #不带INSERT权限

    4:SESSION1登录,并查看日志

    D:mysql6in>mysql -uuser1 -p

    Enter password:

    Welcome to the MySQL monitor. Commands end with ; or g.

    Your MySQL connection id is 65

    Server version: 5.1.45-community-log MySQL Community Server (GPL)

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

    mysql> select * FROM accesslog.accesslog;

    +----+-----------+---------------------+-----------------+-----------------+

    | id | thread_id | log_time | localname | matchname |

    +----+-----------+---------------------+-----------------+-----------------+

    | 1 | 65 | 2011-03-11 19:18:25 | user1@localhost | user1@localhost |

    +----+-----------+---------------------+-----------------+-----------------+

    1 row in set (0.00 sec)

    mysql> show processlist;# 当前运行的threadId

    +----+-------+----------------+------+---------+------+-------+------------------+

    | Id | User | Host | db | Command | Time | State | Info |

    +----+-------+----------------+------+---------+------+-------+------------------+

    | 65 | user1 | localhost:1339 | NULL | Query | 0 | NULL | show processlist |

    +----+-------+----------------+------+---------+------+-------+------------------+

    1 row in set (0.00 sec)

    mysql>

    5:再用user2登录

    D:mysql6in>mysql -uuser2 -p

    Enter password:

    Welcome to the MySQL monitor. Commands end with ; or g.

    Your MySQL connection id is 76

    Server version: 5.1.45-community-log

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

    mysql> select * FROM accesslog.accesslog;

    ERROR 2006 (HY000): MySQL server has gone away

    No connection. Trying to reconnect...

    Connection id: 77

    Current database: *** NONE ***

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

    mysql> select * FROM accesslog.accesslog;

    ERROR 2006 (HY000): MySQL server has gone away

    No connection. Trying to reconnect...

    Connection id: 78

    Current database: *** NONE ***

    看下错误日志
    如果没有对log-bin指定log文件,默认在 /var/lib/mysql目录下以mysqld-bin.00000X等作为名称。而 mysqld-bin.index则记录了所有的log的文件名称
    使用时则使用mysqlbinlog /var/lib/mysql|grep "*****"等来追踪database的操作。

    110311 19:23:47 [Warning] Aborted connection 77 to db: 'unconnected' user: 'user2' host: 'localhost' (init_connect command failed)

    110311 19:23:47 [Warning] INSERT command denied to user 'user2'@'localhost' for table 'accesslog'

    110311 19:23:53 [Warning] Aborted connection 78 to db: 'unconnected' user: 'user2' host: 'localhost' (init_connect command failed)

    110311 19:23:53 [Warning] INSERT command denied to user 'user2'@'localhost' for table 'accesslog'

    6:下面以USER1登录,并做一个INSERT操作,查看日志文件。

    mysql> insert into t3 values(10,10,'2011-10-10 00:00:00');

    Query OK, 1 row affected (0.00 sec)

    mysql> show processlist;

    +----+-------+----------------+-----------+---------+------+-------+------------------+

    | Id | User | Host | db | Command | Time | State | Info |

    +----+-------+----------------+-----------+---------+------+-------+------------------+

    | 69 | user1 | localhost:1439 | accesslog | Query | 0 | NULL | show processlist |

    +----+-------+----------------+-----------+---------+------+-------+------------------+

    1 row in set (0.00 sec)

    mysql> select * from accesslog.accesslog;

    +----+-----------+---------------------+-----------------+-----------------+

    | id | thread_id | log_time | localname | matchname |

    +----+-----------+---------------------+-----------------+-----------------+

    | 1 | 65 | 2011-03-11 19:18:25 | user1@localhost | user1@localhost |

    | 2 | 91 | 2011-03-11 19:28:33 | user1@localhost | user1@localhost |

    | 3 | 2 | 2011-03-11 19:31:49 | user1@localhost | user1@localhost |

    | 4 | 2 | 2000-10-10 10:10:10 | user1@localhost | user1@localhost |

    | 5 | 21 | 2000-10-10 11:11:11 | root@localhost | root@% |

    | 6 | 69 | 2011-03-12 21:35:43 | user1@localhost | user1@localhost |

    +----+-----------+---------------------+-----------------+-----------------+

    6 rows in set (0.01 sec)

    查看日志文件的内容

    # at 340

    #110312 21:36:01 server id 1 end_log_pos 453 Query thread_id=69 exec_time=0 error_code=0

    use text;

    SET TIMESTAMP=1299936961;

    insert into t3 values(10,10,'2011-10-10 00:00:00')

    ;

    # at 453

    thread_id=69


    在日志表里记录的和日志文件里面记录的相同。可以通过这个thread_id来追踪到是谁,什么时间,做了什么操作。

    注:

    1.mysql在linux下可以安装audit_log.so插件来实现审计,在windows下不可以,所以用此方法代替。

    2.此方法只适用于binlog存在的条件下,如果系统默认保留14天binlog日志则14天以前的用户信息无法查询。

    3.对于用户赋权时不是on *.*的用户需要加grant insert on accesslog.accesslog to user@host。

    4.当mysql重启后accesslog表中thread_id可能会有重复情况,此时需要结合log_time判断具体登录用户信息。

    5.注释为本人自己总结,如有不对欢迎指出。

  • 相关阅读:
    关键字驱动测试方法
    File文件操作
    问题处理:类没有复制构造函数
    QTP问题修改:This run was performed on Internet Explorer 7.x without the required 'Enable Tabbed Browsing
    QTP:.net中写文件
    bat垃圾清理
    Lua安装与使用
    QTP:Flight账号及密码
    如何在VS2010中运行控制台程序时停留在控制台显示窗口
    QTP中Screen Recorder无内容,no movie is associated with the results.
  • 原文地址:https://www.cnblogs.com/wyy123/p/6109269.html
Copyright © 2011-2022 走看看