数据库审计方案简介和功能对比

本文介绍数据库审计功能,用户可借此掌握服务器运行状况,阿里云也上架了SQL审计产品。详细阐述了多种实现数据库审计的方式,包括MySQL自带日志功能、数据库插件形式、旁路机制,并对这些方式进行了功能上的详细对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库审计方案简介和功能对比

通过数据库审计的功能,用户可以准实时的掌握当前服务器的运行状况,包括:热点表,热点数据,用户访问情况,请求方式,数据库响应时间,客户端来源IP等。阿里云在前段时间也上架了自己的SQL审计产品,供用户选择购买此项服务。实现数据库审计的方式也是多种多样,包括:MySQL普通/慢日志,数据库审计插件,网络捕获。本文将会对这些方式进行功能上的详细对比。

1. MySQL自带日志功能

MySQL可以通过开启普通日志,或者将慢日志开启的方式进行审计。

1.1 普通日志

开启普通日志来进行SQL审计的方式非常简单,这是MySQL所有分支都支持的功能,如下:

set global general_log=1;

general log可以选择保存在文件中,也可以选择保存在表中,可以通过如下参数进行设置:

log_output = 'file'  //报存在文件中
log_output = 'table' //保存到表中

在文件中的输出格式为

2019-06-12T14:25:54.306179+08:00	 4620 Query	SELECT c FROM sbtest1 WHERE id=8866695
2019-06-12T14:25:54.306223+08:00	 4622 Query	SELECT c FROM sbtest1 WHERE id=9972289
2019-06-12T14:25:54.306274+08:00	 4667 Query	DELETE FROM sbtest1 WHERE id=10090252
2019-06-12T14:25:54.304255+08:00	 4644 Query	SELECT c FROM sbtest1 WHERE id=9977380
2019-06-12T14:25:54.305245+08:00	 4638 Query	SELECT c FROM sbtest1 WHERE id=10008275
2019-06-12T14:25:54.306325+08:00	 4630 Query	SELECT c FROM sbtest1 WHERE id=10044671
2019-06-12T14:25:54.305315+08:00	 4616 Query	SELECT SUM(K) FROM sbtest1 WHERE id BETWEEN 10031041 AND 10031140
2019-06-12T14:25:54.306345+08:00	 4615 Query	SELECT c FROM sbtest1 WHERE id BETWEEN 14539431 AND 14539530 ORDER BY c
2019-06-12T14:25:54.306360+08:00	 4614 Query	SELECT c FROM sbtest1 WHERE id=9953983
2019-06-12T14:25:54.306373+08:00	 4646 Query	SELECT c FROM sbtest1 WHERE id=10098988

在表中的输出格式为

mysql> select * from general_log limit 100,10;
+----------------------------+-------------------------------------+-----------+-----------+--------------+-----------------------------------------+
| event_time                 | user_host                           | thread_id | server_id | command_type | argument                                |
+----------------------------+-------------------------------------+-----------+-----------+--------------+-----------------------------------------+
| 2019-05-22 11:28:23.640542 | [sysbench] @  [100.110.0.8]         |    127625 |  11013308 | Connect      | sysbench@100.110.0.8 on d1 using TCP/IP |
| 2019-05-22 11:28:23.640549 | [sysbench] @  [100.110.0.8]         |    127623 |  11013308 | Connect      | sysbench@100.110.0.8 on d1 using TCP/IP |
| 2019-05-22 11:28:23.640573 | sysbench[sysbench] @  [100.110.0.8] |    127569 |  11013308 | Query        | BEGIN                                   |
| 2019-05-22 11:28:23.640585 | sysbench[sysbench] @  [100.110.0.8] |    127571 |  11013308 | Query        | BEGIN                                   |
| 2019-05-22 11:28:23.640565 | [sysbench] @  [100.110.0.8]         |    127626 |  11013308 | Connect      | sysbench@100.110.0.8 on d1 using TCP/IP |
| 2019-05-22 11:28:23.640574 | [sysbench] @  [100.110.0.8]         |    127627 |  11013308 | Connect      | sysbench@100.110.0.8 on d1 using TCP/IP |
| 2019-05-22 11:28:23.640589 | [sysbench] @  [100.110.0.8]         |    127629 |  11013308 | Connect      | sysbench@100.110.0.8 on d1 using TCP/IP |
| 2019-05-22 11:28:23.640598 | [sysbench] @  [100.110.0.8]         |    127628 |  11013308 | Connect      | sysbench@100.110.0.8 on d1 using TCP/IP |
| 2019-05-22 11:28:23.640639 | sysbench[sysbench] @  [100.110.0.8] |    127554 |  11013308 | Query        | SELECT c FROM sbtest1 WHERE id=10801288 |
| 2019-05-22 11:28:23.640639 | sysbench[sysbench] @  [100.110.0.8] |    127560 |  11013308 | Query        | SELECT c FROM sbtest1 WHERE id=9712647  |
+----------------------------+-------------------------------------+-----------+-----------+--------------+-----------------------------------------+

