利用Oracle审计功能记录数据库操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、什么是审计
审计Audit用于监视用户所执行的数据库操作;并且Oracle会将审计跟踪结果存放到OS文件默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/或数据库存储在system表空间中的SYS.AUD$表中;可通过视图
dba_audit_trail查看中..默认情况下审计是没有开启的..
不管你是否打开数据库的审计功能;以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库..
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参数;需要重新启动数据库才能生效..
3、审计级别
当开启审计功能后;可在三个级别对数据库进行审计:Statement语句、Privilege权限、object对象..
Statement:
按语句来审计;比如audit table 会审计数据库中所有的create table;drop table;truncate table语句;alter session 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 by scott; 这里会对cmy用户的t 表进行审计;但同时使用了by子句;所以只会对scott用户发起的操作进行审计..注意Oracle没有提供对schema中所有对象的审计功能;只能一个一个对象审计;对于后面创建的对象;Oracle则提供on default子句来实现自动审计;比如执行audit drop on default by access;后; 对于随后创建的对象的drop操作都会审计..但这个default会对之后创建的所有数据库对象有效;似乎没办法指定只对某个用户创建的对象有效;想比trigger可以对schema的DDL进行“审计”;这个功能稍显不足..
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_trail:保存所有的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子句设置了哪些默认对象审计..
6、取消审计
将对应审计语句的audit改为noaudit即可;如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;
8、实例讲解
8.1、激活审计
sqlplus / as sysdba
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
audit_file_dest string
/u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string NONE
SQL> 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 audit
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
audit_file_dest string
/u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string DB_EXTENDED 8.2、开始审计
sqlplus / as sysdba
--记录对一个表的所有操作
SQL> audit all on t_test;
SQL> conn u_test
SQL> 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> commit;
SQL> conn /as sysdba
SQL> 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 DELETE 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-应用服务器;jackson-client
AUDIT 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 ACCESS 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; -- 取消所有statement审计
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 -- 权限审计选项
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 -- 审计POLICIES
DBA_COMMON_AUDIT_TRAIL -- 标准审计+精细审计
12、将审计结果表从system表空间里移动到别的表空间上
实际上sys.aud$表上包含了两个lob字段;并不是简单的move table就可以..
下面是具体的过程:
alter table sys.aud$ move tablespace users;
alter table sys.aud$ move lobsqlbind store as tablespace USERS; alter table sys.aud$ move lobSQLTEXT store as tablespace USERS; alter index sys.I_AUD1 rebuild tablespace u。