ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 审计Oracle数据库的使用

审计Oracle数据库的使用

原创 Linux操作系统 作者:rongshiyuan 时间:2012-06-07 16:50:58 0 删除 编辑

审计Oracle数据库的使用

上一篇 / 下一篇 2011-11-25 17:20:28 / 个人分类:Oracle

仅使用权限、角色、视图、甚至细粒度安全策略建立访问控制系统还不能保证数据库的安全。审计数据库的使用能让我们知道访问控制机制是否确实像所希望的那样工作。审计涉及监控和记录用户的数据库活动。

Oracle提供了大量的审计类型的控制选择,可以再会话级或在整个数据库级进行审计。主要分为标准审计和细粒度审计,标准审计基于语句级、权限级和对象级。而细粒度审计涉及某种粒度的数据访问,或涉及基于内容的某些活动。

应该尽量使审计选项满足审计目的的最低要求。在审计打开时,应密切关注SYSTEM表空间和SYS.AUD$表。如果SYS.AUD$被填满,则数据库中进一步的连接和DML活动可能会停止。因此,应该定期归档和清除SYS.AUD$表中的记录。

1.标准审计

Oracle数据库允许在3中不同的级别上审计数据库的使用,这3中级别分别为:语句、权限和对象。语句级审计指定任意类型对象上所有活动的审计。权限级审计跟踪源于系统权限的活动。对象级审计监控特定表上的UPDATEDELETEINSERT等语句的活动。

1) 启用审计

为了审计数据库内的所有用户的活动,甚至是登陆数据库的活动,需要再初始化参数文件中指定AUDIT_TRAIL参数以启用审计。AUDIT_TRAIL参数可以取如下的值:

l NONE:禁用数据库审计。NONE为此参数的默认值。

l OS:指出Oracle将把审计记录写到一个操作系统文件中。

l DB:指出Oracle将把审计记录写入数据库审计跟踪,可视为DBA_AUDIT_TRAIL(存储在SYS.AUD$表中)。

l DB,EXTENDED:指出Oracle将把所有审计记录发送到数据库审计跟踪,除此之外,填充SQLBINDSQLTEXTCLOB列。

l XML:指定数据库审计,进入OS文件的是XML格式的审计记录。

l XML,EXTENDED:与XML设置相同,另外还记录所有审计跟踪列,包括SQLTEXTSQLBIND

如果指定AUDIT_TRAIL=OS,则审计跟踪不再数据库中存储审计信息,而是在由AUDIT_TRAIL_DEST参数指定的位置存储审计信息。如果指定AUDIT_TRAIL=OS且省略AUDIT_TRAIL_DEST参数,则默认将审计信息写到$ORACLE_HOME/rdbms/audit/目录中。

2) Oracle的默认审计

在没有指定AUDIT_TRAIL参数的默认情况下,Oracle也会将3种类型的数据库活动记录到$ORACLE_HOME/rdbms/audit目录中:

l 作为SYSOPERSYSDBA连接

l 数据库启动

l 数据库关闭

通常,审计文件捕获用户SYS(具有SYSDBA权限)进行的CONNECTSHUTDOWNSTARTUP事件。

3) 打开审计

一旦设置了AUDIT_TRAIL参数,就启用了数据库中的审计。但是,为了实际开始审计,还必须指定希望数据库审计哪些表和哪些活动。

可以使用恰当的命令开始任何级别的审计活动。示例如下:

SQL> audit select on employees;

SQL> audit delete any table by wjw whenever not successful;

SQL> audit update any table;

SQL> audit session by wjw;

SQL> audit select,insert,update,delete on employees by access whenever successful;

下面是一个更强的审计选项,它保证审计所有权限:

SQL> audit all privileges;

4) 关闭审计

为了关闭审计,可以使用几乎和打开审计相同的语句。示例如下:

SQL> noaudit session;

SQL> noaudit delete any table by wjw whenever not successful;

SQL> noaudit delete any table by wjw;

如果要关闭所有级别(语句、权限和对象)的审计,可以使用下面3条语句:

SQL> noaudit all; /*关闭所有语句审计*/

SQL> noaudit all privileges; /*关闭所有权限审计*/

SQL> noaudit all on default; /*关闭所有对象审计*/

5) 用触发器定制数据库审计

可以再Oracle中创建集中类型的触发器,包括DML触发器和DDL触发器以及系统级触发器。

a) 为审计使用基于DML的触发器:

SQL> create or replace trigger audit_insert_regions

after insert on hr.regions

for each row

insert into regions_audit

values(user,sysdate);

b) 为审计使用系统触发器:

Oracle提供了强有力的系统级触发器,如数据库启动之后、数据库关闭之前引发的触发器。登陆和退出触发器对数据库审计特别有用。

