1、建设目标
在等级保护三级->应用安全->安全审计中强制需要有审计平台(满足对操作系统、数据库、网络设备的审计,在条件不允许的情况下,至少要使用数据库审计)
数据库审计服务符合等级保护三级标准,帮助您满足合规性要求,包括但不限于:
-  中国银监会、工业和信息化部、公安部、国家互联网信息办公室制定的《网络借贷信息中介机构业务活动管理暂行办法》中第十八条指出需要进行信息安全检查和审计。 
-  网络安全法 -  第二十一条 (三)采取监测、记录网络运行状态、网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月。 
-  第三十八条 关键信息基础设施的运营者应当自行或者委托网络安全服务机构对其网络的安全性和可能存在的风险每年至少进行一次检测评估,并将检测评估情况和改进措施报送相关负责关键信息基础设施安全保护工作的部门。 
 
-  
-  等保三级数据库审计功能要求如下表: 
| 数据库安全审计 | 等保三级 | a) 审计范围应覆盖到服务器和 重要客户端上的每个操作系统用户和数据库用户; | 
| b) 审计内容应包括重要用户行为、 系统资源的异常使用和重要系统命令的使用等系统内重要的安全相关事件; | ||
| c) 审计记录应包括事件的日期、时间、类型、主体标识、客体标识和结果等; | ||
| d) 应能够根据记录数据进行分析,并生成审计报表; | ||
| e) 应保护审计进程,避免受到未预期的中断; | ||
| f) 应保护审计记录,避免受到未预期的删除、修改或覆盖等。 | 
2、工作原理
数据库审计服务通过插件监听模式,在较小影响数据库日常运行效能的前提下,实现灵活的审计与监控。
-  基于数据库操作语句进行审计,监视数据库登录、访问行为,有效地实施审计策略。数据库审计服务还具备强大的数据库活动审计分析能力,从多个角度灵活呈现数据库的活动状态,帮助您有效执行安全策略。 
3、使用的开源工具及组件
-  Mariadb新版自带server_audit 审计插件 
-  Rsyslog服务(omkafka、omfwd模块) 
-  kafka服务(logstash可选) 
-  Elasticsearch 
4、整体架构图

