审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件或数据库中。
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表空间又足够的空间存放审计信息。
安装后要重启数据库
将审计相关的表移动到其他表空间
由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动:
sql>connect / assysdba;
sql>alter table aud$move tablespace <new tablespace>;
sql>alter index I_aud1rebuild online tablespace <new tablespace>;
SQL> alter tableaudit$ move tablespace <new tablespace>;
SQL> alter indexi_audit rebuild online tablespace <new tablespace>;
SQL> alter tableaudit_actions move tablespace <new tablespace>;
SQL> alter indexi_audit_actions rebuild online tablespace <new tablespace>;
2、和审计相关的两个主要参数
Audit_sys_operations:
默认为false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。
Audit_trail:
None:是默认值,不做审计;
DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;
DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增的。
注:这两个参数是static参数,需要重新启动数据库才能生效。
1、使用审计,需要激活审计
SQL> conn /as sysdba
已连接。
SQL> show parameter audit_sys_operations;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_sys_operations boolean FALSE
SQL> show parameter audit_trail;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string NONE
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
系统已更改。
SQL> alter system set audit_trail=db scope=spfile;
系统已更改。
SQL> startup force
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 79692480 bytes
Database Buffers 201326592 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter audit;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string D:\ORACLE\PRODUCT\10.2.0\ADMIN
\ORCL\ADUMP
audit_sys_operations boolean TRUE
audit_trail string DB
2、审计dept表
SQL> audit all on dept;
审计已成功。
SQL> conn mzl/mzl
已连接。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS PanJin
80 mengzhaoliang beijing
SQL> insert into dept
2 values (90,'test','PanJin');
已创建 1 行。
SQL> commit;
提交完成。
SQL> conn scott/mzl
已连接。
SQL> insert into dept
2 values(60,'June','ShangHai');
已创建 1 行。
SQL> commit;
提交完成。
3、查看审计结果
SQL> conn /as sysdba
已连接。
SQL> select count(*) from dba_audit_trail;
COUNT(*)
----------
2
SQL> select username,ses_actions,obj_name,
2 to_char(timestamp,'YYYY-MM-DD HH24:MI:SS')
3 from dba_audit_trail;
USERNAME SES_ACTIONS
------------------------------ -------------------
OBJ_NAME
--------------------------------------------------------------------------------
TO_CHAR(TIMESTAMP,'
-------------------
MZL ------S--S------
DEPT
2008-10-20 10:28:08
SCOTT ------B---------
DEPT
2008-10-20 10:29:04
USERNAME SES_ACTIONS
------------------------------ -------------------
OBJ_NAME
--------------------------------------------------------------------------------
TO_CHAR(TIMESTAMP,'
-------------------
SQL> conn mzl/mzl
已连接。
4、禁止审计
SQL> noaudit all on dept;
审计未成功。
5、mzl用户为dba的用户,使用精细审计,这样可以知道具体的用户更新的数据
SQL> show user;
USER 为 "MZL"
6、审计dept表
SQL> exec dbms_fga.add_policy(object_name=>'dept',policy_name=>'chk_dept',-
> statement_types=>'insert,update,delete,select');
PL/SQL 过程已成功完成。
SQL> select count(*) from dba_fga_audit_trail;
COUNT(*)
----------
0
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS PanJin
60 June ShangHai
80 mengzhaoliang beijing
90 test PanJin
已选择7行。
SQL> delete dept where deptno=90;
已删除 1 行。
SQL> commit;
提交完成。
SQL> conn scott/mzl
已连接。
SQL> update dept set loc='PanJin' where deptno=60;
已更新 1 行。
SQL> commit;
提交完成。
SQL> conn mzl/mzl
已连接。
SQL> select count(*) from dba_fga_audit_trail;
COUNT(*)
----------
3
SQL> col sql_text for a40
SQL> l
1* select db_user,sql_text from dba_fga_audit_trail
SQL> /
DB_USER SQL_TEXT
------------------------------ ----------------------------------------
MZL select * from dept
MZL delete dept where deptno=90
SCOTT update dept set loc='PanJin' where deptn