达梦数据库-数据库审计01-记录总结
审计机制是安全管理的重要组成部分之一。DM 数据库除了提供数据安全保护措施外,还提供对日常事件的事后审计监督。可以通过它来记录系统级事件、用户行为以及对数据库对象的访问。
本节主要介绍审计文件路径设置,审计开关,语句级审计及示例操作。
1.1审计 文件
审计文件默认存放在数据库的 SYSTEM_PATH 指定的路径(数据库实例路径)。
可在dm.ini文件中添加参数AUD_PATH来指定审计文件路径。
(1)查询默认审计文件存放路径
select PARA_NAME,PARA_VALUE from v$dm_ini where PARA_NAME='SYSTEM_PATH';
--查询审计文件存储空间信息
select * from V$AUDIT_SPACE;

(2)提前创建
mkdir /data/dmdata/DAMENG/aud_pathlog
否则启动时报错

(3)修改dm_ini新增AUD_PATH参数与值
AUD_PATH = /data/dmdata/DAMENG/aud_pathlog #重启生效
1.2审计开关
审计开关由过程SP_SET_ENABLE_AUDIT(param int);控制,过程执行完后会立即生效,param 有三种取值:
0:关闭审计,缺省值0
1:打开普通审计
2:打开普通审计和实时审计
#审计开关必须由具有数据库审计员权限的管理员(如SYSAUDITOR用户)进行设置。
(1)查询审计开关当前值。
SELECT PARA_NAME,PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';
(2)SYSAUDITOR用户开启普通审计
SP_SET_ENABLE_AUDIT(1);
--SYSAUDITOR用户关闭普通审计
SP_SET_ENABLE_AUDIT(0);

(3)数据库服务重启后审计文件存储空间信息
select * from V$AUDIT_SPACE;

--查看审计文件
select * from V$AUDIT_FILE;

--审计相关参数
select PARA_NAME,PARA_VALUE from v$dm_ini where para_name like '%AUDIT%';

1.3审计级别
|-----|---------------------------------------------------|
| 系统级 | 系统启动、关闭、部分系统事件以及一些系统过程和函数的调用,用户不能设置,审计开关打开就会自动生成; |
| 语句级 | 影响特定类型数据库对象的特殊SQL或语句组的审计; 语句级审计不针对特定的对象,只针对用户; |
| 对象级 | 审计作用在特殊对象上的语句。 针对指定用户与指定对象进行审计; |
系统级 :系统级审计无法也无需由用户进行设置,只要审计开关打开就会自动生成对应审计记录。语句级:语句级审计的动作是全局的,不对应具体的数据库对象。
对象级:对象级审计发生在具体的对象上,需要指定模式名以及对象名
**语句序列审计:**语句序列审计需要审计员预先建立审计规则,包含N条SQL语句,如果某个会话执行了这些 SQL语句,就会触发审计。
具体详细参见 https://eco.dameng.com/document/dm/zh-cn/pm/audit.html
1.3.1系统级
1.3.2语句级
语句级审计的动作是全局的,不对应具体的数据库对象。
1.3.1.1审计语句
SP_AUDIT_STMT与SP_NOAUDIT_STMT
设置语句级审计:
SP_AUDIT_STMT(TYPE VARCHAR(30), USERNAME VARCHAR (128), WHENEVER VARCHAR (20) )
取消语句级审计:
SP_NOAUDIT_STMT(TYPE VARCHAR(30), USERNAME VARCHAR (128), WHENEVER VARCHAR (20) )
TYPE 语句级审计选项
USERNAME 待被审计的用户名,NULL表示不限制
WHENEVER 审计时机,ALL所有,SUCCESSFUL操作成功时审计,FAIL操作失败时审计
注: 取消审计语句和设置审计语句 要 匹配 。
1.3.2.1审计策略查询
审计设置存放于字典表SYSAUDIT中,进行一次审计设置就在SYSAUDIT中增加一条对应的记录,取消审计则删除SYSAUDIT中相应的记录。
select * from SYSAUDIT;
select sf_get_audit_levelname(level) level,
sf_get_audit_typename(type) type,
sf_get_audit_whenevername("WHENEVER") whenerverl,
sf_get_tablename_by_id(decode(tvpid,-1,null,tvpid)) tablename,
sf_get_username_by_id (uid) uname
from sysaudit;
1.3.2.2审计示例操作
(1)sysdba提前创建测试用户
create user TESTS identified by "HUN_admin2026";
grant "PUBLIC","RESOURCE","SOI","SVI","VTI" to TESTS;
(2)SYSAUDITOR设置审计策略
--对SYSDBA创建、修改、删除用户成功进行审计
SP_AUDIT_STMT('USER', 'SYSDBA', 'SUCCESSFUL');
--审计表的创建、修改、删除和清空
审计所有用户表的创建、修改、删除和清空,不管操作成功还是失败都审计
SP_AUDIT_STMT('TABLE', 'NULL', 'ALL');
--对用户tests进行的表数据的增删改查进行审计,不管操作失败和成功都审计
SP_AUDIT_STMT('INSERT TABLE', 'TESTS', 'ALL');
SP_AUDIT_STMT('DELETE TABLE', 'TESTS', 'ALL');
SP_AUDIT_STMT('UPDATE TABLE', 'TESTS', 'ALL');
select * from SYSAUDIT;

