MYSQL8安全之审计管理
作者:mmseoamin日期:2023-12-18

MYSQL8安全之审计管理

  • 审计概念
  • 一、MYSQL8开源审计mysql-audit
    • mysql-audit安装配置
    • 0、下载解压插件
    • 1、查看mysql的插件位置
    • 2、上传库文件到插件目录
    • 3. 修改my.cnf
    • 4、安装插件
    • 5、查看mysql-audit日志
    • 安装插件报错
      • 解决办法:
      • 1、计算偏移量
      • 2、将偏移量添加到my.cnf中
      • 3、添加偏移量依然报错
      • 二、MYSQL自带的init-connect+binlog实现mysql审计
        • 1、创建一份存放连接信息的表
        • 2、配置权限
        • 3、配置init-connect
        • 4、记录和跟踪测试

          审计概念

          审计:记录用户的操作,方便以后查证,但生产环境数据库本身不建议开启,会影响性能,可以使用第三方实现审计。

          一、MYSQL8开源审计mysql-audit

          mysql5.7企业版自带审计功能,需要付费。
          社区版可以使用McAfee提供的开源软件mysql Audit Pluging
          项目地址:https://github.com/trellix-enterprise/mysql-audit

          mysql-audit安装配置

          0、下载解压插件

          # 下载插件压缩包
          wget -c https://github.com/trellix-enterprise/mysql-audit/releases/download/v1.1.13/audit-plugin-mysql-8.0-1.1.13-1008-linux-x86_64.zip
          # 解压
          unzip audit-plugin-mysql-8.0-1.1.13-1008-linux-x86_64.zip
          # 进入lib目录
          cd audit-plugin-mysql-8.0-1.1.13-1008/lib
          # 赋予可执行权限
          chmod +x libaudit_plugin.so 
          # 修改属主和属组为msyql:mysql
          chown mysql:mysql libaudit_plugin.so 
          

          1、查看mysql的插件位置

          -- 查看插件的位置
          SHOW global variables LIKE '%plugin_dir%';
          

          MYSQL8安全之审计管理,image.png,第1张

          2、上传库文件到插件目录

          # 复制到插件目录
          cp audit-plugin-mysql-8.0-1.1.13-1008/lib/libaudit_plugin.so /usr/lib64/mysql/plugin/
          

          3. 修改my.cnf

          # 停止mysqld服务
          systemctl stop mysqld
          

          修改my.cnf配置文件

          [mysqld]
          # 加载名为 libaudit_plugin.so 的AUDIT审计插件
          plugin-load=AUDIT=libaudit_plugin.so
          # 启用审计日志以JSON格式记录
          audit_json_file=on
          # 指定事件审计文件路径
          audit_json_log_file=/var/log/mysql-audit.json
          # 指定审计事件类型
          ## 如果不指定audit_record_cmds,所有DDL,DML全记录
          audit_record_cmds='insert,delete,update,create,drop,alter,grant,truncate'
          

          MYSQL8安全之审计管理,image.png,第2张
          启动mysqld服务

          -- 启动mysqld服务
          systemctl start mysqld
          

          4、安装插件

          -- root登录mysql
          mysql -uroot
          -- 安装audit插件
          install plugin audit soname 'libaudit_plugin.so';
          -- 查看audit插件版本
          SHOW global status LIKE 'audit_version';
          

          MYSQL8安全之审计管理,image.png,第3张

          5、查看mysql-audit日志

          json查看工具:https://blog.csdn.net/omaidb/article/details/125581170

          # 查安装json查看工具jq
          dnf install jq -y
          # 查看最后100条日志
          tail -100 /var/log/mysql-audit.json
          # 用jq查看json格式日志
          tail -100 /var/log/mysql-audit.json |jq
          

          安装插件报错

          安装libaudit_plugin.so插件报错。
          MYSQL8安全之审计管理,image.png,第4张

          解决办法:

          计算mysqld的偏移量,重新指定mysqld偏移量。

          1、计算偏移量

          # 安装gdb包
          dnf install -y gdb
          # 找到offset-extract.sh脚本
          

          MYSQL8安全之审计管理,image.png,第5张

          # 使用offset-extract.sh脚本计算偏移量
          offset-extract.sh /usr/sbin/mysqld
          

          2、将偏移量添加到my.cnf中

          MYSQL8安全之审计管理,image.png,第6张

          [mysqld]
          audit_offsets=计算出的偏移量
          

          MYSQL8安全之审计管理,image.png,第7张

          3、添加偏移量依然报错

          MYSQL8安全之审计管理,image.png,第8张

          二、MYSQL自带的init-connect+binlog实现mysql审计

          1、创建一份存放连接信息的表

          -- 创建一份存放连接信息的表
          CREATE database auditdb DEFAULT CHARSET utf8mb4;
          -- 进入auditdb库
          use auditdb;
          -- 创建auditdb.accesslog(访问日志)表
          CREATE TABLE auditdb.accesslog(
              ID INT PRIMARY KEY auto_increment,
              ConnectionID INT,
              ConnUserName VARCHAR(30),
              PrivMatchName VARCHAR(30),
              LoginTime timestamp
          );
          

          2、配置权限

          -- 配置权限
          -- 向mysql.db表中插入一条记录,授权所有用户在任意主机上访问auditdb数据库,并具有select和insert的操作权限。
          -- host、db、user、select_priv和insert_priv是该表中的字段名;
          -- %代表通配符,表示任何IP地址都可以使用此记录匹配;
          -- 'auditdb'表示要授权的数据库名称,这里为auditdb;
          -- ''表示要授权的用户名称,这里为空字符串,表示所有用户都能匹配上此记录;
          -- YY表示该用户对auditdb数据库有select和insert操作的权限。
          INSERT into mysql.db(host, db, user, select_priv, insert_priv)
          values('%', 'auditdb', '', 'Y', 'Y');
          -- 提交事务
          cmomit;
          -- 应用权限配置
          FLUSH PRIVILEGES;
          

          3、配置init-connect

          MYSQL8安全之审计管理,image.png,第9张

          # 此项配置可以用于记录所有数据库连接的基本信息,以方便审计和监控。
          # init-connect:在每个新客户端连接成功后,将执行SQL语句
          # 往名为"auditdb.accesslog"的表中插入一条记录,该记录包含连接ID(ConnectionID)、连接用户名(ConnUserName)、权限匹配名(PrivMatchName)和登录时间(LoginTime)等信息。
          ## connection_id()函数用于获取当前连接的ID,
          ## user()函数用于获取当前连接的用户名,
          ## current_use()函数用于获取当前连接所使用的权限匹配名
          ## now()函数则用于获取当前的系统时间。
          init-connect='INSERT into auditdb.accesslog(ConnectionID,ConnUserName,PrivMatchName,LoginTime) values(connection_id(),user(),current_use(),now());'
          # 指定binlog的存储路径和文件名前缀
          ## binlog记录所有对数据库的修改操作,包括插入、更新和删除
          log_bin=/var/lib/mysql/binlog
          # 指定binlog索引文件的存储路径和文件名
          log_bin_index=/var/lib/mysql/binlog.index
          

          重启mysqld服务

          # 重启msyql服务
          systemctl restart mysqld
          

          4、记录和跟踪测试

          如果是root登录,不会记录信息。

          # 使用 mysqlbinlog 工具读取名为 binlog.000001 的二进制日志文件
          ## --start-datetime 和 --stop-datetime 参数分别指定了要搜索的时间范围,即从 2018 年 4 月 12 日 16:53:00 开始,到 2018 年 4 月 12 日 16:55:00 结束
          ## -i 参数表示忽略大小写
          ## grep -B 20 显示匹配的前20行
          mysqlbinlog --start-datetime='2018-04-12 16:53:00' --stop-datetime='2018-04-12 16:55:00' binlog.000001 |grep -i '关键字' -B 20
          

          MYSQL8安全之审计管理,image.png,第10张
          MYSQL8安全之审计管理,image.png,第11张
          MYSQL8安全之审计管理,image.png,第12张

          -- 查看访问日志表
          slect * from auditdb.accesslog;
          

          MYSQL8安全之审计管理,image.png,第13张