2014-08-15 Created By BaoXinjian
1、什么是审计
(1). 简单来讲,就是把对数据库的操作记录下来。不管你是否打开数据库的审计功能,以下这些操作系统会强制记录。
- 用管理员权限连接Instance
- 启动数据库
- 关闭数据库
(2).记录对数据对象的所有操作。什么时候,什么用户对对象做出了什么类型的操作。默认情况下审计是关闭的。
- 可以记录对数据库对象的所有操作。什么时候,什么用户对什么对象进行了什么类型的操作。
- 但是无法得知操作的细节,比如到底数据更新成了1还是2。
- 不过现在新出现的精细审计(Fine grained Auditing),好像也可以记录DML语句了。
(3). 审计的一些理解
1. 对于权限审计和大部分语句,by session无效,无论指定by session/by access还是不指定,审计都自动为by access。
2. 审计的语句级可以指定ALL,但是ALL只包括大部分语句,它不包括下面这些语句。
ALTER SEQUENCE,ALTER TABLE, COMMENT TABLE, DELETE TABLE, EXECUTE PROCEDURE, GRANT DIRECTORY, GRANT PROCEDURE, GRANT SEQUENCE, GRANT TABLE, GRANT TYPE, INSERT TABLE, LOCK TABLE, SELECT SEQUENCE, SELECT TABLE, UPDATE TABLE
3. 对于语句和权限审计,生效从执行语句后下一个登陆用户开始,当前的所有session不受影响。而对象的审计,则从审计语句开始后对当前所有的用户生效。
4. 可以使用NOAUDIT ALL、NOAUDIT ALL PRIVILEGE取消所有的语句、权限的审计,但是如果在审计的时候指定了用户,则NOAUDIT ALL或NOAUDIT ALL PRIVILEGE的时候,不会取消这些明确用户的审计,必须在NOAUDIT的时候也明确的指出相应的用户。
2、和审计相关的三个主要参数
(1). Audit_sys_operations
默认为false,当设置为true时,所有(注意是所有!)sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录
audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。
如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中
(2). Audit_trail
有三个取值
- None :默认值,不做审计
- DB :将audit trail 记录在数据库的审计相关表中,如aud$
- OS :将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定
注:这两个参数是static参数,需要重新启动数据库才能生效。
(3). Audit_file_dest
存放审计日志的目录
3、审计级别
当开启审计功能后(audit_trail=DB/OS),可在三个级别对数据库进行审计:Statement(语句) 、Privilege(权限)、object(对象)
(1). Statement
按语句来审计,
比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。
(2). Privilege
按权限来审计,当用户使用了该权限则被审计,
如执行grant select any table to a; audit select any table;语句后,当用户a 访问了用户b的表时(如select * from b.t;)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。
(3). 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反之。 省略该子句的话,不管操作成功与否都会审计。
Syntax Auditing SQL:
AUDIT ALL|ALL PRIVILEGES|sql_statement|system_priv [options]
Options:
BY user
BY proxy [ON BEHALF OF ANY|user]
BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]
Syntax for Auditing Objects:
AUDIT action on schema.object BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]
AUDIT action on DEFAULT BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]
AUDIT action on DIRECTORY dir_name BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]
Where actions is any of
ALTER, AUDIT, COMMENT, DELETE, EXECUTE, GRANT, INDEX, INSERT, LOCK, RENAME, SELECT, UPDATE
5、和审计相关的视图
(1). dba_audit_trail
保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一个子集。
(2). dba_stmt_audit_opts
可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似
(3). all_def_audit_opts
用来查看数据库用on default子句设置了哪些默认对象审计。
(4). 其他视图表
DBA_OBJ_AUDIT_OPTS: 视图,表以及其他数据库对象的审计信息;
DBA_PRIV_AUDIT_OPTS:所有特权的审计信息
DBA_STMI_AUDIT_OPTS:所有语句的审计信息;
DBA_DEP_AUDIT_OPTS:缺省的审计列表;
SYS.AUD$ 是唯一保留审计结果的表。其它的都是视图。
STMT_AUDIT_OPTION_MAP 包含有关审计选项类型代码的信息由SQL.BSQ 脚本在CREATEDATABASE 的时候创建
AUDIT_ACTIONS 包含对审计跟踪动作类型代码的说明
ALL_DEF_AUDIT_OPTS 包含默认对象审计选项。当创建对象时将应用这些选项
DBA_STMT_AUDIT_OPTS 描述由用户设置的跨系统的当前系统审计选项
DBA_PRIV_AUDIT_OPTS 描述由用户正在审计的跨系统的当前系统权限
DBA_OBJ_AUDIT_OPTS 描述在所有对象上的审计选项
USER_OBJ_AUDIT_OPTS USER 视图描述当前用户拥有的所有对象上的审计选项
以下是审计记录
DBA_AUDIT_TRAIL 列出所有审计跟踪条目
USER_AUDIT_TRAIL USER视图显示与当前用户有关的审计跟踪条目
DBA_AUDIT_OBJECT 包含系统中所有对象的审计跟踪记录
USER_AUDIT_ OBJECT USER 视图列出一些审计跟踪记录而这些记录涉及当前用户可以访问的对象的语句
DBA_AUDIT_SESSION 列出涉及CONNECT 和DISCONNECT 的所有审计跟踪记录
USER_AUDIT_ SESSION USER视图列出涉及当前用户的CONNECT 和DISCONNECT 的所有审计跟踪记录
DBA_AUDIT_STATEMENT 列出涉及数据库全部的GRANT REVOKE AUDIT NOAUDIT 和ALTER SYSTEM 语句的审计跟踪记录
USER_ AUDIT_ STATEMENT 对于USER 视图来说这些语句应是用户发布的
DBA_AUDIT_EXISTS 列出BY AUDIT NOT EXISTS 产生的审计跟踪条目
下面的视图用于细粒度审计
DBA_AUDIT_POLICIES 显示系统上的所有审计策略
DBA_FGA_AUDIT_TRAIL 列出基于值的审计的审计跟踪记录
6、取消审计
将对应审计语句的audit改为noaudit即可,如audit session whenever successful;取消审计noaudit session whenever successful;
7. 启动Audit
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表空间又足够的空间存放审计信息。
安装后要重启数据库
7. Audit策略实现
案例:创建测试表,通过Insert, Update, Delete加入Audit策略,监控表的增删改情况
Step1. 创建测试表
CREATE TABLE bxj_test_audit
(
invoice_id NUMBER,
invoice_num VARCHAR (50),
invoice_desc VARCHAR (200)
)
Step2. 加入细粒度监控Audit Polocy
BEGIN
DBMS_FGA.ADD_POLICY (object_schema => 'APPS',
object_name => 'BXJ_TEST_AUDIT',
policy_name => 'TEST_AUD_INSERT',
audit_column => 'invoice_id, invoice_num,invoice_desc',
enable => FALSE,
statement_types => 'INSERT');
END;
BEGIN
DBMS_FGA.ADD_POLICY (object_schema => 'APPS',
object_name => 'BXJ_TEST_AUDIT',
policy_name => 'TEST_AUD_UPDATE',
audit_column => 'invoice_id, invoice_num,invoice_desc',
enable => FALSE,
statement_types => 'UPDATE');
END;
BEGIN
DBMS_FGA.ADD_POLICY (object_schema => 'APPS',
object_name => 'BXJ_TEST_AUDIT',
policy_name => 'TEST_AUD_DELETE',
audit_column => 'invoice_id, invoice_num,invoice_desc',
enable => FALSE,
statement_types => 'DELETE');
END;
Step3. 启用细粒度监控Audit Polocy
BEGIN
DBMS_FGA.ENABLE_POLICY (object_schema => 'APPS',
object_name => 'BXJ_TEST_AUDIT',
policy_name => 'TEST_AUD_INSERT');
END;
BEGIN
DBMS_FGA.ENABLE_POLICY (object_schema => 'APPS',
object_name => 'BXJ_TEST_AUDIT',
policy_name => 'TEST_AUD_UPDATE');
END;
BEGIN
DBMS_FGA.ENABLE_POLICY (object_schema => 'APPS',
object_name => 'BXJ_TEST_AUDIT',
policy_name => 'TEST_AUD_DELETE');
END;
Step4. 对表进行增删改
insert into bxj_test_audit values (2,'2014-08-22 001', 'PAY THE TAXI FOR 2014-0822');
update bxj_test_audit set invoice_id = 1 where invoice_id = 2;
delete from bxj_test_audit where invoice_id = 1;
Step5. 查看监控表
Step6. 关闭细粒度监控策略
SQL> exec DBMS_FGA.DISABLE_POLICY(object_schema=>'LPPMTEST' ,object_name=>'TEST' ,policy_name=>'TEST_AUD');
SQL> EXEC DBMS_FGA.DROP_POLICY(object_schema=>'LPPMTEST' ,object_name=>'TEST' ,policy_name=>'TEST_AUD');
Thanks and Regards