Audit可以实现对于特定对象、特定SQL语句、特定权限的审计,其中对于SQL语句和系统权限的审计在概念上有时容易混淆起来,比如拿audit user与audit alter user作比较.
audit user是对SQL语句的审计,采用是简写的方式,相当于以下三条语句共同作用的结果:
audit alter user ;
audit create user ;
audit drop user;
即会对alter user、create user、drop user命令进行审计
Audit alter user是对alter user权限的审计,会对需要alter user权限才能执行的命令进行审计
上述两种方法在alter user操作审计上的区别按照官方文档的说法在于:
Audit user:会记录用户修改自己口令的操作,也会记录用户修改别人口令的操作
Audit alter user:仅会记录用户修改其它用户口令的操作(因为只有具备了alter user权限的用户才能修改其它用户口令),不记录用户修改自己口令的操作(因为用户修改自己的口令不需要alter user权限),所以这里再一次表明这是针对权限的审计而非语句本身的审计
下面做一个简单的测试来证明一下上面的结论
//AUDIT USER功能测试
///
#### MNG用户不具有alter user权限,分别对自己和其它用户的口令进行修改
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string XML, EXTENDED
--connect as SYS
audit user;
--connect as mng
--修改自己口令
alter user mng identified by asdf_1234 replace by old_password;
--生成的审计记录
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/oracleas/schema/dbserver_audittrail-11_2.xsd">
11.2
11230018726111
ryId>2014-09-17T00:59:53.715499ZMNGoracle
r>qc570709b14352420pts/31
e_Number>MNG4303FE00080015F5520
12690575177199617151977
alter user mng identified by ***********replace *
--修改其它用户的口令,返回ORA-01031错误,虽然mng用户没有alter user权限但对其它用户的操作仍会留下印迹,因为audit user后面没有跟随whenever successful表明对于成功和失败两种情况均进行审计
alter user zd identified by asdf_1234 replace by old_password;
--有审计记录
11230171032122
ryId>2014-09-17T02:58:25.205414ZMNGoracle
r>qc570709b20054834pts/21
e_Number>ZD431031126905885196416
17151977
alter user zd identified by *
注:1031表明这条命令没有正常结束,错误的原因是ORA-01031
--赋予mng用户alter user权限
--connect as SYS
grant alter user to mng;
--connect as mng
alter user zd identified by qwer_1234;
--语句被审计
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/oracleas/schema/dbserver_audittrail-11_2.xsd">
11.2
112300693991212014-09-17T01:41:15.946112ZMNGoracleqc570709b15860242pts/11ZD4303FE00000015F4EE01269058345177022617151977
alter user zd identified by *
注:0表明这条命令正常结束
//AUDIT ALTER USER功能测试
///
####关闭之前开启的所有审计,测试用户在不具备alter user权限,具备alter user权限这两种情况下的审计行为
--connect SYS
noaudit user;
revoke alter user from mng;
audit alter user;
--connect mng,修改自己和其它用户的口令都没有生成审计文件
alter user mng identified by yuhj_1234 replace mnbv_1234;
alter user zd identified by qwer_1234 replace fghf_1234;
--connect SYS
grant alter user to mng;
--connect mng,修改自己的口令也会被审计,这个和官方的结论稍有差异
alter user mng identified by knmf_5678 replace yuhj_1234;
alter user zd identified by knmf_5678;
--记录下来的审计信息
**修改自己口令的审计
11230106712133
ryId>2014-09-17T02:09:49.074621ZMNGoracle
r>qc570709b20644640pts/21
e_Number>MNG4303F900000014AE6C0
1269058848966622617151977
alter user mng identified by **********replace *
**修改其它用户口令的审计
11230106712144
ryId>2014-09-17T02:10:08.509927ZMNGoracle
r>qc570709b20644640pts/21
e_Number>ZD4303F800060014A82C0<
/Returncode>1269058848997422617151977
alter user zd identified by *
因此对于audit user和audit alter user在alter user命令审计上的区别可以简要概括如下:
Command
是否具有Alter user权限
是否审计修改自己口令的操作
是否审计修改其它用户口令的操作
Audit user
N
Y
Y
Y
Y
Y
Audit alter user
N
N
N
Y
Y
Y
我们再来测一下audit table和audit create any table,看看这两者的区别:
//AUDIT TABLE功能测试
///
####用户没有create any table权限,audit table只审计自己用户下的建表操作
--connect SYS
noaudit alter user;
revoke create any table from mng;
audit table;
--connect mng,创建自己的表,再创建别人的表,虽然没有create any table权限,也会审计创建其它用户表的记录
create table mng2 (id number);
create table zd.mng2 (id number);
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/oracleas/schema/dbserver_audittrail-11_2.xsd">
11.2
11230597860111
ryId>2014-09-18T02:49:17.827296ZMNGoracle
r>qc570709b13500864pts/21
e_Number>MNGUI1955
1269097431709340617151977
create table ui(col1 number)
11230597860122
ryId>2014-09-18T02:49:34.589832ZMNGoracle
r>qc570709b13500864pts/21
e_Number>ZDUI11031
12690974317219617151977
create table zd.ui(col1 number)
####用户具有create any table权限,audit table会同时审计自己用户下的建表操作和在其它用户下的建表操作
Create table t11(id number);
Create table zd.t11(id number);
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/oracleas/schema/dbserver_audittrail-11_2.xsd">
11.2
11230605035111
ryId>2014-09-18T02:54:22.229707ZMNGoracle
r>qc570709b16712244pts/21
e_Number>MNGT11103F600010014
182101269097431869540617151977
Create table t11(id number)
11230605035122
ryId>2014-09-18T02:54:22.433163ZMNGoracle
r>qc570709b16712244pts/21
e_Number>ZDT11103F7001600149
58901269097431870741617151977
Create table zd.t11(id number)
//AUDIT CREATE ANY TABLE功能测试
///
####用户不具备create any table权限,audit create any table的情况下,只记录在别的用户下建表的操作
--connect SYS
revoke create any table from mng;
noaudit table;
audit create any table;
--connect mng创建自己和其它用户下表的都没有生成审计
create table mng4 (id number);
create table zd.mng4 (id number);
####用户具备create any table权限,audit create any table的情况下,只记录在别的用户下建表的操作
--connect SYS
grant create any table to mng;
noaudit table;
audit create any table;
--connect mng 产生的审计记录中只看到创建其它用户下表的操作
create table mng5 (id number);
create table zd.mng5 (id number); --未记录创建自及用户下表的操作
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/oracleas/schema/dbserver_audittrail-11_2.xsd">
11.2
11230618196121
ryId>2014-09-18T03:34:46.207544ZMNGoracle
r>qc570709b12648702pts/21
e_Number>ZDMNG5103FF000F0016
4E0F01269100596513941617151977
create table zd.mng5 (id number)
因此对于audit table和audit create any table审计效果上的区别可以简要概括如下:
Command
是否具有create any table权限
是否审计在自己用户下建表的操作
是否审计在其它用户下建表的操作
audit table
N
Y
Y
Y
Y
Y
audit create any table
N
N
N
Y
N
Y
再深入一点,audit table会审计create table、drop table、truncate table这三类语句,如果我仅仅需要审计其中的create table语句,即使用Audit create table会出现什么结果:
--connect SYS
grant create any table to mng;
audit create table;
col audit_option format a30
set linesize 130
--看到系统自动将create table、create any table作为语句同时也作为权限进行审计
select audit_option,success,failure from dba_stmt_audit_opts;
AUDIT_OPTION SUCCESS FAILURE
------------------------------ ---------- ----------
CREATE TABLE BY ACCESS BY ACCESS
CREATE ANY TABLE BY ACCESS BY ACCESS
select * from dba_priv_audit_opts;
PRIVILEGE SUCCESS FAILURE
---------------------------------------- ---------- ----------
CREATE TABLE BY ACCESS BY ACCESS
CREATE ANY TABLE BY ACCESS BY ACCESS
--connect mng 产生的审计记录中只看到创建其它用户下表的操作
Create table mng7 (id number);
Create table zd.mng7(id number);
--生成的审计记录也证明了上述的观点
11230818872111
ryId>2014-09-18T05:07:17.548569ZMNGoracle
r>qc570709b15401590pts/21
e_Number>MNGMNG7103FF001B001
64F9601269100636527840617151977
>
Create table mng7 (id number)
11230818872122
ryId>2014-09-18T05:07:17.784559ZMNGoracle
r>qc570709b15401590pts/21
e_Number>ZDMNG7103FF000F0016
4E1F01269100636528641617151977
Create table zd.mng7(id number)
结论:在oracle的审计体系中,语句级的审计有两种写法一种是使用简写方式,比如执行
命令audit table则之后会对create table、drop table、truncate table三类操作进行审计,又
比如audit alter table仅会对alter table …语句进行审计,使用简写的方式是纯粹语句级别的
审计,不涉及到权限的问题。另一种就是Audit create table,这种写法既会对create table、
create any table语句进行审计,同时又因为Create table也是一种系统权限,所以也会对
create table、create any table权限进行审计,这种情况下语句级和权限级的审计是无法完全
区分清楚的。在SQL Language Reference中audit命令介绍里有关于哪些命令属于语句审计
哪些命令属于权限审计的详细定义大家可以参考一下
来自 “ ITPUB博客 ” ,