数据库审计平台(简称DB Audit),实时记录用户操作数据库的行为,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行实时告警。通过对用户访问数据库行为记录、分析和汇报,来帮助DBA事后生成合规报告、事故追根溯源,同时通过搜索技术提供高效查询审计报告,定位事件原因,以便日后查询、分析、过滤,实现加强内外部数据库网络行为的监控与审计,提高数据资产安全。
目前有两种技术方案。
第一种:是部署在数据库服务器的所在网络,采用旁路监听方式截取用户访问数据库的TCP头报文,该系统是由数据采集、数据处理和安全检测三个模块组成。
第二种:依赖于开启Percona Audit Plugin插件的审计方法,存在的弊端是数据库审计功能的开启会影响数据库本身的性能、审计日志以txt文本格式存放在本地磁盘里,对于审计数据的挖掘和迅速定位是个棘手的问题。
在Percona 8.0 版本里,可以通过使用Rsyslog日志系统将审计日志汇总至一台专用的MySQL数据库里,并且我们可以自定义事件记录。比如我们想追溯某时刻谁误删除了数据这一需求,那么我们可以禁止记录select查询操作,然后借助Loganalyzer做展示,架构如下图所示。
注:Loganalyzer是一款syslog日志和其他网络事件数据的Web前端。它提供了对日志的简单浏览、搜索、基本分析和一些图表报告的功能。
审计日志数据从专用存放syslog的数据库中获取,所以LogAnalyzer不需要改变现有的架构。通过对数据库的SQL语义分析,提取出SQL中相关的要素(用户、SQL操作、表、字段、时间)实时监控来自各个层面的所有数据库活动(包括来自应用系统发起的数据库操作请求、来自数据库客户端工具的操作请求以及通过远程登录服务器后的操作请求等)。使管理人员对用户的行为一目了然,真正做到数据库操作行为可监控,违规操作可追溯。
本文以第二种方案介绍,借助LogAnalyzer打造轻量级数据库审计日志平台。
环境概述
一、MySQL 8.0主库安装Percona Audit Plugin插件
1)要启用MySQL 8.0主库节点的审计,我们首先需要将Percona8.0审计插件audit_log.so文件复制到每个服务器的插件目录中,然后我们可以在所有节点上加载插件。
代码语言:javascript复制mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
2)配置审计插件
Percona审计插件还支持使用Rsyslog来记录事件。Rsyslog本身为我们提供了很多选项,其中之一是将日志条目转发到远程Rsysog进程。为了能够使用本地syslog,我们需要更改参数变量 audit_log_handler 的值。
代码语言:javascript复制mysql> SET GLOBAL audit_log_handler = 'SYSLOG';
注:audit_log_handler不支持动态修改,需要写死在my.cnf配置文件里,并重启mysqld进程生效。
3)由于我们只想转发由Percona审计插件创建的syslog日志,我们将使用变量 audit_log_syslog_facility 来为syslog配置过滤器。
代码语言:javascript复制mysql> SET GLOBAL audit_log_syslog_facility = 'LOG_LOCAL6';
注:audit_log_syslog_facility不支持动态修改,需要写死在my.cnf配置文件里,并重启mysqld进程生效。
4)我们想追溯某时刻谁误删除误更改了数据这一需求,那么我们可以禁止记录select查询操作。
我们需要更改参数变量 audit_log_policy 和audit_log_include_commands 的值。
代码语言:javascript复制mysql> SET GLOBAL audit_log_policy = 'QUERIES';
mysql> SET GLOBAL audit_log_include_commands ='drop_db,drop_table,update,delete';
这里只会记录增删改、DDL操作。
注:如果想额外记录用户的其他操作行为,可以通过下面的SQL获取到可用的命令类型。
代码语言:javascript复制mysql> SELECT name FROM performance_schema.setup_instruments WHERE name LIKE "statement/sql/%" ORDER BY name;
现在为 Percona 审计插件已经配置完毕。我们现在可以启用审计,但它只会写入本地系统日志/var/log/messages文件里,无法推送远程专用存放syslog审计日志的MySQL数据库服务器里。
二、MySQL 8.0主库配置Rsyslog使用ommysql模块
1)安装Rsyslog连接至MySQL的驱动模块
代码语言:javascript复制Shell> yum install rsyslog-mysql -y
2) 配置Rsyslog使用ommysql模块,将所期望的日志信息记录于MySQL数据库中。
代码语言:javascript复制Shell> vim /etc/rsyslog.conf
#### MODULES ####
......
$ModLoad imudp #加载udp的模块
$UDPServerRun 514 #允许接收udp 514的端口传来的日志
$ModLoad imtcp #加载tcp的模块
$InputTCPServerRun 514 #允许接收tcp 514的端口传来的日志
$ModLoad ommysql #加载mysql的模块
3) 配置RULES,将所期望的日志信息记录于专用存放syslog审计日志的MySQL数据库服务器。
代码语言:javascript复制Shell> vim /etc/rsyslog.conf
#### RULES ####
$ActionOmmysqlServerPort 3306
local6.* :ommysql:192.168.198.239,Syslog,rsyslog,rsyslogpass
注:192.168.198.239这个IP是syslog审计日志MySQL服务器地址
3306是MySQL端口号
ryslog是库名
ryslog是用户名
rsyslogpass是密码
4) 重启rsyslog服务
代码语言:javascript复制Shell> systemctl restart rsyslog
三、准备一台专用存放syslog审计日志的MySQL数据库服务器
1)在专用存放syslog审计日志的MySQL数据库准备syslog的用户账号
代码语言:javascript复制mysql> CREATE USER 'rsyslog'@'%' IDENTIFIED BY 'rsyslogpass';
mysql> GRANT ALL ON Syslog.* TO 'rsyslog'@'%';
2)安装Rsyslog连接至MySQL的驱动模块
代码语言:javascript复制Shell> yum install rsyslog-mysql -y
3)生成存放syslog数据的库和表
代码语言:javascript复制Shell> rpm -ql rsyslog-mysql /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
Shell> mysql -h127.0.0.1 -ursyslog -prsyslogpass < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
至此rsyslog服务已经配置完毕。在MySQL/MariaDB主库上执行增删改、DDL操作,就会把审计日志推送至syslog审计日志MySQL服务器的Syslog库systemevents表里。
四、准备LAMP环境,运行web可视化日志分析软件
LogAnalyzer,可与专用存放syslog审计日志的MySQL数据库服务器部署在一起。
1)安装web可视化的日志分析软件loganalyzer
代码语言:javascript复制Shell> yum -y install httpd php php-mysqlnd php-gd
Shell> systemctl start httpd.service
Shell> cd /var/www/html/
Shell> wget https://download.adiscon.com/loganalyzer/loganalyzer-4.1.12.tar.gz
Shell> tar zxvf loganalyzer-4.1.12.tar.gz
Shell> mv loganalyzer-4.1.12 loganalyzer
Shell> touch loganalyzer-4.1.12/src/config.php
Shell> chmod 755 loganalyzer-4.1.12/src/config.php
2)打开浏览器,配置loganalyzer软件,输入网址
http://yourip/loganalyzer/src/install.php
source type:选MYSQL Native
select view:选Syslog Fields
Table type:选MonitorWare
database host:127.0.0.1
database name:Syslog
database tablename:SystemEvents
database user:syslog database password:写上之前你设定的sysylog用户的数据库密码
最后点Next按钮,完成初始化loganalyer。