(3)SYSDBA创建、修改、删除用户
create user TEST1 identified by "HUN_admin2026";
grant "PUBLIC","RESOURCE","SOI","SVI","VTI" to TEST1;
drop user TEST1 cascade;
-查询审计记录
select USERNAME,OPERATION,SQL_TEXT,OPTIME from V$AUDITRECORDS ORDER BY OPTIME DESC limit 10;

(4)SYSDBA创建、修改、清空表操作
create table test3(id int,name char(10));
create table test4(id int,name char(10));
alter table test3 ADD COLUMN info char(10);
insert into test3 VALUES (1,'t1','info1');
commit;
truncate table test3;
--查询审计记录
select USERNAME,OPERATION,SQL_TEXT,OPTIME from V$AUDITRECORDS ORDER BY OPTIME DESC limit 10;

(5)tests创建表并进行增删改查操作
create table tests(id int,name char(10));
insert into tests VALUES (1,'t1');
insert into tests VALUES (2,'t2');
update tests set name='t1ss' where id=1;
delete from tests where id=1;
commit;
select * from tests;
--查询审计记录
select USERNAME,OPERATION,SQL_TEXT,OPTIME from V$AUDITRECORDS ORDER BY OPTIME DESC limit 10;

(6)SYSAUDITOR取消审计策略
--取消对表的创建、修改、删除和清空的审计。
SP_NOAUDIT_STMT('TABLE', 'NULL', 'ALL');
--取消对 SYSDBA 创建、修改、删除用户成功进行审计。
SP_NOAUDIT_STMT('USER', 'SYSDBA', 'SUCCESSFUL');
--取消对用户tests进行的表的修改和删除的审计。
SP_NOAUDIT_STMT('INSERT TABLE', 'TESTS', 'ALL');
SP_NOAUDIT_STMT('DELETE TABLE', 'TESTS', 'ALL');
SP_NOAUDIT_STMT('UPDATE TABLE', 'TESTS', 'ALL');
--查询审计策略
select * from SYSAUDIT;
select sf_get_audit_levelname(level) level,
sf_get_audit_typename(type) type,
sf_get_audit_whenevername("WHENEVER") whenerverl,
sf_get_tablename_by_id(decode(tvpid,-1,null,tvpid)) tablename,
sf_get_username_by_id (uid) uname
from sysaudit;
--sysdba清理测试环境
drop TABLE test3;drop table tests.tests;
更多达梦数据库运维指南、在线文档、相关资料、社区在线提问以及技术分享