MySql数据库之审计(开启log+设置init-connect实现无插件审计)

目录

一、查询审计配置情况

二、永久开启审计

三、临时开启审计

四、设置init-connect

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

2、授权某个用户拥有对审计表的select和insert权限

3、设置init_connect参数

五、验证

六、番外

注:有关MySql数据库的其他操作请参见MySql目录进行查找。


一、查询审计配置情况

show global variables like 'log_timestamps';
show global variables like '%general%';

解释:可以看到 log 时间戳是系统时间;此时 log 功能没打开;log 文件放在/var/lib/mysql/jdh.log下,注意这个 log 存放路径是默认的,每个人不一样,根据你自己的情况而定。


二、永久开启审计

注:若想系统重启后还能生效,就需要按如下操作,若临时用一下只需参看【三、临时开启审计】。

vim /etc/mysql/my.cnf
在/etc/mysql/my.cnf中添加下述配置

[mysqld]
general_log = on                                          // on为开启;off为关闭
general_log_file = /var/lib/mysql/jdh.log         // 审计信息存储位置
log_timestamps = SYSTEM                                // 设置日志文件的输出时间为地方时

解释:经验证,其实在mysql中只要打开log开关就会一直开着,也无需在配置文件中进行配置。

注意:上方的 my.cnf 配置文件为我的 linux 服务器上的 mysql 配置文件默认地址,不同系统和不同版本的 mysql 可能不一样。


三、临时开启审计

在mysql中执行以下命令
set global general_log = on;
set global general_log_file = /var/lib/mysql/jdh.log     注:log 保存文件需要改成你自己的,一般是默认路径,就不用改了。
set global log_timestamps = SYSTEM;

解释:基本会默认时间戳和 log 文件位置。大多数只需要第一条命令打开 log 开关就行了。

到此为止我们已经打开了审计得功能,但这只是记录了所有的对数据库的操作,所以接下来我们将通过 init-connect+binlog 来实现相对完整的审计功能。

四、设置init-connect

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

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 '审计用户登录信息';

2、授权某个用户拥有对审计表的select和insert权限

列出授权所有用户的语句:
select concat("grant insert on auditlog.t_audit to '",user,"'@'",host,"';") from mysql.user;  #拼结授权语句
注:这条语句只是列出了所有语句,需要手动复制再授权一下。
授权某个用户的格式:
grant select,insert on auditlog.t_audit to user@localhost identified by ‘password’;

先创建一个临时用户进行验证:

CREATE USER U1;

再给用户U1赋予对表Student操作的一定权限:

GRANT SELECT, DELETE ON TABLE Student TO U1;

所以以上授权为例:grant select,insert on auditlog.t_audit to U1;

注意: 对于所有的普通级别的用户,必须全部都要对日志表具有读写权限, 否则将导致没有权限的用户无法使用数据库。

3、设置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());'

以上语句以便下次重启时能生效。

五、验证

我们使用新用户 U1 登陆,查看审计表 auditlog.t_audit 是否记录了本次登陆,并尝试能否删除。

接下来使用本用户进行一系列的操作,然后退出。

进入 log 查看删除记录,找出删除的那条记录时间。

登陆 root 用户,查看审计表 auditlog.t_audit 并找出删除记录的人。

发现用户 U1 在2019-05-07 15:18:56 登陆了。

而查看 log 日志发现用户 U1 用户在登陆期间做了删除操作,且登陆时间与 log 表中记录一致,且线程 ID 也一致。铁证如山!

六、番外

access-log表如何维护?

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

为什么开启了已经保存了所有的操作和用户信息还需要再建立一个表保存用户的登陆信息呢?

1、无论sql有无语法错误,只要执行了就会记录,导致记录大量无用信息,后期的筛选有难度。因此加了表后可以根据一个大体的操作时间来进行筛选出这个时间段中执行这个操作的登陆用户的thread_id,然后再在表中查找这个thread_id号是哪个用户登陆的就可以很快筛选出执行具体某个操作的用户了。

2、因为新建的表普通用户没有权限删除记录,而log文件时可以删除记录的,所以若没有审计表的话若普通用户能接触保存log的那台主机,则能手动删除。

注:有关MySql数据库的更多其他操作请参见MySql目录进行查找。(建议收藏)

参考博文:

mysql数据库开启审计功能_背锅浩的博客-CSDN博客_mysql开启审计功能

