注册
达梦数据库审计功能介绍-学习感想
专栏/培训园地/ 文章详情 /

达梦数据库审计功能介绍-学习感想

Sense 2024/09/03 1282 0 0
摘要

随着时代的发展,审计已经被越来越多的人关注,且一些重要单位已经明文要求数据库中的重要数据,必须开启审计,例如员工的工资。假如某些重要数据被非法或者恶意篡改,那审计的追溯功能就能派上用场。但是要注意一点,审计功能是消耗数据库服务器性能的,需根据现场实际情况,制定合理的审计规则。

环境:DM8安全版
程序安装路径:/home/dmdba/dm/dmdbms
数据初始化路径:/home/dmdba/dm/dbdata/dmdata

一、打开审计功能

可执行此命令打开普通审计功能(用SYSAUDITOR用户操作):
SP_SET_PARA_VALUE(1,'ENABLE_AUDIT',1); --DM7
SP_SET_ENABLE_AUDIT (1); --DM8
过程执行完成后,立即生效,审计有三种取值
0 :关闭审计
1:打开普通审计
2:打开普通审计和实时审计
默认值为0

数据库审计员可通过查询 V$DM_INI 动态视图查询 ENABLE_AUDIT 的当前值。
SELECT * FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';
image.png

二、配置审计规则

达梦有三种级别的审计:
1.系统级
系统的启动、关闭、部分系统事件以及一些系统过程和函数的调用,此级别的审计无法也无需由用户进行设置,只要审计开关打开就会自动生成对应审计记录。
2.语句级
导致影响特定类型数据库对象的特殊 SQL 或语句组的审计。如AUDIT TABLE将审计CREATE TABLE、ALTER TABLE 和 DROP TABLE 等语句
3.对象级
审计作用在特殊对象上的语句。如工资表上的UPDATE语句。

审计配置的规则,会存在表SYSAUDITOR.SYSAUDIT中,新增一条审计规则,就在 SYSAUDIT 中增加一条对应的记录,取消审计则删除 SYSAUDIT 中相应的记录。

2.1语句级审计规则

语句级审计
SP_AUDIT_STMT(TYPE,USERNAME,WHENEVER)
TYPE:审计对象(表,视图,存储过程)
USERNAME:用户,NULL 表示不限制
WHENEVER:审计时机
 ALL: 不管成功或是失败都审计
 SUCCESSFUL:操作成功的时候审计
 FAIL:操作失败的时候审计
增加审计,例如审计DMTEST用户对表的操作
用SYSAUDITOR用户登录达梦客户端,右键用户,设置审计
image.png

image.png

SP_AUDIT_STMT('TABLE','DMTEST','ALL')

执行建表和删表操作
CREATE TABLE DMTEST.T60(ID INT);
DROP TABLE DMTEST.T60;
然后查询审计日志视图:
select * from v$AUDITRECORDS
image.png

取消审计则将AUDIT改成NOAUDIT,如下(参数要一致):
SP_NOAUDIT_STMT('TABLE','DMTEST','ALL')

2.2对象级审计规则配置

SP_AUDIT_OBJECT(TYPE,USERNAME,SCHEMA_NAME,OBJECT_NAME,COLUMN_NAME,WHENEVER)

TYPE:INSERT,DELETE,UPDATE,ALL等
USERNAME :用户名
SCHNAME:模式名,为空时置null
TVNAME:表、视图、存储过程名不能为空
COLNAME:列名
WHENEVER:审计时机
 ALL: 不管成功或是失败都审计
 SUCCESSFUL:操作成功的时候审计
 FAIL:操作失败的时候审计

增加审计,例如审计所有用户对DMTEST.T61表的NAME更新操作。
创建测试表:
CREATE TABLE DMTEST.T61(ID INT,NAME VARCHAR(20));

对表加审计,直接右键表名;对表的字段加审计规则,就需要在字段上右键,设置审计。
image.png

image.png

