审计=强制审计、标准审计、细粒度审计
强制审计:
就算关闭了标准审计,startup、shutdown、以as sysdba权限连接DB的操作,无论如何都会记录,记录存放在audit_file_dest参数对应目录的XX.aud文件中
标准审计:
日常所说的审计默认就是指标准审计,使用audit、noaudit命令来操作的审计操作
查询标准审计结果时,使用DBA_AUDIT_TRAIL视图比SYS.AUD$直观
标准审计,如果审计数据存放在DB中,那么是存放在sys.aud$表中,其他DBA_AUDIT_开头的视图里的数据都是由sys.aud$所得,比如DBA_AUDIT_TRAIL、DBA_AUDIT_EXISTS、DBA_AUDIT_OBJECT、DBA_AUDIT_SESSION等。
开启标准审计
设置audit_trail参数不等于none即开启了标准审计
none:Disables standard auditing
os:Directs all audit records to an operating system file
db:Directs audit records to the database audit trail (the SYS.AUD$ table)
audit_file_dest
AUDIT_FILE_DEST specifies the operating system directory into which the audit trail is written when the AUDIT_TRAIL initialization parameter is set to os, xml, or xml,extended.
AUDIT_FILE_DEST参数值指定当AUDIT_TRAIL初始化参数设置为os、xml或xml extended时,将审计记录写入的路径。
默认值ORACLE_BASE/admin/ORACLE_SID/adump
ALL_DEF_AUDIT_OPTS:包含系统默认的审计选项。
DBA_STMT_AUDIT_OPTS:包含已经设置的审计选项。
DBA_PRIV_AUDIT_OPTS:包含已经设置的权限审计选项。
DBA_OBJ_AUDIT_OPTS:包含已经设置的对象审计选项。
WHENEVER SUCCESSFUL | WHENEVER NOT SUCCESSFUL:选项WHENEVER SUCCESSFUL 指要审计成功执行的语句,而WHENEVER NOT SUCCESSFUL 指要审计执行失败的语句。如果忽略这两个选项,则无论成功与否都要审计。
BY SESSION:该选项表示在同一个会话中对相同类型的语句或同一对象的相同操作只生成一条审计记录。BY SESSION 是默认选项。
BY 用户名:指定审计某个用户的操作 。
BY ACCESS:该选项表示每次执行语句都会生成一条审计记录。如果审计DDL 语句或DDL 权限,那么无论是否指定BY ACCSS 选项,Oracle 总是使用BY ACCESS选项。
标准审计级别
语句级审计 :审计特定类型的SQL 语句,而不去考虑该语句作用于哪个对象。
默认对所有用户进行审计,可以单独对某个用户进行上述审计,加上by username就可以了
--需要注意的是,当指定了语句审计之后,只会对将来会话起作用,而 对当前会话不起作用 。
比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,audit session by hr会审计hr用户所有的数据库连接。
权限级审计 :审计系统权限的使用,例如审计CREATE ANY TRIGGER 系统权限。
默认对所有用户进行审计,可以单独对某个用户进行上述审计,加上by username就可以了
--需要注意的是,当指定了权限审计之后,只会对将来会话起作用,而 对当前会话不起作用 。
如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。
audit select any table by hr;只审计hr用户查询其他schema下的表的操作。
对象级审计 :审计在特定模式对象上所执行的特定操作,例如审计在表HR.EMPLOYEES 上的SELECT 操作。
默认对所有用户进行审计,不能单独对某个用户进行上述审计,加上by user会报错
Object auditing applies to all users but is limited to the audited object only
--需要注意的是,当指定了对象审计之后,不仅对将来会话起作用,而且 对当前会话也生效 。
如audit select,insert,delete on scott.emp; 这里会对scott用户的emp表进行审计
--此时不能使用by子句,对象审计总是对所有用户设定的。
audit select,insert,delete on scott.emp by hr;--会报错
综上理解到无法只审计某个用户对某个对象的所有操作,即对象审计时是对所有用户设定的。但是一般我们可以使用语句审计,审计某个用户对所有表的DML操作。
SQL> audit delete table,update table,insert table by hr; --审计用户hr执行的所有DML操作,包括hr用户dml其他schema下的对象
SQL> audit select,update,insert,delete on scott.salgrade; --审计所有对salgrade工资表的操作
默认情况下,特权用户和SYS 用户的操作不会生成审计记录。如果需要审计,则设置AUDIT_SYS_OPERATIONS参数值为true
标准审计涉及的SQL
select * from DBA_STMT_AUDIT_OPTS
union
select * from DBA_PRIV_AUDIT_OPTS; --查询标准审计审计了哪些操作
select * from DBA_OBJ_AUDIT_OPTS; --查询标准审计审计了哪些对象
select * from DBA_AUDIT_TRAIL; --查询标准审计结果
select owner,segment_name,bytes/1024/1024 mb from dba_segments where segment_name='AUD$'; --查询标准审计记录在DB里面占用的空间
细粒度审计:
调用DBMS_FGA包,如果审计数据存放在DB中,那么是存放在表sys.fga_log$中,dba_fga_audit_trail视图是以sys.fga_log$为基础得来的。
DBMS_FGA.ADD_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2,
audit_condition VARCHAR2,
audit_column VARCHAR2,
handler_schema VARCHAR2,
handler_module VARCHAR2,
enable BOOLEAN,
statement_types VARCHAR2,
audit_trail BINARY_INTEGER IN DEFAULT,
audit_column_opts BINARY_INTEGER IN DEFAULT);
--audit_column_opts:
ANY_COLUMNS表示audit_column指定的任意一个字段被涉及到,就会记录
ALL_COLUMNS表示audit_column指定的所有字段被涉及到,就会记录
begin
DBMS_FGA.ADD_POLICY (
object_schema => 'scott',
object_name => 'emp',
policy_name => 'mypolicy1',
audit_condition => 'sal < 1000',
audit_column => 'comm,sal',
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => 'select',
audit_column_opts => DBMS_FGA.ALL_COLUMNS);
end;
select sal from scott.emp where sal < 1000--有两行记录
select * from sys.fga_log$--无结果,因为上面的语句只涉及了sal字段,而audit_column_opts是ALL_COLUMNS
begin
DBMS_FGA.ADD_POLICY (
object_schema => 'scott',
object_name => 'emp',
policy_name => 'mypolicy1',
audit_condition => 'sal < 1000',
audit_column => 'comm,sal',
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => 'select',
audit_column_opts => DBMS_FGA.ANY_COLUMNS);
end;
select sal from scott.emp where sal < 1000--有两行记录
select * from sys.fga_log$--有结果
begin
DBMS_FGA.ADD_POLICY (
object_schema => 'scott',
object_name => 'emp',
policy_name => 'mypolicy1',
audit_condition => 'sal < 100',
audit_column => 'comm,sal',
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => 'select',
audit_column_opts => DBMS_FGA.ANY_COLUMNS);
end;
truncate table sys.fga_log$
select sal from scott.emp where sal < 100--没有记录
select * from sys.fga_log$--无结果,因为上面的语句查询没有记录
select * from DBA_AUDIT_POLICIES; --查询设置了哪些细粒度审计
select * from dba_fga_audit_trail; --查询细粒度审计结果
select owner,segment_name,bytes/1024/1024 mb from dba_segments where segment_name='FGA_LOG$'; --查询细粒度审计记录在DB里面占用的空间
![](http://img.blog.itpub.net/blog/attachment/201612/9/30126024_14812844611QVJ.jpg?x-oss-process=style/bb)
![](http://img.blog.itpub.net/blog/attachment/201612/9/30126024_14812845021W16.jpg?x-oss-process=style/bb)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2130186/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30126024/viewspace-2130186/