SQL记录架构图
5、开始部署
5.1、安装插件server_audit 插件
进入数据库,使用下列语句启用插件
> INSTALL PLUGIN server_audit SONAME'server_audit.so';或者编辑/etc/my.cnf添加
[mysqld]plugin-load=server_audit=server_audit.so
查看插件安装情况
> show variables like 'server_au%';打开日志的审计功能
> set global server_audit_logging=on;查看audit插件的运行状态:
> show global status like '%audit%';server_audit_active :ON (表示server_audit插件在运行);
server_audit_current_log : server_audit.log(审计日志路径和日志名);
server_audit_last_error : 错误消息;
server_audit_writes_failed : 因错误没有记录的日志条目数
设置审计日志记录位置
# mkdir /var/log/mysql/# chown mysql.mysql /var/log/mysql/ -R
设置变量(设置完即生效)
> set GLOBAL server_audit_events='CONNECT,QUERY,TABLE';> set GLOBAL server_audit_excl_users='root';> set GLOBAL server_audit_file_rotate_size=1073741824; (单位:字节)> set GLOBAL server_audit_file_rotations=10;> set global server_audit_file_rotate_now=ON;> set global server_audit_logging=on;> set global server_audit_file_path='/var/log/mysql/server_audit.log';
设置永久生效 在/etc/my.cnf的[mysqld]段添加上下面的内容
# audit plugin settings
plugin-load = server_audit.soserver_audit = FORCE_PLUS_PERMANENTserver_audit_events = 'CONNECT,QUERY,TABLE'server_audit_logging = ONserver_audit_file_rotations=10server_audit_file_rotate_size =200Mserver_audit_excl_users='root'server_audit_file_path = /var/log/mysql/server_audit.log
审计参数说明
server_audit_output_type:指定日志输出类型,可为SYSLOG或FILEserver_audit_logging:启动或关闭审计server_audit_events:指定记录事件的类型,可以用逗号分隔的多个值(connect,query,table),如果开启了查询缓存(query cache),查询直接从查询缓存返回数据,将没有table记录server_audit_file_path:如server_audit_output_type为FILE,使用该变量设置存储日志的文件,可以指定目录,默认存放在数据目录的server_audit.log文件中server_audit_file_rotate_size:限制日志文件的大小server_audit_file_rotations:指定日志文件的数量,如果为0日志将从不轮转server_audit_file_rotate_now:强制日志文件轮转server_audit_incl_users:指定哪些用户的活动将记录,connect将不受此变量影响,该变量比server_audit_excl_users优先级高server_audit_excl_users:该列表的用户行为将不记录,connect将不受该设置影响server_audit_syslog_facility:默认为LOG_USER,指定facilityserver_audit_syslog_ident:设置ident,作为每个syslog记录的一部分server_audit_syslog_info:指定的info字符串将添加到syslog记录server_audit_syslog_priority:定义记录日志的syslogd priorityserver_audit_mode:标识版本,用于开发测试
注意!为了防止server_audit插件被卸载,需要在配置文件中添加:
[mysqld]server_audit=FORCE_PLUS_PERMANENT
5.2、卸载server_audit审计插件
> UNINSTALL PLUGIN server_audit;> show variables like '%audit%'; 验证是否卸载完
卸载的步骤:
1、需要先在配置文件里把server_audit相关的配置项目注释掉,再重启mariadb。
2、再来执行UNINSTALL PLUGIN server_audit;才能卸载掉这个插件。
3、卸载插件完成后,执行show variables like '%audit%';仍然能看到这个插件的可用参数,再次重启mariadb才行。
5.3、设置审计日志记录到rsyslog
> SET GLOBAL server_audit_output_type=SYSLOG;#表示成功
> show global status like '%audit%';| server_audit_current_log | [SYSLOG] |> show variables like 'server_au%';| server_audit_output_type | syslog |
配置rsyslog服务
# /etc/init.d/rsyslog restart
然后连接到mysql执行些数据库、表的操作,可以tail -f /var/log/message里面看到操作的内容。
默认的操纵日志都打在/var/log/message里面,不方便我们查看,可以修改下/etc/rsyslog.conf,
添加syslog-client端采集日志到syslog-server端
vi /etc/rsyslog.d/mysql_audit.conf# template$template mysql_adit_fwd, "%rawmsg%"if $programname == ["mysql-server_auditing"] then {action(type="omfwd"Protocol="udp"Target="192.168.10.27"Port="5514"template="mysql_adit_fwd"queue.type="linkedList"queue.spoolDirectory="/tmp"queue.fileName="remoteQueue_nginx_waf"queue.maxDiskSpace="5g"queue.saveOnShutdown="on"queue.workerThreads="4")stop}
# /etc/init.d/rsyslog restart 重启rsyslog服务
配置远程接收rsyslog-server端日志服务器,将日志写到kafka
vi /etc/rsyslog.d/mysql_audit.conf# template$template mysql_audit_output, "%rawmsg%\n"# rulesetruleset(name="mysql_audit") {action(type="omkafka"template="mysql_audit_output"broker=["192.168.10.8:9092","192.168.10.9:9092","192.168.10.15:9092"]partitions.auto="on"topic="elk-mysql-audit-log"dynatopic="off"resubmitOnFailure="on"keepFailedMessages="on"confParam=["batch.num.messages=1","queue.buffering.max.ms=100"]queue.spoolDirectory="/tmp"queue.filename="mysql_audit_kafka"queue.size="360000"queue.maxdiskspace="2G"queue.highwatermark="216000"queue.discardmark="350000"queue.type="LinkedList"queue.dequeuebatchsize="4096"queue.timeoutenqueue="0"queue.maxfilesize="10M"queue.saveonshutdown="on"queue.workerThreads="4")stop}# 定义消息来源及设置相关的actioninput(type="imudp" port="5514" ruleset="mysql_audit")
5.4、其它配置请参考其它文档
-  配置Kafaka 
-  配置Elasticsearch 
-  配置Kibana 
至此基本的数据库审计收集完毕,能够简单应付过等保审核(有开发条件者,可扩充以下功能)
1、可配合Elasticsearch 开发SQL审计规则,实现自动化审计不合规语句、异常SQL语句等。
2、可配合https://github.com/cookieY/Yearning 平台实现,SQl审计、审核全功能