一.审计SYSDBA活动
启用审计SYSDBA活动,作为SYSDBA或SYSOPER连接数据库的用户所发布的每条语句都会被写入操作系统的审计跟踪,从而能够给出dba所进行操作的完整记录。
审计跟踪必须受到保护,如果dba能够删除审计记录,那么创建这些审计记录就毫无意义。因此,dba不应该拥有操作系统的超级用户权限。
关于审计的参数:
audit_sys_operations -- 是否启用审计SYSDBA活动,默认情况为TRUE
audit_file_dest -- 审计跟踪文件所在目录
select name,value from v$parameter where name like 'audit%';
二.数据库审计
设置数据库审计之前,必须设置audit_trail参数,参数值:
·NONE(或者FALSE): 禁用数据库审计
·OS: 审计记录会被写至操作系统的审计跟踪目录(audit_file_dest所在目录).
·DB:审计记录会被写入数据字典表sys.aud$.
·DB_EXTENDED: 与DB大体相同,不过包含生成审计记录的、具有绑定变量的SQL语句.
·XML: 与OS的作用大体相同,但使用XML标记设置格式.
·XML_EXTENDED: 与XML大体相同,但使用SQL语句和绑定变量.
设置audit_trail参数后,就可以使用数据库审计来捕获登录尝试、系统权限与对象权限的使用以及SQL命令的执行,还可以指定当这些事件成功和/或因权限控制而失败时是否对它们进行审计。审计对没有成功执行的命令特别有用,此时生成的任何记录都会说明用户试图违反自己的访问权限。
使用audit命令可以配置数据库审计:
SQL> audit create any trigger;
SQL> audit select any table by session;
SQL> audit select any table by access;
-- by session审计会为违反审计条件的每个会话生成一条审计记录,不考虑违反条件的次数.
-- by access为每次违反条件的情况生成一条记录。
SQL> audit insert on ar.hz_parties whenever successful; -- 在指定表插入一行就会生成审计记录
SQL> audit all on ar.ra_interface_lines_all; -- 审计针对指定表执行DDL语句的每个会话.
-- whenever successful 审计记录限制为操作成功的记录
-- whenever not successful
SQL> audit session whenever not successful; -- 审计登录
三.使用触发器执行基于值的审计
数据库审计可以捕获到针对某个表执行一条命令的事实,但是没有跟踪受影响的行。例如,如果执行audit insert on hr.employees命令,只要在指定表中插入一行就会生成一条审计记录,但是该审计记录不会包含插入行的实际值。有些时候,我们希望捕获这些实际值,此时就需要使用数据库触发器。
CREATE OR REPLACE TRIGGER system.creditrating_audit
AFTER UPDATE OF creditrating
ON oe.customers
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :old.creditrating != :new.creditrating THEN
INSERT INTO system.creditrating_audit VALUES(sys_context('userenv','os_user'),sys_context('userenv','ip_address'),:new.cust_id||' credite trating changed from '||:old.creditrating||' to '||:new.creditrating);
END IF;
END;
/