1.2 通过慢日志

慢日志本身的目的是为了记录存在性能问题的SQL,但是通过参数设置也可以用来进行审计的功能,如下:

set global min_examined_row_limit = 0;
set global log_queries_not_using_indexes=on;
set global long_query_time=0;
set global log_slow_admin_statements = 0;
set global slow_query_log = on;

输出日志格式为:

# Time: 2019-06-17T10:34:58.064103+08:00
# User@Host: root[root] @ localhost []  Id:     7
# Query_time: 0.000534  Lock_time: 0.000216 Rows_sent: 1  Rows_examined: 1
SET timestamp=1560738898;
select * from test_order_by_limit limit 1;
# Time: 2019-06-17T10:34:59.668562+08:00
# User@Host: root[root] @ localhost []  Id:     7
# Query_time: 0.000726  Lock_time: 0.000235 Rows_sent: 10  Rows_examined: 10
SET timestamp=1560738899;
select * from test_order_by_limit limit 10;

2. 数据库插件形式

通过MySQL插件,进行用户操作的审计,包括Oracle MySQL企业版,MariaDB/Percona分支中的审计插件。

2.1 Oracle MySQL 企业版审计插件

//安装
install plugin audit_log soname 'audit_log.so';

提供的参数(最新版本可能添加了更多的参数)

mysql> show global variables like '%audit%';
+-----------------------------+--------------+
| Variable_name               | Value        |
+-----------------------------+--------------+
| audit_log_buffer_size       | 1048576      |
| audit_log_connection_policy | ALL          |
| audit_log_current_session   | OFF          |
| audit_log_exclude_accounts  |              |
| audit_log_file              | audit.log    |
| audit_log_flush             | OFF          |
| audit_log_format            | NEW          |
| audit_log_include_accounts  |              |
| audit_log_policy            | ALL          |
| audit_log_rotate_on_size    | 0            |
| audit_log_statement_policy  | ALL          |
| audit_log_strategy          | ASYNCHRONOUS |
+-----------------------------+--------------+
12 rows in set (0.00 sec)

目前下载到的版本的记录的数据格式为xml形式,如下:

<AUDIT_RECORD>
  <TIMESTAMP>2019-06-13T01:47:55 UTC</TIMESTAMP>
  <RECORD_ID>138_2019-06-13T01:23:29</RECORD_ID>
  <NAME>Query</NAME>
  <CONNECTION_ID>1912</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>sysbench[sysbench] @  [100.110.0.8]</USER>
  <OS_LOGIN/>
  <HOST/>
  <IP>100.110.0.8</IP>
  <COMMAND_CLASS>select</COMMAND_CLASS>
  <SQLTEXT>SELECT c FROM sbtest1 WHERE id=11469792</SQLTEXT>
 </AUDIT_RECORD>

2.2 Percona插件

Percona的MySQL分支中自带了审计插件,但是测试发现,其并不兼容Oracle MySQL,所以本文不在过多描述。

2.3 MariaDB插件

MariaDB的审计插件是完全兼容Oracle MySQL版本的。可以通过如下命令进行插件安装:

mysql> install plugin server_audit soname 'server_audit.so';
Query OK, 0 rows affected (0.00 sec)

通过全局变量控制是否开启审计日志

set global server_audit_logging = ON;

日志默认输出到datadir下,格式为

20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4726,74697,QUERY,d1,'SELECT c FROM sbtest1 WHERE id BETWEEN 10094876 AND 10094975',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4751,74723,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=10036027',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4768,74750,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=10089548',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4718,74628,QUERY,d1,'SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN 9975155 AND 9975254 ORDER BY c',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4752,74680,QUERY,d1,'SELECT SUM(K) FROM sbtest1 WHERE id BETWEEN 10054577 AND 10054676',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4753,74728,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=7355484',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4773,74755,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=10081613',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4751,74757,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=9982230',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4727,74734,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=10077292',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4749,74691,QUERY,d1,'SELECT c FROM sbtest1 WHERE id=10059306',0
20190612 14:45:27,100-110-0-9,sysbench,100.110.0.8,4741,74711,QUERY,d1,'UPDATE sbtest1 SET k=k+1 WHERE id=10148860',0

3. 旁路机制

通过抓取网络请求,再根据MySQL协议解析出想要的数据。

3.1 vc-mysql-sniffer

这是一家位于美国华盛顿的数据库性能监控服务公司提供的产品,并不开源,但是二进制版本的程序可以在官网下载使用。

使用方式

./vc-mysql-sniffer -binding="[::]:13308" -show-database-changes="true" -output="/data/sniffer.log"

其功能是捕获MySQL的网络数据包,并解析成SQL语句,可以报存在文件中。
其输出的日志格式如下

# Time: 052319 10:32:53.354677
# User@Host: unknown_user[unknown_user] @ 100.110.0.8:63967 []
# Query_time: 0.000000
USE `unknown_database`

