您的位置:首页 > 数据库 > Oracle

Oracle 审计功能 Audit

2010-04-19 20:58 459 查看
1、什么是审计


计(Audit)
用于监视用户所执行的数据库操作,

审计记录可存在数据字典表
(称为审计记录:

存储在system
表空间中的 
SYS.AUD$
表中,可通过视图
dba_audit_trail
查看

)或操作系统审计记录中(

默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/

).

默认情况下审计是没有开启的。


数据库的审计是使能的,在语句执行阶段产生审计记录。
审计记录包含有审计的操作、用户执行的操作、操作
的日期和时间等信息。


管你是否打开数据库的审计功能
,以下这些操作系统会强制记录:用管理员权限连接Instance
;启动数据库;关闭数据库。

 
Oracle审计功能

审计是对选定的用户动作的监
控和记录,通常用于:

    
审查可疑的活动。例如:数
据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不成功地删除进行审计。


视和收集关于指定数据库活动的数据。例如:DBA
可收集哪些被修改、执行了多少次逻辑的
I/O
等统计数据。

 
ORACLE
所允许的审计选择限于下列方面:

   
审计语句的成功执行、不成
功执行,或者其两者。

   
对每一用户会话审计语句执
行一次或者对语句每次执行审计一次。

   
对全部用户或指定用户的活
动的审计。

 
审计相关的表安装

 
  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
表空间又足够的空间存放审
计信息。

  
 
安装后要重启数据库

 
将审计相关的表移动到其他表空间

 
由于
AUD$
表等审计相关的表存放在
SYSTEM
表空间,因此为了不影响系
统的性能,保护
SYSTEM
表空间,最好把
AUD$
移动到其他的表空间上。可以使用下面的语句来进行移动:

 

sql>connect / as sysdba;

sql>alter table aud$ move tablespace <new tablespace>;

sql>alter index I_aud1 rebuild online tablespace <new tablespace>;

SQL> alter table audit$ move tablespace <new tablespace>;

SQL> alter index i_audit rebuild online tablespace <new tablespace>;

SQL> alter table audit_actions move tablespace <new tablespace>;

SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;

 
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
(对象)。

 
3.1  
Statement:

语句审计,
对某种类型的SQL
语句审计,不指定结构或对象。

比如audit table 
会审计数据库中所有的
create table,drop table,truncate table
语句,
alter session by cmy
会审计
cmy
用户所有的数据库连接。 

3.2  
Privilege:

权限审计,当用户使用了该权
限则被审计,如执行grant select any table to a
,当执行了
audit select any table

句后,当用户

访问了用户
b
的表时(如
select * from b.t
)会用到
select any table
权限,故会被审计。注
意用户是自己表的所有者,所以用户访问自己的表不会被审计。 

特权审计。

3.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、审计的一些其
他选项

4.1 
by access / by session:

by access
 
 每一个被审计的操作都会生
成一条audit trail


by session 一个会话里面同类型的操作只会生成一条
audit trail
,默认为
by session


 
4.2 
whenever [not] successful:

whenever successful 操作成功
(dba_audit_trail

returncode
字段为
0) 
才审计
,

whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。

 
5、和审计相关的
视图

5.1 
dba_audit_trail:

保存所有的audit trail
,实际上它只是一个基于
aud$
的视图。其它的视图
dba_audit_session,dba_audit_object, dba_audit_statement
都只是
dba_audit_trail
的一个子集。

 
5.2 
dba_stmt_audit_opts:

可以用来查看statement
审计级别的
audit options
,即数据库设置过哪些
statement
级别的审计。
dba_obj_audit_opts,dba_priv_audit_opts
视图功能与之类似

 
5.3 
all_def_audit_opts:

用来查看数据库用on default
子句设置了哪些默认对象审计。

 
6、取消审计

将对应审计语句的audit
改为
noaudit
即可,

如audit session whenever successful

对应的取消审计语句为noaudit session whenever successful;

 
7、
10g
中的审计告知一切

