达梦V8 的安全审计 初认识
前几日一客户遇到了些安全事件,又把安全这个沉重的技术提高了要求, 安全投资再多也不过分但又可能看不到收益,还可能违背人性遭吐槽。 环境中有达梦数据库,领导想了解一下达梦安全做到什么程度,如审计像oracle中有AUDIT,还有AVDF,DV等专业组件,对数据库的访问控制保留记录,像对于“托库”oracle有监听日志和ASH \DASH配合如连接IP、 持续活动时间、持续IO量评估,如果开了审计或trigger可以定制记录。我花点时间了解了一下达梦V8.
国产库在安全方面风险漏洞较少,我个人认为主要原因有一方面是国产库没有对外披露安全漏洞,出类似Oracle CPU补丁修复,另一方面‘攻击者’对国产库知之甚少,国外的可能连国产库名都没听说过吧,还顾及不上来攻击它。
开始以为是使用SVR_LOG参数,实际是ENABLE_AUDIT。 可以使用SP_SET_ENABLE_AUDIT过程立即生效,区别于ORACLE的audit_trail需要重启. 默认禁用,启用方法
SP_SET_ENABLE_AUDIT (1);
- 0:关闭审计
- 1:打开普通审计
- 2:打开普通审计和实时审计
达梦审计级别和oracle差不多有系统、对象、语句级,或FGA,或独创了一个审计如果几个SQL按某顺序,算是一种业务场景的审计吧。 记录可以从数据库查询v$auditrecords。也会写操作系统上的审计日志,而审计的刷盘方式有点oracle 统一审计的味道,如AUDIT_FLUSH_LEVEL=2时可以缓存异步刷盘。 可以自动删除或手动。另外一点和oracle区别是算是三权分立吧,启用审计或禁用,查询审计记录都是需要独立的审计用户,如自带的sysauditor用户,操作系统的审计文件也不像oracle是明文可以查看,达梦的审计文件是不能直接vi打开的,是需要DM提供的工具,如图形界面的审计分析工具 Analyzer 或通过命令行启动的审计分析工具 dmaudtool。
dmaudtool USERID=<userid> AFIL_PATH=<afil_path> OUT_PATH=<out_path> {PARAMETER=<value>}
上面SP_SET_ENABLE_AUDIT看到审计有2个级别,1是和oracle一样的写审计日志,事后分析;2增加了实时审计,比oracle自带的审计增加了实时侵害检测功能,这又有了AVDF的味道,与系统中创建的实时侵害检测规则进行匹配,判断该用户操作是否是侵害行为,还可以做出应对及告警。侵害又为4级,对应4级响应,危险形为可以主动终止当前操作、强断会话、锁定用户功能。还可以定制时间段或IP及违反次数规则,很攒!, 下面演示一个基础的审计功能。
对于语句级审计
VOID SP_AUDIT_STMT( TYPE VARCHAR(30), USERNAME VARCHAR (128), WHENEVER VARCHAR (20) ) 参数说明: TYPE 语句级审计选项,即上表中的第一列 USERNAME 用户名,NULL 表示不限制 WHENEVER 审计时机,可选的取值为: ALL:所有的 SUCCESSFUL:操作成功时 FAIL:操作失败时
启动审计
这里我使用的配置文件--非必须 dmdba@oel7db1 anbob]$ vi dm.ini -- append ENABLE_AUDIT=1 [dmdba@oel7db1 anbob]$ exit logout [root@oel7db1 ~]# systemctl stop DmServiceDMSERVER.service [root@oel7db1 ~]# systemctl start DmServiceDMSERVER.service SQL> `p audit SQL> select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%&1%'); 原值 1:select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%&1%'); 新值 1:select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%audit%'); 行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE ---------- -------------------- --------- ----- --------- ---------- DESCRIPTION ----------------------------------------------------------------------------------------------- 1 ENABLE_AUDIT READ ONLY 0 0 1 Flag For Allowing Audit, 0: no audit 1: normal audit 2:normal audit and realtime audit 2 AUDIT_FILE_FULL_MODE IN FILE 1 1 1 operation mode when audit file is full, 1: delete old file; 2: no longer to write audit records 3 AUDIT_SPACE_LIMIT IN FILE 8192 8192 8192 audit space limit in Megabytes 行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE ---------- -------------------- --------- ----- --------- ---------- DESCRIPTION ----------------------------------------------------------------------------------------------- 4 AUDIT_MAX_FILE_SIZE SYS 100 100 100 maximum audit file size in Megabytes 5 AUDIT_IP_STYLE SYS 0 0 0 IP style in audit record, 0: IP, 1: IP(hostname), default 0 # sysdba user SQL> SP_set_enable_audit(1); SP_set_enable_audit(1); [-5598]:没有执行权限. 已用时间: 92.613(毫秒). 执行号:0. # sysauditor user SQL> SP_set_enable_audit(1); DMSQL 过程已成功完成 已用时间: 167.963(毫秒). 执行号:601. SQL> SQL> `p audit SQL> select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%&1%'); 原值 1:select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%&1%'); 新值 1:select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%audit%'); 行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE ---------- -------------------- --------- ----- --------- ---------- DESCRIPTION ----------------------------------------------------------------------------------------------- 1 ENABLE_AUDIT READ ONLY 1 1 1 Flag For Allowing Audit, 0: no audit 1: normal audit 2:normal audit and realtime audit 2 AUDIT_FILE_FULL_MODE IN FILE 1 1 1 operation mode when audit file is full, 1: delete old file; 2: no longer to write audit records 3 AUDIT_SPACE_LIMIT IN FILE 8192 8192 8192 audit space limit in Megabytes 行号 NAME TYPE VALUE SYS_VALUE FILE_VALUE ---------- -------------------- --------- ----- --------- ---------- DESCRIPTION ----------------------------------------------------------------------------------------------- 4 AUDIT_MAX_FILE_SIZE SYS 100 100 100 maximum audit file size in Megabytes 5 AUDIT_IP_STYLE SYS 0 0 0 IP style in audit record, 0: IP, 1: IP(hostname), default 0 # 启用U1用户表级语句审计 SQL> SP_AUDIT_STMT('TABLE','U1','ALL'); DMSQL 过程已成功完成 已用时间: 10.949(毫秒). 执行号:602.
U1业务用户操作
dmdba@oel7db1 ~]$ disql u1 密码: 服务器[LOCALHOST:5236]:处于普通打开状态 登录使用时间 : 4.914(ms) disql V8 SQL> DROP TABLE TEST1; DROP TABLE TEST1; 第1 行附近出现错误[-2106]:无效的表或视图名[TEST1]. 已用时间: 3.045(毫秒). 执行号:0. SQL> drop table test; 操作已执行 已用时间: 83.443(毫秒). 执行号:700. SQL> drop table test2; 操作已执行 已用时间: 124.139(毫秒). 执行号:701. SQL> create table test2(id int); 操作已执行 已用时间: 16.569(毫秒). 执行号:702. SQL>
sysauditor审计用户查看
SQL> select username,rolename,ip,objname,operation,sql_text,optime from v$auditrecords; 行号 USERNAME ROLENAME IP OBJNAME OPERATION SQL_TEXT OPTIME ---------- ---------- -------------- --- ------- ------------ ----------------------------------- -------------------------- 1 SYSDBA DBA ::1 EXECUTE SP_set_enable_audit(1); 2024-02-03 16:27:00.000000 2 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_set_enable_audit(1); 2024-02-03 16:27:14.000000 3 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_AUDIT_STMT('TABLE','U1','ALL'); 2024-02-03 16:31:58.000000 4 U1 ::1 DROP TABLE DROP TABLE TEST1; 2024-02-03 16:32:11.000000 5 U1 ::1 DROP TABLE drop table test; 2024-02-03 16:32:21.000000 6 U1 ::1 DROP TABLE drop table test2; 2024-02-03 16:32:25.000000 7 U1 ::1 CREATE TABLE create table test2(id int); 2024-02-03 16:32:30.000000 7 rows got # 增加登录审计 SQL> sp_audit_stmt('CONNECT','U1','ALL'); DMSQL 过程已成功完成 已用时间: 8.580(毫秒). 执行号:615. SQL> sp_audit_stmt('CONNECT','SYSDBA','ALL'); DMSQL 过程已成功完成
模拟远程登录U1
[dmdba@oel7db1 ~]$ disql u1/u123456789@192.168.56.19 服务器[192.168.56.19:5236]:处于普通打开状态 登录使用时间 : 4.742(ms) disql V8 SQL> create table test3(id int); 操作已执行 已用时间: 17.995(毫秒). 执行号:800. SQL>
查看审计记录 sysauditor
SQL> select username,rolename,ip,objname,operation,sql_text,optime from v$auditrecords;
行号 USERNAME ROLENAME IP OBJNAME OPERATION SQL_TEXT OPTIME
---------- ---------- -------------- -------------------- ------- ------------ ----------------------------------- --------------------------
1 SYSDBA DBA ::1 EXECUTE SP_set_enable_audit(1); 2024-02-03 16:27:00.000000
2 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_set_enable_audit(1); 2024-02-03 16:27:14.000000
3 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_AUDIT_STMT('TABLE','U1','ALL'); 2024-02-03 16:31:58.000000
4 U1 ::1 DROP TABLE DROP TABLE TEST1; 2024-02-03 16:32:11.000000
5 U1 ::1 DROP TABLE drop table test; 2024-02-03 16:32:21.000000
6 U1 ::1 DROP TABLE drop table test2; 2024-02-03 16:32:25.000000
7 U1 ::1 CREATE TABLE create table test2(id int); 2024-02-03 16:32:30.000000
8 U1 ::ffff:192.168.56.19 CREATE TABLE create table test3(id int); 2024-02-03 16:38:21.000000
8 rows got
已用时间: 2.056(毫秒). 执行号:605.
SQL>
SQL> set pages 1000
SQL> desc v$auditrecords
行号 NAME TYPE$ NULLABLE
---------- ----------- ------------- --------
1 USERID INTEGER Y
2 USERNAME VARCHAR(128) Y
3 ROLEID INTEGER Y
4 ROLENAME VARCHAR(128) Y
5 IP VARCHAR(64) Y
6 SCHID INTEGER Y
7 SCHNAME VARCHAR(128) Y
8 OBJID INTEGER Y
9 OBJNAME VARCHAR(128) Y
10 OPERATION VARCHAR(128) N
11 SUCC_FLAG CHAR(1) N
12 SQL_TEXT VARCHAR(8188) Y
13 DESCRIBTION VARCHAR(8188) Y
14 OPTIME DATETIME(6) N
15 MAC VARCHAR(25) Y
16 SEQNO TINYINT Y
16 rows got
SQL> select username,rolename,ip,objname,operation,sql_text,optime from v$auditrecords;
行号 USERNAME ROLENAME IP OBJNAME OPERATION SQL_TEXT OPTIME
---------- ---------- -------------- -------------------- ------- ------------ ----------------------------------------- --------------------------
1 SYSDBA DBA ::1 EXECUTE SP_set_enable_audit(1); 2024-02-03 16:27:00.000000
2 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_set_enable_audit(1); 2024-02-03 16:27:14.000000
3 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_AUDIT_STMT('TABLE','U1','ALL'); 2024-02-03 16:31:58.000000
4 U1 ::1 DROP TABLE DROP TABLE TEST1; 2024-02-03 16:32:11.000000
5 U1 ::1 DROP TABLE drop table test; 2024-02-03 16:32:21.000000
6 U1 ::1 DROP TABLE drop table test2; 2024-02-03 16:32:25.000000
7 U1 ::1 CREATE TABLE create table test2(id int); 2024-02-03 16:32:30.000000
8 U1 ::ffff:192.168.56.19 CREATE TABLE create table test3(id int); 2024-02-03 16:38:21.000000
9 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_SET_ENABLE_AUDIT(0); 2024-02-03 16:41:29.000000
10 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE SP_SET_ENABLE_AUDIT(1); 2024-02-03 16:49:47.000000
11 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE sp_audit_stmt('CONNECT','ALL','ALL'); 2024-02-03 16:49:52.000000
12 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE sp_audit_stmt('CONNECT','U1','ALL'); 2024-02-03 16:50:12.000000
13 SYSAUDITOR DB_AUDIT_ADMIN ::1 EXECUTE sp_audit_stmt('CONNECT','SYSDBA','ALL'); 2024-02-03 16:50:19.000000
14 U1 ::ffff:192.168.56.19 DISCONNECT LOGOUT 2024-02-03 16:53:28.000000
15 u1 ::ffff:192.168.56.19 CONNECT LOGIN 2024-02-03 16:53:29.000000
15 rows got
已用时间: 85.048(毫秒). 执行号:617.
SQL>
禁用审计
SQL> SP_SET_ENABLE_AUDIT(0); DMSQL 过程已成功完成 已用时间: 4.773(毫秒). 执行号:608. SQL> `p enable_audit SQL> select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%&1%'); 原值 1:select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%&1%'); 新值 1:select name ,type,value,sys_value,file_value,description from v$parameter where upper(name) like upper('%enable_audit%');
— OVER —
对不起,这篇文章暂时关闭评论。