ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle audit 审计功能说明

Oracle audit 审计功能说明

Linux操作系统 作者:keeptrying 时间:2013-11-05 10:31:00 0 删除 编辑
Dava的原文:http://blog.csdn.net/tianlesoftware/article/details/4712932

 

一、Audit说明

 

1.1 审计

审计(Audit)用于监视用户所执行的数据库操作。审计记录可存在数据字典表(称为审计记录:存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查看)或操作系统审计记录中(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)。

默认情况下审计是没有开启的。当数据库的审计是开启的,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接instance;启动数据库;关闭数据库。

1.1.1 Oracle审计功能

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

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

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

1.1.2 Oracle所允许的审计

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

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

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

1.1.3 审计相关的表安装

SQL> connect / as sysdba

已连接。

SQL> select * from sys.aud$;

 

未选定行

 

SQL> select * from dba_audit_trail;

 

未选定行

 

如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。安装方法如下:

SQL> connect / as sysdba

SQL> @$ORACLE_HOME/rdbms/admin/cataudit.sql

审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间有足够的空间存放审计信息。安装后要重启数据库。

 

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

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

SQL> connect / as sysdba

SQL> alter table AUD$ move tablespace ;

SQL> alter index I_AUD1 rebuild online tablespace ;

SQL> alter table AUDIT$ move tablespace ;

SQL> alter index I_AUDIT rebuild online tablespace ;

SQL> alter table AUDIT_ACTIONS move tablespace ;

SQL> alter index I_AUDIT_ACTIONS rebuild online tablespace ;

 

 

1.1.5 truncate或者delete sys.aud$

delete之前,可以先把aud$exp备份一下,注意,不要直接exp,先创建一张临时表,然后将临时表exp

SQL> create table audit_record tablespace users as select * from sys.aud$;

然后exp

exptables=AUDIT_RECORD file=audit_record.dmp

最后delete数据:

SQL> delete from sys.aud$;

或者删除指定表的审计:

SQL> delete from sys.aud$ where obj$name=&table_name;

注意,delete不会释放system表空间。可以使用truncate table

SQL> truncate table sys.aud$;

 

 

1.2 和审计相关的两个主要参数

1.2.1 audit_sys_operations

AUDIT_SYS_OPERATIONS enables or disables the auditing of operations issued by user SYS, and users connecting with SYSDBA or SYSOPER privileges. The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to XML.

On UNIX platforms, if the AUDIT_SYSLOG_LEVEL parameter has also been set, then it overrides the AUDIT_TRAIL parameter and SYS audit records are written to the system audit log using the SYSLOG utility.

AUDIT_SYS_OPERATIONS参数默认为false,当设置为true时,所有sys用户(包括以sysdbasysoper身份登录的用户)的操作都会被记录。audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动,aud$不可用,那么像conn / as sysdba这样的连接信息,只能记录在其它地方。如果是windows平台,audit trail会记录在windows的事件管理器中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。

SQL> show parameter audit_file_dest;

 

NAME                                 TYPE        VALUE

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

audit_file_dest            string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

 

 

1.2.2 audit_trail

AUDIT_TRAIL enables or disables database auditing.

Values:

·         none

Disables database auditing.(default)

·         os

Enables database auditing and directs all audit records to the operating system's audit trail.

·         db

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).

·         db,extended

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.

·         xml

Enables database auditing and writes all audit records to XML format OS files.

·         xml,extended

Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.

You can use the SQL statement AUDIT to set auditing options regardless of the setting of this parameter.

 

1.3审计级别

当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege(权限)、Object(对象)。

1.3.1 Statement

语句审计,对某种类型的SQL语句审计,不指定结构或对象。比如audit table会审计数据库中所有的create tabledrop tabletruncate table语句。audit session by cmy会审计cmy用户所有的数据库连接。

1.3.2 Privilege

权限审计,当用户使用了该权限则被审计。如执行grant select any table to a,当执行了audit select any table语句后,当用户a访问了用户b的表时(如select * from b.t),会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。

1.3.3 Object

对象审计,对一特殊模式对象上的指定语句的审计。如审计on关键字指定对象的相关操作,如audit 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可以对schemaDDL进行“审计”,这个功能稍显不足。

 

 

1.4审计的一些其他选项

1.4.1 by access / by session

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

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

 

1.4.2 whenever [not] successful

whenever successful:只审计操作成功(dba_audit_trailreturncode字段为0)的情况。

whenever not successful:只审计操作失败的情况。

如果忽略这个子句,则不管操作成功与否都审计。

 

 

1.5 和审计相关的视图

1.5.1 dba_audit_trail

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

1.5.2 dba_stmt_audit_opts

可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。

dba_obj_audit_optsdba_priv_audit_opts视图功能与之类似。

1.5.3 all_def_audit_opts

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

 

 

1.6 取消审计

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

