Oracle 审计功能 Audit

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值