代码改变世界

针对Oracle的审计方案

2018-01-18 10:01  AlfredZhao  阅读(...)  评论(...编辑  收藏

主题:针对Oracle的审计方案
数据库环境:Oracle 11g
数据库审计需求:

1.需要对连接数据库的行为进行审计

需要对连接数据库的行为进行审计,其中包含例如审计那些错误密码登录等失败的登录行为。
主要关注查询的表就是aud$
比如查询最近一天使用错误密码登录的行为;

--aud$
select sessionid, userid, userhost, comment$text, spare1, ntimestamp#
  from aud$
 where returncode = 1017
   and ntimestamp# > sysdate - 1;

--dba_audit_trail
select *
  from dba_audit_trail
 where returncode = 1017
   and timestamp > sysdate - 1;

更多关于aud$的介绍可参考之前我总结过的文章:

2.需要对核心表的DML操作进行审计

需要对核心表的DML操作进行审计,首先强调下这是不推荐进行审计的,原因是这类审计极少客户会用,它不但会使得核心表的操作性能本身受到一定影响,还有可能触发相关bug。
假如jingyu用户下的T1表非常重要,需要对DML操作进行审计:

SYS@jyzhao1 >AUDIT DELETE,UPDATE,INSERT ON JINGYU.T1;

Audit succeeded.

查询审计结果(列较多,建议图形化工具查看):

SQL> select * from dba_audit_trail order by timestamp;

可以从结果看到所有DML操作都会对应一条action_name为“SESSION REC”的值。

3.需要迁移审计数据到指定表空间

创建新的表空间,比如TBS_AUDIT,然后迁移审计数据从默认的SYSTEM到TBS_AUDIT表空间;
核心步骤如下:

--查看当前AUD$对象所在的表空间
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME  
  FROM DBA_TABLES  
   WHERE TABLE_NAME = 'AUD$'  
   AND OWNER = 'SYS'; 

--更改AUD$表的表空间为其他表空间
BEGIN  
 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(  
  AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,   
  AUDIT_TRAIL_LOCATION_VALUE => '&AUD_TBS_NAME');  
END;  
/  

更多细节可参考之前我总结过的一则案例:

4.需要清理历史审计数据的方案

需要清理历史审计数据的方案:

--截断占用空间最大的AUD$表(需要和DBA确认后操作)
truncate table AUD$;

截断之前可以考虑备份一下审计数据:

Oracle导出sys用户下的系统表aud$:

exp system/oracle file=aud.dmp log=aud.log tables=sys.aud$

实际这个exp导出在测试环境遇到问题,不过最终解决了,具体细节可以参考: