
关于干货分享栏目的迁移公告
为进一步优化广大用户的使用和阅读体验,能够给大家提供更优质、更高效的信息和技术服务,达梦公司官方微信公众平台“达梦大数据”中的干货分享内容后续推广将转移至“达梦大学”。
达梦公司本着“以人为本”的理念,成立达梦大学。达梦大学是达梦数据库管理系统及相关产品知识普及、培训服务、教育合作等全方位的人才培养体系,推动教育与创新,助力数据库产业链培养与储备人才的教育项目。
2020年10月20日,达梦大学微信公众号正式上线!达梦大学微信公众号主要致力于为广大学员提供最新培训动态、分享技术干货知识及前沿行业动态。达梦大学将充分利用公众平台,为大家提供优质的互动体验,提供更多培训资讯!
“达梦大学”公众号关注方式:
1、打开微信,在添加朋友中搜索公众号“达梦大学”,关注公众号;
2、打开微信,扫描下方二维码,关注公众号。



以下为本期干货分享内容:
审计机制是DM数据库管理系统安全管理的重要组成部分之一。DM具有一个灵活的审计子系统,可以通过它来记录系统级事件、个别用户的行为以及对数据库对象的访问。
本章内容已在如下环境上测试:
①操作系统:中标麒麟7;
②数据库版本:达梦8;
相关关键字:DM8、数据库审计、AUDIT_ENABLE
审计开关
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_typefrom v$dm_iniwhere 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, COLIDfrom 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') optimefrom 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新增的系统函数,分别用于获取审计类型、审计级别和审计时机,只有新版本才支持。

本次分享结束,感谢大家。

往期干货精选