他们有配套的dashboard用来展示监控数据,但是官网没有提供下载。
在这里插入图片描述

3.2 奇虎360开源产品mysql-sniffer

MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer 端或 Client 端请求,并格式化输出。输出内容包括访问时间、访问用户、来源 IP、访问 Database、命令耗时、返回数据行数、执行语句等。有批量抓取多个端口,后台运行,日志分割等多种使用方式,操作便捷,输出友好。
如下:

mysql-sniffer -i eth0 -p 3306
2017-02-23 14:47:45	 testuser	 10.xx.xx.xx	 NULL	          0ms	          1	 select @@version_comment limit 1
2017-02-23 14:47:45	 testuser	 10.xx.xx.xx	 NULL	          0ms	          1	 select USER()
2017-02-23 14:47:48	 testuser	 10.xx.xx.xx	 NULL	          0ms	         13	 show databases
2017-02-23 14:47:51	 testuser	 10.xx.xx.xx	 NULL	          0ms	          1	 SELECT DATABASE()
2017-02-23 14:47:51	 testuser	 10.xx.xx.xx	 mysql	          0ms	          0	 use mysql
2017-02-23 14:47:53	 testuser	 10.xx.xx.xx	 mysql	          0ms	         29	 show tables
2017-02-23 14:47:54	 testuser	 10.xx.xx.xx	 mysql	          0ms	          1	 select 1
2017-02-23 14:48:01	 testuser1	 10.xx.xx.xx	 NULL	          0ms	          0	 set autocommit=1
2017-02-23 14:48:01	 testuser1	 10.xx.xx.xx	 NULL	          0ms	          0	 set autocommit=1

4. 功能对比

方式数据格式是否开源是否记录SQL时间消耗是否记录用户是否记录来源IP是否记录数据库是否记录错误
general log文本
slow log文本
Oracle企业版审计插件xml/json
MariaDB审计插件文本字符串
vc-mysql-sniffer文本是*
奇虎360 mysql-sniffer文本是*
### 开源数据库审计产品对比 #### 1. **pgAudit (PostgreSQL)** ##### 特点 pgAudit 是专门为 PostgreSQL 设计的一个扩展工具,用于提供详细的会话级对象级的审计功能。该工具能够记录所有的查询操作以及对特定表的操作详情。 - 支持细粒度控制,允许管理员定义哪些类型的事件应该被记录。 - 提供灵活的日志格式配置选项,可以根据需求调整日志的内容结构[^1]。 ##### 优点 - 集成良好:作为官方支持的插件之一,与 PostgreSQL 的兼容性稳定性非常高。 - 性能影响较小:由于其高效的实现方式,在启用 pgAudit 后不会显著降低数据库的整体性能。 ##### 缺点 - 功能局限:主要针对 PostgreSQL 数据库,对于其他类型的数据库不适用。 - 日志管理复杂:随着日志量的增长,管理分析这些大量的日志文件可能变得困难。 #### 2. **MariaDB Audit Plugin** ##### 特点 MariaDB 官方提供的审计插件,适用于 MariaDB MySQL 数据库服务器。它提供了全面的安全审核能力,包括连接、查询执行等多个层面的信息收集。 - 可以捕获到所有客户端发出的命令及其参数,便于追踪潜在的安全威胁。 - 支持自定义规则设置,使得用户可以根据实际业务场景定制化审计策略[^2]。 ##### 优点 - 广泛适配:不仅限于 MariaDB,同样可以在基于 MySQL 的环境中运行。 - 易于部署:安装过程简单快捷,几乎不需要额外配置即可投入使用。 ##### 缺点 - 资源消耗较高:当启用了详尽级别的日志记录时,可能会占用较多磁盘空间并增加 I/O 压力。 - 实时性不足:某些情况下可能存在一定的延迟,无法立即反映最新的活动状态。 #### 3. **Percona Audit Log Plugin** ##### 特点 专为 Percona Server for MySQL 打造的一款高性能审计解决方案。除了基本的功能外,还增加了更多高级特性如 SSL/TLS 加密通信的支持等。 - 记录完整的 SQL 文本,方便后续审查人员理解具体的语句含义。 - 对敏感字段进行了特殊处理,防止泄露重要信息的同时不影响正常的审计流程[^3]。 ##### 优点 - 安全性强:内置加密机制保障传输过程中数据的安全;同时具备强大的权限管理体系。 - 效率高:经过优化后的架构设计减少了不必要的开销,提高了系统的响应速度。 ##### 缺点 - 学习曲线陡峭:初次接触此工具的新手可能需要花费一定时间去熟悉各项配置项。 - 社区活跃度一般:相较于前两者而言,围绕这款产品的讨论技术交流相对较少一些。 ```sql -- 示例SQL展示如何查看某个具体时间段内的登录失败次数(假设使用的是MySQL/MariaDB) SELECT COUNT(*) AS fail_count FROM mysql.general_log WHERE event_time BETWEEN 'start_date' AND 'end_date' AND argument LIKE '%Access denied%'; ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值