在日常数据库运维中,有时候我们需要追溯到某个数据变更的来源:是谁在什么时间、从哪个客户端执行了什么操作?在没有审计的情况下,这类问题往往难以回答。达梦数据库内置了一套灵活且完善的审计子系统,本文将从设计理念出发,结合实例演示,带你全面掌握达梦审计的使用方法。
一、审计的价值
数据库审计的核心价值体现在三个层面:
- 合规要求:诸多行业法规明确要求对核心业务数据库开启审计,如涉及薪资、财务等敏感数据的场景;
- 安全监控:通过审计记录发现异常的数据库访问行为和潜在入侵;
- 事件追溯:当数据被误删或恶意篡改时,能够快速定位责任人及操作细节。
注意:审计功能会消耗数据库服务器资源,对性能有一定影响,需根据现场实际情况制定合理的审计规则,避免过度审计。
二、审计的设计
DM8 的审计子系统采用了分层设计思想,将审计功能划分为三个关键层级:系统级、语句级和对象级。这种分层设计实现了审计粒度的灵活控制,同时大幅降低了审计功能对数据库性能的影响。
其核心设计原则包括:
- 最小权限原则:审计功能由独立的 SYSAUDITOR 账户管理,与常规 DBA 权限分离;
- 实时性与完整性平衡:通过刷盘策略确保审计记录不丢失;
- 性能优化设计:采用内存缓冲机制减少 I/O 开销;
- 安全存储保障:审计文件加密和空间管理策略防止审计记录被篡改。
三、三权分立与审计员的角色
达梦数据库采用“三权分立”的安全机制,系统内置三类管理员账户,各司其职、互相制约:
数据库管理员:SYSDBA,系统运维、备份恢复、用户创建
数据库安全员:SYSSSO,安全策略制定、权限分配
数据库审计员:SYSAUDITOR,审计配置、审计记录分析
只有数据库审计员才能进行审计操作,数据库管理员和安全员均不能参与审计活动。这一设计有效避免了权限集中于一人所带来的风险,保证了系统的安全性。
四、审计开关
在达梦系统中,审计功能默认关闭,需要由审计员显式开启。审计开关由系统过程 SP_SET_ENABLE_AUDIT 控制,执行后立即生效。
参数取值:
0:关闭审计(缺省值)
1:打开普通审计
2:打开普通审计和实时审计
开启审计(需使用 SYSAUDITOR 用户登录):
-- DM8 开启普通审计
SP_SET_ENABLE_AUDIT(1);
-- 查询审计开关当前状态
SELECT * FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';
当参数值设为 2 时,还将开启实时审计功能。实时审计能够对当前用户的操作进行实时分析,匹配预设的侵害检测规则,确定侵害等级并采取相应的响应措施。
五、三层审计体系详解
5.1 系统级审计:自动生效的全局监控
系统级审计记录的是数据库的启动关闭、版本升级、审计空间不足告警等系统事件。此级别的审计无法也无需由用户设置,只要审计开关打开,就会自动生成对应的审计记录。
系统级审计的典型记录内容包括:
- 数据库系统启动关闭(区分正常退出后启动、异常退出后启动等);
- 审计空间不足告警;
- 数据库版本升级;
- 主备之间 redo 日志传输故障及恢复。
5.2 语句级审计:按 SQL 类型精准捕获
语句级审计针对的是影响特定类型数据库对象的 SQL 语句组,是一种粗粒度的审计方式。例如,AUDIT TABLE 将审计 CREATE TABLE、ALTER TABLE 和 DROP TABLE 等所有表相关的操作。
设置语法:
SP_AUDIT_STMT(TYPE VARCHAR(30), USERNAME VARCHAR(128), WHENEVER VARCHAR(20))
参数说明:
- TYPE:审计选项,如 TABLE、USER、CONNECT、UPDATE TABLE 等
- USERNAME:用户名,NULL 表示不限制
- WHENEVER:审计时机:ALL(全部)、SUCCESSFUL(成功时)、FAIL(失败时)
实用示例:
-- 1. 审计所有用户的登录行为(无论成功或失败)
SP_AUDIT_STMT('CONNECT', 'NULL', 'ALL');
-- 2. 审计所有表结构变更操作
SP_AUDIT_STMT('TABLE', 'NULL', 'ALL');
-- 3. 审计 USER2 用户的所有表修改和删除操作
SP_AUDIT_STMT('UPDATE TABLE', 'USER2', 'ALL');
SP_AUDIT_STMT('DELETE TABLE', 'USER2', 'ALL');
-- 4. 审计 SYSDBA 创建用户成功的操作
SP_AUDIT_STMT('USER', 'SYSDBA', 'SUCCESSFUL');
TYPE审计选项可查阅手册《DM8安全管理》或直接访问官网对应部分:DM8安全管理-语句级审计。
取消语句级审计(参数必须与设置时完全一致):
SP_NOAUDIT_STMT('TABLE', 'NULL', 'ALL');
5.3 对象级审计:精细到表、视图乃至列级别
对象级审计是细粒度的审计方式,可以对某张具体表、某个视图甚至某一列上的特定操作进行审计。
设置语法:
SP_AUDIT_OBJECT(
TYPE VARCHAR(30), -- 操作类型:INSERT、UPDATE、DELETE、SELECT、ALL 等
USERNAME VARCHAR(128), -- 用户名,NULL 表示不限制
SCHNAME VARCHAR(128), -- 模式名,空时置 'null'
TVNAME VARCHAR(128), -- 表名/视图名/存储过程名,不能为空
COLNAME VARCHAR(128), -- 列名(可选)
WHENEVER VARCHAR(20) -- 审计时机
)
实用示例:
-- 1. 审计所有用户对 PERSON.ADDRESS 表的 INSERT 和 UPDATE 成功操作
SP_AUDIT_OBJECT('INSERT', 'SYSDBA', 'PERSON', 'ADDRESS', 'SUCCESSFUL');
SP_AUDIT_OBJECT('UPDATE', 'SYSDBA', 'PERSON', 'ADDRESS', 'SUCCESSFUL');
-- 2. 审计 DMTEST 模式下 TEST 表的所有 DML 操作
SP_AUDIT_OBJECT('ALL', 'NULL', 'DMTEST', 'TEST', 'ALL');
-- 3. 审计对特定表 T1 的删除操作
SP_AUDIT_OBJECT('DELETE', 'NULL', 'TEST', 'T1', 'SUCCESSFUL');
取消对象级审计(参数必须与设置时完全一致):
SP_NOAUDIT_OBJECT('INSERT', 'SYSDBA', 'PERSON', 'ADDRESS', 'SUCCESSFUL');
审计配置的规则存储在数据字典表 SYSAUDITOR.SYSAUDIT 中,可通过以下语句查看当前所有审计设置:
SELECT * FROM SYSAUDITOR.SYSAUDIT;
六、审计记录的查看与分析
达梦提供了两种方式查看审计记录。
6.1 动态视图查询(推荐日常使用)
-- 查询所有审计记录
SELECT * FROM SYSAUDITOR.V$AUDITRECORDS;
-- 按用户和操作类型筛选
SELECT USERNAME, OPERATION, SQL_TEXT, OPTIME
FROM SYSAUDITOR.V$AUDITRECORDS
WHERE SCHNAME = 'TEST' AND OBJNAME = 'T1';
V$AUDITRECORDS 视图中记录了用户 ID、用户名、IP 地址、操作时间、SQL 文本等关键信息。
6.2 DM 审计分析工具(Analyzer)
达梦还提供了图形化的审计分析工具,位于安装目录的 tool 子目录下:
使用 SYSAUDITOR 用户登录后,双击“审计日志查看器”,选择审计日志文件即可进行筛选、排序等分析操作。
6.3 审计文件的存放位置
计文件默认存放在数据库的 SYSTEM_PATH 指定的路径下(即数据库所在路径)。也可以通过配置 AUD_PATH 参数将其指定到独立的存储磁盘上,以避免与数据文件抢占空间。
七、审计文件的空间管理
随着数据库运行,审计记录会不断增长,必须做好空间管理。达梦提供了几个关键的 INI 参数:
AUDIT_SPACE_LIMIT:审计文件总存储空间上限,缺省值8192,单位MB。
AUDIT_MAX_FILE_SIZE:单个审计文件大小上限,缺省值100,单位MB。
当单个审计文件超过指定大小时,系统会自动创建新的审计文件,审计记录将写入新文件中。
7.1 空间满的处理策略
通过 AUDIT_FILE_FULL_MODE 参数配置空间不足时的处理策略:
- 1:审计文件创建失败,卡住
- 2:审计文件创建失败,不再审计
- 3:结合 1 和 2,先尝试删老审计文件,再创建审计文件,失败则不再审计
7.2 审计文件的清理
可使用系统过程手动清理过期的审计文件:
-- 删除 2025-01-01 之前的审计文件
SP_DROP_AUDIT_FILE('2025-01-01 00:00:00', 0);
-- 删除所有旧的审计文件(保留当前正在使用的)
SP_DROP_AUDIT_FILE(SYSDATE, 0);
TIME_STR:指定的时间字符串
TYPE:审计文件类型,0 表示删除普通审计文件,1 表示删除实时审计文件
注意:不要在操作系统层面直接删除审计文件,否则需重启数据库才能恢复审计功能。
八、审计刷盘策略:性能与安全的平衡
达梦提供了三种审计记录的刷盘模式,由动态参数 AUDIT_FLUSH_LEVEL 控制:
- 0:语句级刷盘,一条语句执行结束进行一次审计记录刷盘操作;
- 1:事务级刷盘,一个事务执行结束执行一次审计日志刷盘操作;
- 2:延迟刷盘,审计记录缓存满时(缓存大小固定为8MB)自动刷盘
对于高并发场景,建议设置为 1 或 2,在性能和安全之间取得平衡。
九、最佳实践与注意事项
- 按需审计,避免全开:只对核心业务表和敏感操作配置审计,避免审计日志过快膨胀影响数据库性能。
- 独立存储审计文件:建议通过
AUD_PATH参数将审计文件存放到独立磁盘,既能保证写入性能,也能防止审计文件占用数据磁盘空间。 - 定期清理过期日志:结合系统过程
SP_DROP_AUDIT_FILE或定时脚本,保留 30 天左右的审计记录即可,避免磁盘空间被撑满。 - 高安全场景开启实时审计:对于安全要求极高的环境(如金融核心系统),可以将审计开关设置为 2,同时开启实时审计的侵害检测功能。
- 严格区分管理角色:坚持使用 SYSAUDITOR 进行审计操作,SYSDBA 和 SYSSSO 不应参与审计活动,确保三权分立机制的有效性。
- 定期备份审计记录:审计记录本身也是重要的合规证据,建议纳入数据库备份策略中。
十、总结
达梦数据库的审计功能通过系统级、语句级、对象级三层架构,实现了从宏观系统事件到微观列级操作的全面审计覆盖。配合三权分立的安全机制和灵活的空间管理策略,能够满足各类合规场景下的审计需求。
在实际使用中,关键是要根据业务场景制定合理的审计策略:核心数据表开启对象级审计以精确追溯,敏感操作开启语句级审计以全面监控,系统事件则由系统级审计自动记录。审计功能虽是消耗资源的“成本中心”,但一旦发生安全事故或合规审查,审计记录的价值便无可替代——它是数据库安全的最后一道防线。