审计机制是DM数据库管理系统安全管理的重要组成部分之一。DM具有一个灵活的审计子系统,可以通过它来记录系统级事件、个别用户的行为以及对数据库对象的访问。
审计开关
ENABLE_AUDIT参数为达梦数据库审计开关,DM8该参数为READ ONLY只读类型,不能使用SP_SET_PARA_NAME函数修改此参数,可以通过SP_SET_ENABLE_AUDIT动态设置。语法如下:
VOID SP_SET_ENABLE_AUDIT (
PARAM INT
)
参数说明:
PARAM:有三种取值(普通版本缺省值为0)。可选的取值为:
0:关闭审计
1:打开普通审计
2:打开普通审计和实时审计
只有SYSAUDITOR数据库审计员才能设置数据库审计开关,打开数据库普通审计功能。命令参考如下。
sp_set_enable_audit(1);
可通过查询V$DM_INI动态视图获取ENABLE_AUDIT的当前值。
select para_name, para_value, para_type
from v$dm_ini
where para_name = 'ENABLE_AUDIT';
审计设置
具有AUDIT DATABASE权限的审计员可以进行审计设置。DM允许三个级别审计设置,分别是系统级、语句级和对象级。
审计级别 | 说明 |
系统级 | 系统的启动与关闭,此级别的审计无需用户设置,只要审计开关打开就会自动生成对应审计记录 |
语句级 | 对特定类型数据库对象的特殊SQL或语句组的审计。如AUDIT TABLE 将审计CREATE TABLE、ALTER TABLE和DROP TABLE等语句 |
对象级 | 审计作用在特殊对象上的语句。如test表上的INSERT语句 |
语句级审计
语句级审计的动作是全局的,不针对具体的数据库对象,只针对用户。
设置语句级审计的系统过程如下:
VOID SP_AUDIT_STMT (
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
WHENEVER VARCHAR (20)
)
参数说明:
TYPE:语句级审计选项,详情可参考《DM8安全管理》手册。
USERNAME:用户名,NULL表示不限制
WHENEVER:审计时机,可选的取值为:
ALL:所有的
SUCCESSFUL:操作成功时
FAIL:操作失败时
例如,审计所有用户的DELETE TABLE动作。语句参考如下(使用SYSAUDITOR用户执行):
SP_AUDIT_STMT('DELETE TABLE', 'NULL', 'ALL');
设置审计后,使用SYSAUDITOR用户查询SYSAUDIT系统表可以查看相关审计设置信息,语句参考如下(SF_GET_AUDIT_TYPENAME用于获取审计类型,SF_GET_AUDIT_LEVELNAME用于获取审计级别,SF_GET_AUDIT_WHENEVERNAME用于获取审计时机。注意WHENEVER是关键字,查询时需要加双引号):
select SF_GET_AUDIT_TYPENAME(TYPE) TYPENAME,
SF_GET_AUDIT_LEVELNAME(LEVEL) LEVELNAME,
SF_GET_AUDIT_WHENEVERNAME("WHENEVER") WHENEVERNAME,
UID, TVPID, COLID
from SYSAUDIT;
假如我们删除DMHR.EMPLOYEE员工表信息两条(注意,使用SYSDBA操作,SYSAUDITOR没有删除该表的权限),执行动作参考如下:
即使我们未提交数据,使用SYSAUDITOR用户查询V$AUDITRECORDS表,也可以查看到审计相关记录信息,语句参考如下:
select t.SCHNAME, t.OBJNAME, t.OPERATION, t.SUCC_FLAG, t.SQL_TEXT,
to_char(t.optime, 'yyyy-mm-dd hh24:mi:ss') optime
from v$auditrecords t;
结果展示如下:
使用SP_NOAUDIT_STMT过程可以取消语句级审计,参数与SP_AUDIT_STMT参数相同。取消审计所有用户的DELETE TABLE动作语句参考如下。
SP_NOAUDIT_STMT('DELETE TABLE', 'NULL', 'ALL');
对象级审计
对象级审计发生在具体的对象上,需要指定模式名以及对象名。
设置对象级审计的系统过程如下:
VOID SP_AUDIT_OBJECT (
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
SCHNAME VARCHAR (128),
TVNAME VARCHAR (128),
WHENEVER VARCHAR (20)
)
VOID SP_AUDIT_OBJECT (
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
SCHNAME VARCHAR (128),
TVNAME VARCHAR (128),
COLNAME VARCHAR (128),
WHENEVER VARCHAR (20)
)
参数说明:
TYPE:对象级审计选项,详情可参考《DM8安全管理》手册。
USERNAME:用户名
SCHNAME:模式名,为空时置‘null’
TVNAME:表、视图、存储过程名不能为空
COLNAME:列名
WHENEVER:审计时机,可选的取值为:
ALL:所有的
SUCCESSFUL:操作成功时
FAIL:操作失败时
假如对表DMHR.DEPARTMENT修改的操作进行审计,语句参考如下:
SP_AUDIT_OBJECT('UPDATE', 'SYSDBA', 'DMHR', 'DEPARTMENT', 'ALL');
假如对表DMHR.EMPLOYEE的SALAERY列的修改成功操作进行审计,语句参考如下:
SP_AUDIT_OBJECT('UPDATE','SYSDBA','DMHR','EMPLOYEE','SALARY','SUCCESSFUL');
设置成功后,查询SYSAUDIT表可以看到新增的对象级审计信息,结果参考如下:
使用SYSDBA查询SYSOBJECTS表中的信息,可以查看对应的用户及对象信息。
使用SYSDBA用户更改DMHR.EMPLOYEE表的SALARY字段,及更改DEPARTMENT表数据信息,语句参考如下:
更改完成后,使用SYSAUDITOR用户查询V$AUDITRECORDS表,可以看到相关审计记录:
使用SP_NOAUDIT_OBJECT过程可以取消对象级审计,参数与SP_AUDIT_OBJECT参数相同。取消上述对象级审计语句参考如下:
SP_NOAUDIT_OBJECT('UPDATE','SYSDBA', 'DMHR', 'EMPLOYEE', 'SALARY', 'SUCCESSFUL');
SP_NOAUDIT_OBJECT('UPDATE','SYSDBA', 'DMHR', 'DEPARTMENT', 'ALL');
审计文件 审计信息存储在审计文件中。审计文件存放在数据库的SYSTEM_PATH参数指定的路径,即数据库所在路径。审计文件命名格式为“AUDIT_实例名_GUID_创建时间.log”,其中“GUID”为DM给定的一个唯一值。审计文件的大小可以通过DM的INI参数AUDIT_MAX_FILE_SIZE指定,也可以使用系统过程SP_DROP_AUDIT_FILE删除某个时间点之前的历史审计信息。
好,以上是本次分享内容,最后做一下总结说明:
1.DM数据库审计开关需要使用SYSAUDITOR用户开启和关闭。相关审计设置和查询也需要使用SYSAUDITOR用户,SYSDBA用户无权开启和设置审计相关信息。
2.数据库审计员无法进行数据库增删改查等DML操作和DDL操作,相关DML和DDL操作需使用数据库管理员SYSDBA或其他有权限的普通管理用户操作。
3.SF_GET_AUDIT_TYPENAME、SF_GET_AUDIT_LEVELNAME、SF_GET_AUDIT_WHENEVERNAME三个函数是DM8新增的系统函数,分别用于获取审计类型、审计级别和审计时机,只有新版本才支持。