达梦数据库的审计功能

在日常数据库运维中,有时候我们需要追溯到某个数据变更的来源:是谁在什么时间、从哪个客户端执行了什么操作?在没有审计的情况下,这类问题往往难以回答。达梦数据库内置了一套灵活且完善的审计子系统,本文将从设计理念出发,结合实例演示,带你全面掌握达梦审计的使用方法。

一、审计的价值

数据库审计的核心价值体现在三个层面:

  • 合规要求:诸多行业法规明确要求对核心业务数据库开启审计,如涉及薪资、财务等敏感数据的场景;
  • 安全监控:通过审计记录发现异常的数据库访问行为和潜在入侵;
  • 事件追溯:当数据被误删或恶意篡改时,能够快速定位责任人及操作细节。

注意:审计功能会消耗数据库服务器资源,对性能有一定影响,需根据现场实际情况制定合理的审计规则,避免过度审计。

二、审计的设计

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,在性能和安全之间取得平衡。

九、最佳实践与注意事项

  1. 按需审计,避免全开:只对核心业务表和敏感操作配置审计,避免审计日志过快膨胀影响数据库性能。
  2. 独立存储审计文件:建议通过 AUD_PATH 参数将审计文件存放到独立磁盘,既能保证写入性能,也能防止审计文件占用数据磁盘空间。
  3. 定期清理过期日志:结合系统过程 SP_DROP_AUDIT_FILE 或定时脚本,保留 30 天左右的审计记录即可,避免磁盘空间被撑满。
  4. 高安全场景开启实时审计:对于安全要求极高的环境(如金融核心系统),可以将审计开关设置为 2,同时开启实时审计的侵害检测功能。
  5. 严格区分管理角色:坚持使用 SYSAUDITOR 进行审计操作,SYSDBA 和 SYSSSO 不应参与审计活动,确保三权分立机制的有效性。
  6. 定期备份审计记录:审计记录本身也是重要的合规证据,建议纳入数据库备份策略中。

十、总结

达梦数据库的审计功能通过系统级、语句级、对象级三层架构,实现了从宏观系统事件到微观列级操作的全面审计覆盖。配合三权分立的安全机制和灵活的空间管理策略,能够满足各类合规场景下的审计需求。

在实际使用中,关键是要根据业务场景制定合理的审计策略:核心数据表开启对象级审计以精确追溯,敏感操作开启语句级审计以全面监控,系统事件则由系统级审计自动记录。审计功能虽是消耗资源的“成本中心”,但一旦发生安全事故或合规审查,审计记录的价值便无可替代——它是数据库安全的最后一道防线。

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