audit session whenever successful,对应的取消审计语句改为noaudit session whenerer successful;

 

 

 

二、Fine-graind Auditing(FGA)细粒度审计

细粒度审计(FGA),是在Oracle 9i中引入的,能够记录SCN号和行级的更改以重建旧的数据。但是它们只能用于select语句,而不能用于DML,如updateinsertdelete语句。因此,对于Oracle数据库10g之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。10g之后版本可以audit所有DMLFGA的实现基于DBMS_FGA包,它属于SYS用户。

 

2.1 增加FGA策略

--审计表

SQL> 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;

 

 

 

2.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;

       进行审计。即使用户没有明确指定列 BALANCEwhere 子句也隐含地选择了它。

 

select cust_id from bank.accounts;  

       不进行审计。用户没有选择列 BALANCE

select count(*) from bank.accounts; 

       不进行审计。用户没有明确或隐含地选择列 BALANCE

 

2.3 处理器模块

FGA的功能不只是记录审计线索中的事件,FGA还可以任意执行过程。过程可以执行一项操作,比如当用户从表中选择特定行时向审计者发送电子邮件警告,或者可以写到不同的审计线索中。这种存储代码段可以是独立的过程或者是程序包中的过程,称为策略的处理器模块。

实际上由于安全性原因,它不必与基表本身处于同一模式中。您可能希望特意将它放置在不同的模式中。由于只要SELECT出现时过程就会执行,非常类似于DML语句启动的触发器,您还可以将其看做SELECT语句触发器。

 

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

1)、handler_schema拥有数据过程的模式

2)、handler_module过程名称

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

 

2.4 FGA数据字典视图

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

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

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

另一个重要的列是SCN,当发生特定的查询时,它记录系统更改号。此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的SCN值时的数据。

 

2.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;

 

如果只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称而不是表的名称传递给打包的过程dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。

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

 

 

 

2.6 其它用途

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

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

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

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

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

 

 

2.7 视图部分字段说明

2.7.1 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     处理器模块的过程名称(如果存在)

 

 

2.7.2 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 语句使用的绑定变量(如果存在)

 

 

小结:

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

 

 

 

 

四、相关示例

4.1 审计功能的参数控制

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

l   NONE:不开启;

l   DB:开启审计功能;

l   OS:审计记录写入一个操作系统文件;

l   TRUE:与参数DB一样;

l   FALSE:不开启审计功能。

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

 

4.2 查看审计功能是否启动

SQL> show parameter audit

NAME                                 TYPE        VALUE

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

audit_file_dest  string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations               boolean     FALSE

audit_trail                          string       NONE

 

4.3 开启审计

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      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations             boolean     TRUE

audit_trail                        string      DB, EXTENDED

 

4.4 关闭审计

SQL> alter system set audit_trail=none scope=spfile;

系统已更改。

关闭审计也需要重启实例。

 

4.5审计实例

4.5.1 激活审计

SQL> show parameter audit

NAME                                 TYPE        VALUE

------------------------------------ ----------- audit_file_dest  string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations                 boolean     FALSE

audit_trail                          string      NONE

 

SQL> alter system set audit_sys_operations=TRUE scope=spfile;

系统已更改。

SQL> alter system set audit_trail=db,extended scope=spfile;

系统已更改。

重启数据库。

SQL> show parameter audit

NAME                                 TYPE        VALUE

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

audit_file_dest                      string      E:\ORACLE\PRODUCT\10.2.0\ADMIN                                                 \ORCL\ADUMP

audit_sys_operations               boolean     TRUE

audit_trail                          string      DB, EXTENDED

 

4.5.2 开始审计

注意:无法对SYS用户操作执行auditnoaudit命令。

SQL> conn / as sysdba

已连接。

SQL> create table tb1(id int,name varchar2(10)) tablespace users;

表已创建。

SQL> insert into tb1 values(1,'a');

已创建 1 行。

 

SQL> commit;

提交完成。

SQL> grant delete on sys.tb1 to lxh;

授权成功。

SQL> audit all on tb1;

审计已成功。

 

SQL> commit;

提交完成。

SQL> conn lxh/lxh

已连接。

SQL> delete from sys.tb1;

已删除 1 行。

 

SQL> commit;

提交完成。

SQL> select * from dba_audit_trail

 

SQL> audit select table by tb1 by access;

如果在命令后面添加by user则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计,不包含sys用户。

例:

audit delete any table --审计删除表的操作

audit delete any table whenever successful;

                             --只审计删除成功的情况

audit delete any table whenever not successful;

                             --只审计删除失败的情况

audit delete,update,insert on user.table by system;

--审计system用户对表user.tabledeleteupdateinsert操作。

 

 

4.5.3 撤销审计

SQL> noaudit all on tb1;

 

 

 

 

 

 

 

 

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25744374/viewspace-775678/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-25

  • 博文量
    130
  • 访问量
    935657