暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle DBA FAQ:数据库审计和 AUD$ 的存储信息及故障处置

原创 易安珠 2020-02-10
3685

在 Oracle Database 11g 中,由于缺省的设置 AUD$ 经常会记录大量信息并持续增长,甚至可能引发和空间相关的数据库事故。

Oracle 数据库的审计是对选定的用户动作的监控和记录,通常用于:

  1. 审查可疑的活动。例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不成功地删除进行审计。
  2. 监视和收集关于指定数据库活动的数据。例如:DBA可收集哪些被修改、执行了多少次逻辑的I/O等统计数据。

ORACLE支持三种审计类型:

  1. 语句审计,对某种类型的SQL语句审计,不指定结构或对象。
  2. 特权审计,对执行相应动作的系统特权的使用审计。
  3. 对象审计,对一特殊模式对象上的指定语句的审计。

ORACLE所允许的审计选择限于下列方面:

  1. 审计语句的成功执行、不成功执行,或者其两者。
  2. 对每一用户会话审计语句执行一次或者对语句每次执行审计一次。
  3. 对全部用户或指定用户的活动的审计。

当数据库的审计是使能的,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。

下列步骤可以设置ORACLE的审计功能:

1. 修改参数文件(init.ora,如果使用服务器参数文件使用alter system set = scope=spfile|both,设置 AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下:

l         DB/TRUE:启动审计功能,并且把审计结果存放在数据库的 SYS.AUD$ 表中

l         OS:启动审计功能,并把审计结果存放在操作系统的审计信息中

l         DB_EXTENDED:具有DB/TRUE的功能,另外填写AUD$的SQLBIND和SQLTEXT字段

l         NONE/FALSE:关闭审计功能 
如果不希望开启审计,可以设置 AUDIT_TRAIL 参数为 NONE 。

2.如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST。

如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE_DEST所指定的目录下,并且文件名包含进程的PID。

比如:

    AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit  

    $ ls -l $ORACLE_HOME/rdbms/audit  
复制

注意:WINDOWS NT不使用AUDIT_FILE_DEST参数,如果使用OS设置,那么审计信息会存放在WINDOWS NT的事件日志里。

3. 确认审计相关的表是否已经安装

   SQLPLUS> connect / AS SYSDBA 

   SQLPLUS> select * from sys.aud$;  -- 没有记录返回  

   SQLPLUS> select * from dba_audit_trail; -- 没有记录返回 
复制

如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。

   SQLPLUS> connect / as sysdba 

   SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql  
复制

审计表缺省安装在SYSTEM表空间,要确保SYSTEM表空间又足够的空间存放审计信息。建议在这一步修改缺省表空间,避免对于SYSTEM的空间占用。

4. 关闭并重启数据库

5. 设置所需要的审计信息

下面是一个例子

   SQL> connect system/manager

   SQL> grant audit system to scott;     

   SQL> connect scott/tiger

   SQL> audit session;
复制

停止审计:

   SQL> noaudit session; 
复制

设置审计的实例:对试图尝试口令的访问的审计
本节讨论的是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:

1. 修改审计相关参数

2. 重启数据库

3. 设置审计信息

   SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL
复制

4. 查询AUD$

   select returncode, action#, userid, userhost, terminal from aud$
RETURNCODE    ACTION# USERID   USERHOST  TERMINAL

   ---------- ---------- -------- -------------------- --------------------

    1017        100      SCOTT    ATA-BR

    1017        100      SCOTT    ATA-BR

    1017        100      SCOTT    ATA-BR
复制

ORA-1017的含义为错误的用户名口令。通过查看AUD表可以清楚地看到ATA-BR尝试破译SCOTT的口令。可以通过下面一个存储过程来分析AUD表,找出可疑的信息:

create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)

is

USER_ID VARCHAR2(20);

cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')

  group by userid;

cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')

  from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;

ct PLS_INTEGER;

V_USERHOST VARCHAR2(40);

V_TERMINAL VARCHAR(40);

V_DATE VARCHAR2(40);

BEGIN

    OPEN C1;

    dbms_output.enable(1024000);

    LOOP

      FETCH C1 INTO USER_ID,CT;

      EXIT WHEN C1%NOTFOUND;

      IF(CT>=TIMES) THEN

        DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);

        OPEN C2;

        LOOP

          FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;

          DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);

          EXIT WHEN C2%NOTFOUND;

        END LOOP;

        close c2;

      END IF;

    END LOOP;

    close c1;

END;

/
复制

执行结果:

SQL>set serveroutput on;

SQL> execute auditlogin('2004-01-01',2);

USER BROKEN ALARM:SYS

        HOST:,TERM:JI,TIME:2004-09-22:11:08:00

        HOST:,TERM:JI,TIME:2004-09-22:11:08:01

        HOST:,TERM:JI,TIME:2004-09-22:11:09:29

        HOST:,TERM:JI,TIME:2004-09-22:11:09:29

 

PL/SQL 过程已成功完成。
复制

将审计相关的表移动到其他表空间
由于AUD表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD移动到其他的表空间上。可以使用下面的语句来进行移动:

sql>connect / as sysdba;

sql>alter table aud$ move tablespace <new tablespace>;

sql>alter index I_aud1 rebuild online tablespace <new tablespace>;

SQL> alter table audit$ move tablespace <new tablespace>;

SQL> alter index i_audit rebuild online tablespace <new tablespace>;

SQL> alter table audit_actions move tablespace <new tablespace>;

SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;
复制

监控 AUD$ 的空间增长,是 DBA的工作职责之一。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论