数据库审计
审计机制是 DM 数据库管理系统安全管理的重要组成部分之一。DM 数据库除了提供数据安全保护措施外,还提供对日常事件的事后审计监督。DM 具有一个灵活的审计子系统,可以通过它来记录系统级事件、个别用户的行为以及对数据库对象的访问。通过考察、跟踪审计信息,数据库审计员可以查看用户访问的形式以及曾试图对该系统进行的操作,从而采取积极、有效的应对措施。
审计概述
数据库审计是指监视和记录用户对数据库所施加的各种操作的机制。审计功能自动记录用户对数据库的所有操作,并且存入审计日志。事后可以利用这些信息重现导致数据库现有状况的一系列事件,为分析攻击者提供线索和依据。
审计机制应该至少记录用户标识和认证、客体访问、授权用户进行并会影响系统安全的操作,以及其他安全相关事件。对于每个记录的事件,审计记录中需要包括事件时间、用户、时间类型、事件数据和事件的成功/失败情况。对于标识和认证事件,必须记录事件源的终端 ID 和源地址等;对于访问和删除对象的事件,则需要记录对象的名称。
对于审计粒度与审计对象的选择,需要考虑系统运行效率与存储空间消耗的问题。为了达到审计目的,一般必须审计到对数据库记录与字段一级的访问。但这种小粒度的审计需要消耗大量的存储空间,同时使系统的响应速度降低,给系统运行效率带来影响。
审计的策略库一般由两个方面因素构成,即数据库本身可选的审计规则和管理员设计的触发策略机制。当这些审计规则或策略机制一旦被触发,则将引起相关的表操作。这些表可能是数据库自定义的,也可能是管理员另外定义的,最终这些审计的操作都将被记录在特定的表中以备查证。一般地,将审计跟踪和数据库日志记录结合起来,会达到更好的安全审计效果。
在 DM 系统中,专门为审计设置了开关,要使用审计功能首先要打开审计开关。审计开关由过程 SP_SET_ENABLE_AUDIT(param int);控制,过程执行完后会立即生效,param 有三种取值:
0:关闭审计;
1:打开普通审计;
2:打开普通审计和实时审计。
打开普通审计开关示例。
SP_SET_ENABLE_AUDIT(1)
使用说明:
审计开关必须由具有数据库审计员权限的管理员进行设置。
数据库审计员可通过查询动态视图 V$DM_INI 查询审计状态(ENABLE_AUDIT)的当前值。
SELECT * FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';
数据库审计员指定被审计对象的活动称为审计设置,只有具有 AUDIT DATABASE 权限的审计员才能进行审计设置。DM 提供审计设置系统过程来实现这种设置,被审计的对象可以是某类操作,也可以是某些用户在数据库中的全部行踪。只有预先设置的操作和用户才能被 DM 系统自动进行审计。
DM 数据允许在三个级别上进行审计设置,如下表所示。
表1
审计设置存放于 DM 字典表 SYSAUDIT 中,进行一次审计设置就在 SYSAUDIT 中增加一条对应的记录,取消审计则删除 SYSAUDIT 中相应的记录。
审计分类
数据库管理系统的审计主要分为语句审计、对象审计和语句序列审计,语句审计是指监视一个或者多个特定用户或者所有用户提交的 SQL 语句;对象审计是指监视一个模式中在一个或者多个对象上发生的行为;语句序列审计是监视针对特定顺序 SQL 语句的执行。
语句审计
语句级审计的动作是全局的,不对应具体的数据库对象。其审计部分选项如下表所示:
表2
设置语句级设计的系统过程语法命令如下:
VOID
SP_AUDIT_STMT(
TYPE VARCHAR(30),
USERNAME VARCHAR(128),
WHENEVER VARCHAR(20)
)
该命令中,TYPE 表示语句设计选项,即表 1 中的第一列;USERNAME 表示用户名,可设置为 NULL 表明不限制;WHENEVER 表示审计时机,可选值有ALL,表明所有时机;SUCCESSFUL,表明操作成功时的时机;FAIL,表明操作失败时的时机。
例如,审计表的创建、修改和删除。
SP_AUDIT_STMT(‘TABLE’, ’NULL’, ’ALL’);
对 SYSDBA 创建用户成功进行审计。
SP_AUDIT_STMT(‘USER’, ‘SYSDBA’,’SUCCESSFUL’);
对用户 USER2 进行的表的修改和删除进行审计,不管失败和成功。
SP_AUDIT_STMT(‘UPDATE TABLE’, ’USER2’, ’ALL’);
SP_AUDIT_STMT(‘DELETE TABLE’, ‘USER2’, ‘ALL’);
取消语句级审计的系统过程如下:
VOID
SP_NOAUDIT_STMT(
TYPE VARCHAR(30),
USERNAME VARCHAR(128),
WHENEVER VARCHAR(20)
)
该命令同创建审计一致,TYPE 表示语句设计选项,即表 1 中的第一列; USERNAME 表示用户名,可设置为 NULL 表明不限制;WHENEVER 表示审计时机,可选值有 ALL,表明所有时机;SUCCESSFUL,表明操作成功时的时机;FAIL,表明操作失败时的时机。
使用说明:
取消审计语句和设置审计语句进行匹配,只有完全匹配的才可以取消审计,否则无法取消审计。
例如,取消对计表的创建、修改和删除的审计。
SP_NOAUDIT_STMT(‘TABLE’, ’NULL’, ’ALL’);
取消对 SYSDBA 创建用户成功进行审计。
SP_NOAUDIT_STMT(‘USER’, ‘SYSDBA’,’SUCCESSFUL’);
取消对用户 USER2 进行的表的修改和删除进行审计,不管失败和成功。
SP_NOAUDIT_STMT(‘UPDATE TABLE’, ’USER2’, ’ALL’);
SP_NOAUDIT_STMT(‘DELETE TABLE’, ‘USER2’, ‘ALL’);
对象级审计
对象级审计发生在具体的对象上,需要指定模式名以及对象名。其审计选项如下表所示:
设置对象级审计的系统过程如下:
VOID
SP_AUDIT_OBJECT(
TYPE VARCHAR(30),
USERNAME VARCHAR(128),
SCHEMA VARCHAR(128),
TVNAME VARCHAR(128),
{COLNAME VARCHAR(128),}
WHENEVER VARCHAR(20)
)
该命令中,TYPE 表示审计选项,即表 2 中的第一列;USERNAME 表示用户名;SCHEMA 表示模式名,为空时设置为‘null’;TVNAME 表示表、视图、存储过程名,不能为空;COLNAME 表示列名,为空时可省略;WHENEVER 表示审计时机,可选值有 ALL,表明所有时机;SUCCESSFUL,表明操作成功时的时机;FAIL,表明操作失败时的时机。
例如,将 SYSDBA 用户对表 PERSON.ADDRESS 进行的修改和成功的操作进行审计。
SP_AUDIT_OBJECT(‘INSERT, ’SYSDBA’, ’PERSON’, ’ADDRESS’, ’SUCCESSFUL’);
SP_AUDIT_OBJECT(‘UPDATE’, ’SYSDBA’, ’PERSON’, ’ADDRESS’, ’SUCCESSFUL’)
将 SYSDBA 用户对表 PERSION.ADDRESS 的列 ADDRESS1 列进行的修改成功的操作进行审计。
SP_AUDIT_OBJECT(‘UPDATE’, ’SYSDBA’, ’PERSON’, ’ADDRESS’, ’ADDRESS1’, ’SUCCESSFUL’)
取消对象级审计的系统过程如下:
VOID
SP_NOAUDIT_OBJECT(
TYPE VARCHAR(30),
USERNAME VARCHAR(128),
SCHEMA VARCHAR(128),
TVNAME VARCHAR(128),
{COLNAME VARCHAR(128),}
WHENEVER VARCHAR(20)
)
参数说明同设置对象审计一致,TYPE 表示审计选项,即表 2 中的第一列;USERNAME 表示用户名;SCHEMA 表示模式名,为空时设置为‘null’;TVNAME 表示表、视图、存储过程名,不能为空;COLNAME 表示列名,为空时可省略;WHENEVER 表示审计时机,可选值有 ALL,表明所有时机;SUCCESSFUL,表明操作成功时的时机;FAIL,表明操作失败时的时机。
取消审计语句和设置审计语句进行匹配,只有完全匹配的才可以取消审计,否则无法取消审计。
例如,取消设置用户 SYSDBA 对表 PERSON.ADDRESS 进行的添加和修改的成功操作的审计。
SP_NOAUDIT_OBJECT(‘INSERT, ’SYSDBA’, ’PERSON’, ’ADDRESS’, ’SUCCESSFUL’);
SP_NOAUDIT_OBJECT(‘UPDATE’, ’SYSDBA’, ’PERSON’, ’ADDRESS’, ’SUCCESSFUL’)
取消设置用户 SYSDBA 对表 PERSON.ADDRES 的 ADDRESS1 列进行的修改成功操作的审计。
SP_NOAUDIT_OBJECT(‘UPDATE’, ’SYSDBA’, ’PERSON’, ’ADDRESS’, ’ADDRESS1’, ’SUCCESSFUL’)
语句序列审计
DM 数据库提供了语句序列审计功能,作为语句级审计和对象级审计的补充。语句序列审计需要审计员预先建立一个审计规则,包含 N 条 SQL 语句(SQL1,SQL2……),如果某个会话依次执行了这些 SQL 语句,就会触发审计。
建立语句序列审计规则的过程包括下面三个系统过程:
VOID
SP_AUDIT_SQLSEQ_START(
NAME VARCHAR(128)
)
VOID
SP_AUDIT_SQLSEQ_ADD(
NAME VARCHAR(128),
SQL VARCHAR(8188)
)
VOID
SP_AUDIT_SQLSEQ_END(
NAME VARCHAR(128)
)
其中,NAME 表示语句序列审计规则名,SQL 表示需要审计的语句序列中的 SQL 语句。
建立语句序列审计规则需要先调用 SP_AUDIT_SQLSEQ_START,之后调用若干次 SP_AUDIT_SQLSEQ_ADD,每次加入一条 SQL 语句,审计规则中的 SQL 语句顺序根据加入 SQL 语句的顺序确定,最后调用 SP_AUDIT_SQLSEQ_END 完成规则的建立。
例如,建议一个语句序列审计规则 AUDIT_SQL1。
SP_AUDIT_SQLSEQ_START(‘AUDIT_SQL1’);
SP_AUDIT_SQLSEQ_ADD(‘AUDIT_SQL1’, ‘SELECT NAME FROM TEST1;’);
SP_AUDIT_SQLSEQ_ADD(‘AUDIT_SQL1’, ‘SELECT ID FROM TEST2;’);
SP_AUDIT_SQLSEQ_ADD(‘AUDIT_SQL1’, ‘SELECT * FROM TEST3;’);
SP_AUDIT_SQLSEQ_END(‘AUDIT_SQL1’);
如需删除指定的语句序列审计规则,使用 SP_AUDIT_SQLSEQ_DEL 语法,其系统过程如下:
VOID
SP_AUDIT_SQLSEQ_DEL(
NAME VARCHAR(128)
)
其中,NAME 表示语句序列审计规则名。
例如,删除语句序列审计规则 AUDIT_SQL1。
SP_AUDIT_SQLSEQ_DEL(‘AUDIT_SQL1’)
注意:
1.只要审计功能被启用,系统级的审计记录就会产生;
2.在进行数据库审计时,审计员之间没有区别,可以审计所有数据库对象,也可取消其他审计员的审计设置;
3.语句级审计不针对特定的对象,只针对用户;
4.对象级审计针对指定的用户与指定的对象进行审计;
5.在设置审计时,审计选项不区分包含关系,都可以设置;
6.在设置审计时,审计时机不区分包含关系,都可以进行设置;
7.如果用户执行的一条语句与设置的若干审计项都匹配,只会在审计文件中生成一条审计记录。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充 SQL,完成如下要求:
开启普通审计;
对 SYSDBA 用户创建用户进行审计,不管失败和成功;
将 SYSDBA 用户对表 test.total 进行的插入数据成功的操作进行审计。