通过图形工具,发现审计设置不了UPDATE,只能是ALL。需要粘贴出来DDL,手动改一下。
SP_AUDIT_OBJECT('ALL', 'NULL', 'DMTEST', 'T61', 'NAME', 'ALL');
改成:
SP_AUDIT_OBJECT('UPDATE', 'NULL', 'DMTEST', 'T61', 'NAME', 'ALL');

image.png

写入并修改数据:
INSERT INTO DMTEST.T61 VALUES (1,'1');
INSERT INTO DMTEST.T61 VALUES (2,'2');
COMMIT;
UPDATE DMTEST.T61 SET NAME='ZHANGSAN' WHERE ID=1;
UPDATE DMTEST.T61 SET NAME='LISI' WHERE ID=2;
COMMIT;

select * from v$AUDITRECORDS where username='DMTEST'
AND OPERATION LIKE '%UPDATE%'
image.png

2.3审计规则可读性思考

正式环境配置了很多审计规则之后,所有的规则都会记录在审计规则表
select * from SYSAUDITOR.SYSAUDIT
image.png

LEVEL:1=语句级,2=对象级
WHENVER:1=SUCCESSFUL,2=FAIL,3=ALL
此表不能delete删除,也不能truncate清空,只能通过加入审计规则和移除审计规则增删数据;
且此表的可读性很差,假如想看到底配了些什么规则(尤其是想取消某个规则),目前没有发现好的手段,只能去客户端一个个点,很不现实。因此,本篇文章写了一个查询sql,可以将一些常用规则,生成一种可读性好的结果集,例如某个环境有以下规则:
image.png
规则表数据截图:
image.png
可以通过此sql,一键生成配置规则(此sql只是将一些常用规则做了转义,提供一种解决思路,可自行调整sql语法,不完全准确,仅供参考,不含字段级审计):
SELECT
CASE WHEN NLEVEL='SP_AUDIT_STMT' THEN NLEVEL||'('''||NTYPE||''','''||NUID||''','''||NWHENEVER||''');'
WHEN NLEVEL='SP_AUDIT_OBJECT' THEN NLEVEL||'('''||NTYPE||''','''||NUID||''','''||SCH||''','''||TAB||''','''||NWHENEVER||''');'
ELSE 'ERROR' end as DDLS FROM (
select decode(level,'1','SP_AUDIT_STMT','2','SP_AUDIT_OBJECT',level) AS NLEVEL
,case when uid='-1' then 'ALL' WHEN UID!='-1' THEN (select B.username from all_users B where b.user_id=a.UID) ELSE UID end as NUID
,decode(A."TYPE",'12','USER','15','TABLE','32','DELETE TABLE','33','UPDATE TABLE','30','INSERT TABLE','31','SELECT TABLE','50','INSERT','52','DELETE','53','UPDATE',A."TYPE") AS NTYPE
, (SELECT Y.NAME FROM SYSOBJECTS Y WHERE ID=
(SELECT X.SCHID FROM SYSOBJECTS X WHERE X.ID=A.TVPID) AND SUBTYPE$ is NULL) as SCH
,(SELECT Z.NAME FROM SYSOBJECTS Z WHERE Z.ID=A.TVPID) AS TAB
,decode(A."WHENEVER",'1','SUCCESSFUL','2','FAIL','3','ALL',A."WHENEVER") as NWHENEVER
from
sysauditor.sysaudit A
);
结果集如下:
image.png

三、审计工具使用

cd /home/dmdba/dm/dmdbms/tool/
./analyzer
登录SYSAUDITOR审计账号
右键“审计规则”》“新建审计规则分析”
比如针对NUSP用户的删除或者更新操作进行审计。

image.png

image.png

审计分析,选择审计文件,确定
审计日志一般在数据文件同级目录/dbdata/dmdata/DAMENG
image.png
image.png

仅供参考,如有不足,欢迎斧正。
关于更多达梦数据库审计介绍,参考《DM8安全管理》手册第五章节。
更多资讯请上达梦技术社区了解: https://eco.dameng.com/

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服