mysql基于init-connect+binlog完成审计功能 - 泽锦 - 博客园

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
开发MySQL审计插件需要以下步骤: 1. 编写审计插件代码,可以使用C或C++编写,需要引用MySQL的C API。 2. 在MySQL配置文件中启用审计插件。 3. 在审计插件实现需要审计的操作,例如连接、断开连接、执行SQL语句等。 4. 将审计信息写入日志文件或数据库中。 下面是一个简单的MySQL审计插件代码示例: ```c++ #include <mysql/plugin.h> static MYSQL_SYSVAR_BOOL(enable_audit, audit_enabled, PLUGIN_VAR_OPCMDARG, "Enables or disables audit plugin", NULL, NULL, 1); static struct st_mysql_daemon audit_plugin = { MYSQL_DAEMON_INTERFACE_VERSION, NULL, // Options "audit_plugin", // Name "MySQL Audit Plugin", // Description NULL, // Author 1, // Version NULL, // Status variables NULL, // System variables NULL, // Hooks NULL, // Default database NULL, // Thread variables NULL, // Reserved NULL, // Mysql_event_general NULL, // Mysql_event_shutdown NULL, // Mysql_event_init NULL, // Mysql_event_deinit NULL, // Mysql_event_check NULL, // Mysql_event_create NULL, // Mysql_event_drop NULL, // Mysql_event_rename NULL, // Mysql_event_alter NULL, // Mysql_event_truncate NULL, // Mysql_event_load NULL, // Mysql_event_insert NULL, // Mysql_event_update NULL, // Mysql_event_delete NULL, // Mysql_event_create_user NULL, // Mysql_event_drop_user NULL, // Mysql_event_grant NULL, // Mysql_event_revoke NULL, // Mysql_event_connect NULL, // Mysql_event_disconnect NULL, // Mysql_event_kill NULL, // Mysql_event_execute_sql NULL, // Mysql_event_binlog_write NULL, // Mysql_event_ddl NULL, // Mysql_event_dml NULL, // Mysql_event_procedure_create NULL, // Mysql_event_procedure_drop NULL, // Mysql_event_function_create NULL, // Mysql_event_function_drop NULL, // Mysql_event_trigger_create NULL, // Mysql_event_trigger_drop NULL, // Mysql_event_partition NULL, // Mysql_event_create_index NULL, // Mysql_event_drop_index NULL, // Mysql_event_alter_tablespace NULL, // Mysql_event_xa_commit NULL, // Mysql_event_xa_rollback NULL, // Mysql_event_xa_start NULL, // Mysql_event_xa_end NULL, // Mysql_event_xa_prepare NULL, // Mysql_event_xa_recover NULL, // Mysql_event_binlog_flush NULL, // Mysql_event_binlog_rotate NULL, // Mysql_event_ddl_pre_check NULL, // Mysql_event_ddl_post_check audit_plugin_options, audit_plugin_status_vars, NULL, // Mysql_event_updaterow NULL, // Mysql_event_deleterow NULL, // Mysql_event_write_rows NULL, // Mysql_event_update_rows NULL, // Mysql_event_delete_rows NULL, // Mysql_event_create_table NULL, // Mysql_event_alter_table NULL, // Mysql_event_drop_table NULL, // Mysql_event_alter_user NULL, // Mysql_event_create_view NULL, // Mysql_event_drop_view NULL, // Mysql_event_create_function NULL, // Mysql_event_drop_function NULL, // Mysql_event_create_procedure NULL, // Mysql_event_drop_procedure NULL, // Mysql_event_create_trigger NULL, // Mysql_event_drop_trigger NULL, // Mysql_event_create_event NULL, // Mysql_event_alter_event NULL, // Mysql_event_drop_event NULL, // Mysql_event_create_server NULL, // Mysql_event_drop_server NULL, // Mysql_event_create_tablespace NULL, // Mysql_event_drop_tablespace NULL, // Mysql_event_create_logfile_group NULL, // Mysql_event_drop_logfile_group NULL, // Mysql_event_create_logfile NULL, // Mysql_event_drop_logfile NULL, // Mysql_event_create_user_defined_function NULL, // Mysql_event_drop_user_defined_function NULL, // Mysql_event_flush NULL // Mysql_event_rotate }; mysql_declare_plugin(audit) { MYSQL_DAEMON_PLUGIN, &audit_plugin, "audit", "MySQL Audit Plugin", "0.1", NULL, 0x0100, // Version NULL, NULL, NULL, 0 } mysql_declare_plugin_end; ``` 此代码示例定义了一个名为“audit_plugin”的MySQL审计插件,并在其中实现了一个名为“enable_audit”的系统变量,用于开启或关闭审计插件。该插件还包括一组回调函数,用于在不同的MySQL事件(例如连接、断开连接、执行SQL语句等)发生时记录审计信息。 注意:以上只是一个简单的示例,实际开发中需要根据具体需求进行修改和完善。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值