下面为一个记录用户登陆和退出数据库信息的系统级触发器示例:

(1) 创建一个记录登陆和退出数据库信息的表:

SQL> create table logon_audit(

user_id varchar2(30),

session_id number(10),

logon_time date,

logoff_time date,

host varchar2(20));

(2) 创建登陆触发器和退出触发器:

SQL> create or replace trigger logon_audit_trigger

after logon on database

begin

insert into logon_audit

values(user,

sys_context(‘userenv’,’sessionid’),

sysdate,

null,

sys_context(‘userenv’,’host’));

end;

SQL> create or replace trigger logoff_audit_trigger

after logoff on database

begin

insert into logon_audit values

(user,

sys_context(‘userenv’,’sessionid’),

null,

sysdata,

sys_context(‘userenv’,’host’));

end;

(3) 查看用户的登陆/退出信息:

SQL> select * from logon_audit;

c) 为审计使用DDL触发器:

可以用DDL触发器捕获用户对对象所做的更改,包括修改、创建和删除各种类型的对象。还可以捕获关于引发DDL触发器的时间和用户的大量属性。

(1) 创建一个记录修改DDL信息的表:

SQL> create table ddl_log(

username varchar2(20),

change_date date,

object_type varchar2(20),

object_owner varchar2(20),

database varchar2(20));

(2) 创建DDL触发器:

SQL> create or replace trigger ddl_log_trigger

after ddl on database

begin

insert into ddl_log values

(ora_login_user,

sysdate,

ora_dict_obj_type,

ora_dict_obj_owner,

ora_database_name);

end;

(3) 查看用户修改DDL信息:

SQL> select * from ddl_log;

2. 细粒度审计

Oracle允许基于内容审计数据库中的活动,即可以规定只针对满足一定条件的语句而不是所有的SELECTINSERTUPDATEDELETE语句来写审计记录。可以对想监控的个别的表或特定的操作应用细粒度审计(FGA)。

使用FGA只需要dbms_fga程序包上的权限。在使用DBMS_FGA程序包时,审计记录不进入标准的SYS.AUD$审计表,即使打开了数据库的审计跟踪也是如此。审计记录进入一个名为SYS.FGA_AUD$的表。

1) 启用细粒度审计

使用FGA不需要打开数据库范围的审计,因为这种审计是基于表访问的。FGA记录可以通过DBA_FGA_AUDIT_TRAILDBA_COMMON_AUDIT_TRIAL视图来访问,后一个视图组合了标准和细粒度审计日志记录。

DBMS_FGA程序包的ADD_POLICY过程来添加细粒度审计策略。下面为该过程的结构。

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

以下是ADD_POLICY过程的参数说明:

l object_schema:待审计的对象的模式;默认为NULL,表示登陆用户的模式。

l object_name:待审计的对象的名称。

l policy_name:用户给出的审计策略名。

l audit_condition:行内的条件,指出一个监控条件;默认为NULL,其作用于TRUE相同。

l audit_column:希望审计的列访问;默认为NULL,表示所有列访问都要审计;audit_column_opts参数与这个参数结合使用。

l handler_schema:包含事件处理程序的模式;默认为NULL,表示当前模式。

l handler_module:过程或程序包名。

l enable:此参数启用和禁用策略;默认值为TRUE,表示启用策略。

l statement_types:此策略可以应用的SQL语句类型:insertupdatedeleteselect。默认为select

l audit_trail:指出是否填写fga_log$表中的lsqltextlsqlbind的参数;DB设置不填写这两个列;默认值为DB_EXTENDED,它填写这两个列。

l audit_column_opts:确定查询引用audit_column参数中指定的列或所有列时,是否实施审计;设置为DBMS_FGA.ALL_COLUMNS,则语句只在引用audit_column参数中指定的所有列时进行审计;默认为DBMS_FGA.ANY_COLUMNS,表示如果语句引用audit_column参数指定的任何列时进行审计。

2) 使用细粒度审计

下面的FGA示例审计hr.exp表上任何访问sales部门的任何雇员的salary列的DML语句:

SQL> execute dbms_fga.add_policy(

object_schema => 'hr',

object_name => 'emp',

policy_name => 'chk_hr_emp',

audit_condition => 'dept = ''sales'' ',

audit_column => 'salary',

statement_types => 'insert,update,delete,select',

handler_schema => 'sec',

handler_module => 'log_id',

enable => true);

3) 查看审计跟踪

如果在数据库中使用FGA,则DBA_FGA_AUDIT_TRAIL视图显示审计跟踪(存储在sys.fga_aud$表中)。

SQL> select timestamp,db_user,os_user,object_schema,object_name,sql_text

from dba_fga_audit_trial;

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

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

注册时间:2009-11-24

  • 博文量
    798
  • 访问量
    3122976