1、1、什么是审计审计(Audit)用于监视用户所执行的数据库操作,并且 Oracle 会将审计跟踪结果存放到 OS 文件(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)或数据库(存储在 system 表空间中的SYS.AUD$表中,可通过视图 dba_audit_trail 查看)中。默认情况下审计是没有开启的。不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接 Instance;启动数据库;关闭数据库。2、和审计相关的两个主要参数Audit_sys_operations:默认为 false,当设置为 true 时,所有 sys
2、用户(包括以 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_
3、Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;OS:将 audit trail 记录在操作系统文件中,文件名由 audit_file_dest 参数指定;XML:10g 里新增的。注:这两个参数是 static 参数,需要重新启动数据库才能生效。3、审计级别当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege (权限)、object(对象)。Statement:按语句来审计,比如 audit table 会审计数据库中所有的 create table,drop table,truncate table 语句,alter se
4、ssion by cmy 会审计 cmy 用户所有的数据库连接。Privilege:按权限来审计,当用户使用了该权限则被审计,如执行 grant select any table to a,当执行了 audit select any table 语句后,当用户 a 访问了用户 b 的表时(如 select * from b.t)会用到 select any table 权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。Object:按对象审计,只审计 on 关键字指定对象的相关操作,如 aduit alter,delete,drop,insert on cmy.t b
5、y scott; 这里会对 cmy 用户的 t 表进行审计,但同时使用了 by 子句,所以只会对 scott 用户发起的操作进行审计。注意 Oracle 没有提供对 schema 中所有对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle 则提供 on default 子句来实现自动审计,比如执行 audit drop on default by access;后, 对于随后创建的对象的 drop 操作都会审计。但这个 default 会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比 trigger 可以对 schema 的 DDL 进行“审计
6、”,这个功能稍显不足。4、审计的一些其他选项by access / by session:by access 每一个被审计的操作都会生成一条 audit trail。 by session 一个会话里面同类型的操作只会生成一条 audit trail,默认为 by session。whenever not successful:whenever successful 操作成功(dba_audit_trail 中 returncode 字段为 0) 才审计,whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。5、和审计相关的视图dba_audit_tr
7、ail:保存所有的 audit trail,实际上它只是一个基于 aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement 都只是 dba_audit_trail 的一个子集。dba_stmt_audit_opts:可以用来查看 statement 审计级别的 audit options,即数据库设置过哪些statement 级别的审计。 dba_obj_audit_opts,dba_priv_audit_opts 视图功能与之类似all_def_audit_opts:用来查看数据库用 on default 子句设置
8、了哪些默认对象审计。6、取消审计将对应审计语句的 audit 改为 noaudit 即可,如 audit session whenever successful 对应的取消审计语句为 noaudit session whenever successful;8、实例讲解8.1、激活审计sqlplus / as sysdba SQL show parameter auditNAME TYPE VALUE- - -audit_file_dest string /u01/app/oracle/admin/ORCL/adumpaudit_sys_operations boolean FALSEaudit
9、_syslog_level stringaudit_trail string NONESQL alter system set audit_sys_operations=TRUE scope=spfile; -审计管理用户(以sysdba/sysoper 角色登陆)SQL alter system set audit_trail=db_extended scope=spfile;SQL startup force;SQL show parameter auditNAME TYPE VALUE- - -audit_file_dest string /u01/app/oracle/admin/OR
10、CL/adumpaudit_sys_operations boolean TRUEaudit_syslog_level stringaudit_trail string DB_EXTENDED 8.2、开始审计sqlplus / as sysdba-记录对一个表的所有操作SQL audit all on t_test;SQL conn u_testSQL select * from t_test;SQL insert into u_test.t_test (c2,c5) values (test1,2);SQL commit;SQL delete from u_test.t_test;SQL
11、commit;SQL conn /as sysdbaSQL select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_bind,sql_text from dba_audit_trail;sql audit select table by u_test by access;如果在命令后面添加 by user 则只对 user 的操作进行审计,如果省去 by 用户,则对系统中所有的用户进行审计(不包含 sys 用户).例:AUDIT DEL
12、ETE ANY TABLE; -审计删除表的操作AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL; -只审计删除失败的情况AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL; -只审计删除成功的情况AUDIT DELETE,UPDATE,INSERT ON user.table by test; -审计 test 用户对表 user.table 的delete,update,insert 操作8.3、撤销审计SQL noaudit all on t_test;9、审计语句多层环境下的审计:appserve- 应用服务
13、器,jackson-clientAUDIT SELECT TABLE BY appserve ON BEHALF OF jackson;审计连接或断开连接:AUDIT SESSION;AUDIT SESSION BY jeff, lori; - 指定用户审计权限(使用该权限才能执行的操作 ):AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;AUDIT DELETE ANY TABLE;AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY ACCE
14、SS WHENEVER NOT SUCCESSFUL;对象审计:AUDIT DELETE ON jeff.emp;AUDIT SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;取消审计:NOAUDIT session;NOAUDIT session BY jeff, lori;NOAUDIT DELETE ANY TABLE;NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;NOAUDIT ALL; - 取消所有 stateme
15、nt 审计NOAUDIT ALL PRIVILEGES; - 取消所有权限审计NOAUDIT ALL ON DEFAULT; - 取消所有对象审计10、清除审计信息DELETE FROM SYS.AUD$;DELETE FROM SYS.AUD$ WHERE obj$name=EMP;11、审计视图STMT_AUDIT_OPTION_MAP - 审计选项类型代码AUDIT_ACTIONS - action 代码ALL_DEF_AUDIT_OPTS - 对象创建时默认的对象审计选项DBA_STMT_AUDIT_OPTS - 当前数据库系统审计选项DBA_PRIV_AUDIT_OPTS - 权限审
16、计选项DBA_OBJ_AUDIT_OPTS USER_OBJ_AUDIT_OPTS ; - 对象审计选项DBA_AUDIT_TRAIL USER_AUDIT_TRAIL - 审计记录DBA_AUDIT_OBJECT USER_AUDIT_OBJECT - 审计对象列表DBA_AUDIT_SESSION USER_AUDIT_SESSION - session 审计DBA_AUDIT_STATEMENT USER_AUDIT_STATEMENT - 语句审计DBA_AUDIT_EXISTS - 使用 BY AUDIT NOT EXISTS 选项的审计DBA_AUDIT_POLICIES - 审计
17、 POLICIESDBA_COMMON_AUDIT_TRAIL - 标准审计+精细审计12、将审计结果表从 system 表空间里移动到别的表空间上实际上 sys.aud$表上包含了两个 lob 字段,并不是简单的 move table 就可以。下面是具体的过程:alter table sys.aud$ move tablespace users;alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);alter index sys.I_AUD1 rebuild tablespace u