Oracle 数据库 
10g 
审计以一种非常详细的级别捕获用户行为,它可以
消除手动的、基于触发器的审计。

假定用户 Joe 
具有更新那张表的权限,并按如下所示的方式更新了表中的一行数据:

update SCOTT
.
EMP set salary = 12000 where empno = 123456;

 
您如何在数据库中跟踪这种行
为呢?在 Oracle 9i 
数据库及其较低版本中,审计只能捕获



执行此操作,而不能捕获执行了

什么

内容。例如,它让您知道 
Joe 
更新了 
SCOTT 
所有的表
EMP
,但它不会显示他更新了该表中员工号为 
123456 
的薪水列。它不会显示更改前的薪水列的值 
— 
要捕获如此详细的更改,您将不得不编写您自己的触发器来捕获更改前的值,或使用 
LogMiner 
将它们从存档日志中检索出来。

细粒度审计(FGA)

:精细审计

 
,是在 Oracle 9i 
中引入的,能够记录 
SCN 
号和行级的更改以重建旧的
数据,但是它们只能用于 
select 
语句,而不能用于 
DML 
,如 
update 

insert 

delete 
语句。因此,对于 
Oracle 
数据库 
10g 
之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方
法。

 
8.审计的
相关基本操作

 
8.1 
 审计功能的参数控制

audit_trail 参数的值可以设置为以下几种

1. NONE:不开启

2. DB:开启审计功能

3. OS:审计记录写入一个操作系统文件。

4. TRUE:与参数
DB
一样

5. FALSE:不开启审计功能。

这个参数是写道spfile
里面的,需要重启数据库

 
8.2 
 查看是否审计功能是否启动

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

 
8.3 
开启审计

SQL> conn /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> 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.4 
 关闭审计

SQL> conn /as sysdba

SQL> show parameter audit

SQL> alter system set audit_trail=none;

 
关闭审
计也需要
重启实例

 
9. 审计实例

 
9
.1
 
激活审计

SQL> conn sys/admin as sysdba

已连接。

SQL> show parameter audit

 
NAME                           TYPE        VALUE

------------------------------------
        
 ----------- ------------------------------

audit_file_dest                      string      D:/ORACLE/ADMIN/DBA/ADUMP

audit_sys_operations                 boolean     FALSE

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      D:/ORACLE/ADMIN/DBA/ADUMP

audit_sys_operations                 boolean     TRUE

audit_trail                          string      DB, EXTENDED

 
9
.2
 
开始审计

注意:
无法对 SYS 
用户操作执行 
audit 
或 
noaudit 
命令

 
SQL> conn 
 system
/
admin

SQL> audit all on test;

SQL> commit;

SQL> delete from test;

SQL> commit;

SQL> select OS_USERNAME,
USERNAME
,USERHOST,TERMINAL,TIMESTAMP,OWNER,

obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;

OS_USER USERNAME USERHOST   TERMINAL        TIMESTAMP      OWNER

------- 
  
-------- --------------- --------------- -------------- ----------------

user    SYSTEM   WORKGROUP/HFCC- HFCC-KF-3068    22-10月
-09     SYSTEM

SQL
> audit select table by 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 
SYSTEM
; --审计

SYSTEM
用户对表user.table

delete,update,insert
操作

 
9
.3
 
撤销审计

SQL> noaudit all on t_test;

 
 
 
10.
FGA
策略(
细粒度审计
)

DBMS_FGA是
SYS
用户的一个包

10.1 

加 FGA 
策略

-- 审计表

GRANT RESOURCE,CONNECT TO BANK IDENTIFIED BY BANK;

CREATE TABLE BANK.ACCOUNTS

(

  ACCT_NO NUMBER PRIMARY KEY,

  CUST_ID NUMBER NOT NULL ,

  BALANCE NUMBER(15,2) NULL

);

insert into bank.accounts values(1,1,10000);

insert into bank.accounts values(2,2,20000);

commit;

Begin

dbms_fga.drop_policy (

  object_schema=>
'
BANK',

  object_name=>'ACCOUNTS',

  policy_name=>'ACCOUNTS_ACCESS');

dbms_fga.add_policy (

  object_schema=>'BANK',

  object_name=>'ACCOUNTS',

  policy_name=>'ACCOUNTS_ACCESS');

end;

/

select * from bank.accounts;

select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

-- 审计列和审计条件


add_policy
中加入

--   audit_column => 'BALANCE'

--   audit_condition => 'BALANCE >= 11000'

Begin

dbms_fga.drop_policy (

  object_schema=>'BANK',

  object_name=>'ACCOUNTS',

  policy_name=>'ACCOUNTS_ACCESS');

dbms_fga.add_policy (

  object_schema=>'BANK',

  object_name=>'ACCOUNTS',

  audit_column => 'BALANCE',

  audit_condition => 'BALANCE >= 11000',

  policy_name=>'ACCOUNTS_ACCESS');

end;

/

select BALANCE from bank.accounts;

select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

10.2 

理 FGA 
策略

--要删除策略,您可以使用以下语句:

begin

dbms_fga.drop_policy (

object_schema => 'BANK',

object_name => 'ACCOUNTS',

policy_name => 'ACCOUNTS_ACCESS'

   );

end;

/

-- 对于更改策略而言,没有随取随用的解决方案。要更改策略中的任
何参数,必须删除策略,再使用更改后的参数添加策略。

-- 需要临时禁用审计收集 

— 例如,如果您希望将线索表移动到不同的表空间或者要删除线索表。您可以按如下方法禁用 
FGA 
策略:

begin

dbms_fga.enable_policy (

object_schema => 'BANK',

object_name => 'ACCOUNTS',

policy_name => 'ACCOUNTS_ACCESS',

enable => FALSE

   );

end;

/

-- 重新启用很简单 
enable =>; TRUE

--演示何时审计操作以及何时不审计操作的各种情况 
SQL 
语句 审计状态

select balance from 
bank.
accounts;   进行审计。用户选择了在添加策略时所指定的审计列 
BALANCE


select * from 
 bank.
accounts;      进行审计。即使用户没有明确指定列 
BALANCE


也隐含地选择了它。

select cust_id from 
bank.
accounts where balance < 10000; 进行审计。即使用户没有明确指定列 
BALANCE

where 
子句也隐含地选择了它。

select cust_id from 
bank.
accounts;   不进行审计。用户没有选择列 
BALANCE


select count(*) from 
bank.
accounts;  不进行审计。用户没有明确或隐含地选择列 
BALANCE


10.3  

理器模块

-- FGA 的功能不只是记录审计线索中的事件;
FGA 
还可以任意执行过程。

-- 过程可以执行一项操作,比如当用户从表中选择特定行时向审计者发送电子邮件警告,或者可以写到不同的
审计线索中。

-- 这种存储代码段可以是独立的过程或者是
程序包中的过程,称为策略的处理器模块。

-- 实
际上由于安全性原因,它不必与基表本身处于同一模式中,您可能希望特意将它放置在不同的模式中。

-- 由于只要 
SELECT 
出现时过程就会执行,非常类似于 
DML 
语句启动的触发器,您还可以将其看作 
SELECT 
语句触发器。

-- 以下参数指
定将一个处理器模块指定给策略:

--  handler_schema 拥有数据过程的模式

--  handler_module 过程名称

-- 处理器模块还可以采用程序包的名称来代替过程名称。在这种情况下,参数 
handler_module 
在 
package.procedure 
的格式中指定。

10.4  
FGA 数据字典视图

-- FGA 策略的定义位于数据字典视图 
DBA_AUDIT_POLICIES 
中。

-- 审计线索收集在 
SYS 
拥有的表 
FGA_LOG$ 
中。对于 
SYS 
拥有的任何原始表,此表上的某些视图以对用户
友好的方式显示信息。
DBA_FGA_AUDIT_TRAIL 
是该表上的一个视图。

-- 一个重要的列是 
SQL_BIND
,它指定查询中使用的绑定变量
的值 
— 
这是显著增强该工具功能的一项信息。

-- 另一个重要的列是 
SCN
,当发生特定的查询时,它记录系统更改
号。

-- 此信息用于识别用户在特定时间看到了什么,而不是现在
的值,它使用了闪回查询,这种查询能够显示在指定的 
SCN 
值时的数据。

10.5 

图和 FGA

-- 到目前为止已经讨论了在表上应用 
FGA
;现在让我们来看如何在视图上使用 
FGA
。假定在 
ACCOUNTS 
表上定义视图 
VW_ACCOUNTS 
如下:

create view bank.vw_accounts as select * from bank.accounts;

select * from bank.vw_accounts;

select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

10.5.1
 如
果您只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。

-- 通
过将视图名称而不是表的名称传递给打包的过程 
dbms_fga.add_policy 
中的参数 
object_name
,可以完成这项工作。

-- 随后 
DBA_FGA_AUDIT_TRAIL 
中的 
OBJECT_NAME 
列将显示视图的名称,并且不会出现有关表访问的附加记录。

10.6 

它用途

 
除了记录对表的选择访问,FGA 
还可用于某些其它情况:

--  您可以对数据仓库使用 
FGA
,以捕获特定的表、视图或物
化视图上发生的所有语句,这有助于计划索引。您不需要到 
V$SQL 
视图去获取这些信息。即使 
SQL 
语句已经超出了 
V$SQL 
的期限,在 
FGA 
审计线索中将会始终提供它。

--  由于 
FGA 
捕获绑定变量,它可以帮助您了解绑定变量值的模
式,这有助于设计直方图集合等。

--  处理器模
块可以向审计者或 
DBA 
发送警告,这有助于跟踪恶意应用程序。

--  由于 
FGA 
可以作为 
SELECT 
语句的触发器,您可以在需要这种功能的任何时候使用它。

结论

 FGA 在 
Oracle 
数据库中支持隐私和职能策略。因为审计发
生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 
SQL*Plus 
等工具或者应用
程序),都对操作进行审计,允许进行非常简单的设置。

数据字典视图 DBA_AUDIT_POLICIES 
中重要
的列

-----------------------------------------------------------------------

OBJECT_SCHEMA   对其定义了 
FGA 
策略的表或视图的所有者

OBJECT_NAME     表或视图的名称

POLICY_NAME     策略的名称 
— 
例如,
ACCOUNTS_ACCESS

POLICY_TEXT     在添加策略时指定的审计条件 
— 
例如,
BALANCE >;= 11000

POLICY_COLUMN   审计列 
— 
例如,
BALANCE

ENABLED         如果启用则为 
YES
,否则为 
NO  

PF_SCHEMA       拥有策略处理器模块的模式(如果存在)

PF_PACKAGE      处理器模块的程序包名称(如果存在)

PF_FUNCTION     处理器模块的过程名称(如果存在)

数据字典视图 DBA_FGA_AUDIT_TRAIL 
中重
要的列

-----------------------------------------------------------------------

SESSION_ID      审计会话标识符;与 
V$SESSION 
视图中的会话
标识符不同

TIMESTAMP       审计记录生成时的时间标记

DB_USER         发出查询的数据库用户

OS_USER         操作系统用户

USERHOST        用户连接的机器的主机名

CLIENT_ID       客户标识符(如果由对打包过程 
dbms_session.set_identifier 
的调用所设置)

EXT_NAME        外部认证的客户名称,如 
LDAP 
用户

OBJECT_SCHEMA   对该表的访问触发了审计的表所有者

OBJECT_NAME     对该表的 
SELECT 
操作触发了审计的表名称

POLICY_NAME     触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。在此情况下,该列显示哪
些行是由哪个策略插入的。
)

SCN             记录了审计的 
Oracle 
系统更改号

SQL_TEXT        由用户提交的 
SQL 
语句  

SQL_BIND        由 
SQL 
语句使用的绑定变量(如果存在)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息