Oracle Audit 审计总结

一、概述

oracle 审计功能总结

二、 Audit说明

2.1 审计

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

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

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

2.1.1 Oracle审计功能

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

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

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

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

审计语句的成功执行、不成功执行,或者其两者。对每一用户会话审计语句执行一次或者对语句每次执行审计一次。 对全部用户或指定用户的活动的审计。

2.1.3 审计相关的表安装

 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表空间又足够的空间存放审计信息。安装后要重启数据库

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

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

sql>connect / as sysdba;

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

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

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

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

SQL> alter table audit_actions movetablespace <new tablespace>;

SQL> alter index i_audit_actions rebuildonline tablespace <new tablespace>;

2.1.5 truncate 或者 delete sys.aud$ 表

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

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

然后exp:

   exp tables=AUDIT_RECORD file=audit_record.dmp

最后delete 数据:

sql>delete from sys.aud$;

或者删除指定表的审计:

sql>delete from sys.aud$ where obj$name='&table_nmae';

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

sql>truncate table sys.aud$

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

2.2.1 Audit_sys_operations

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

 SYS@dave2(db2)> show parameteraudit_file_dest

NAME                     TYPE       VALUE

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

audit_file_dest       string     /u01/app/oracle/admin/dave2/adump

2.2.2 Audit_trail

参数audit_trail的值:
db/true : 启用审计,并且把审计结果放到数据库的sys.aud$表中
os: 启用审计,并且把审计结果存放在操作系统的数据信息中
db_extended: 启用审计,把审计结果存放在数据库的sys.aud$表中,并且在clob列的sqlbind和sqltext字段记录额外的信息
xml: 启用审计,以xml格式写所有的审计记录
extended: 启用审计,在审计跟踪中记录所有列,包括sqltext和sqlbing值
none/false:禁用审计

注:这两个参数是static参数,需要重新启动数据库才能生效。

 

2.3审计级别

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

2.3.1 Statement

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

2.3.2 Privilege

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

2.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 defaultby access;后,对于随后创建的对象的drop操作都会审计。但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比 trigger可以对schema的DDL进行“审计”,这个功能稍显不足。

2.4审计的一些其他选项

2.4.1 by access / by session

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

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

2.4.2 whenever [not] successful

whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计,

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

2.5 和审计相关的视图

2.5.1 dba_audit_trail

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

2.5.2 dba_stmt_audit_opts

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

2.5.3 all_def_audit_opts

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

2.6取消审计

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

如audit sessionwhenever successful

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

 

三. Fine-grainedauditing(FGA) 细粒度审计

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

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

3.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。

3.3 处理器模块

FGA 的功能不只是记录审计线索中的事件;FGA 还可以任意执行过程.过程可以执行一项操作,比如当用户从表中选择特定行时向审计者发送电子邮件警告,或者可以写到不同的审计线索中。这种存储代码段可以是独立的过程或者是程序包中的过程,称为策略的处理器模块。 实际上由于安全性原因,它不必与基表本身处于同一模式中,您可能希望特意将它放置在不同的模式中。由于只要 SELECT 出现时过程就会执行,非常类似于 DML 语句启动的触发器,您还可以将其看作 SELECT 语句触发器。

-- 以下参数指定将一个处理器模块指定给策略: (1)handler_schema 拥有数据过程的模式 (2)handler_module 过程名称 (3)处理器模块还可以采用程序包的名称来代替过程名称。在这种情况下,参数handler_module 在package.procedure 的格式中指定。

3.4 FGA 数据字典视图

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

  审计线索收集在 SYS 拥有的表 FGA_LOG$ 中。对于 SYS 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。DBA_FGA_AUDIT_TRAIL是该表上的一个视图。
  一个重要的列是 SQL_BIND,它指定查询中使用的绑定变量的值,这是显著增强该工具功能的一项信息。
  另一个重要的列是 SCN,当发生特定的查询时,它记录系统更改号。此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的 SCN 值时的数据。

3.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 列将显示视图的名称,并且不会出现有关表访问的附加记录。

3.6 其它用途

除了记录对表的选择访问,FGA 还可用于某些其它情况: (1)可以对数据仓库使用 FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。 (2)由于 FGA 捕获绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。 (3)处理器模块可以向审计者或DBA 发送警告,这有助于跟踪恶意应用程序。 (4)由于 FGA 可以作为 SELECT 语句的触发器,您可以在需要这种功能的任何时候使用它。

3.7 视图部分字段说明

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

3.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 参数的值可以设置为以下几种

  1. NONE:不开启

  2. DB:开启审计功能

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

  4. TRUE:与参数DB一样

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

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

4.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

4.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 setaudit_sys_operations=TRUE scope=spfile;  

--审计管理用户(以sysdba/sysoper角色登陆)

SQL> alter system setaudit_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    

4.4 关闭审计

SQL> conn /as sysdba

SQL> show parameter audit

SQL> alter system set audit_trail=none;

关闭审计也需要重启实例

4.5 审计实例

4.5.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 setaudit_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

4.5.2 开始审计

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

SQL> conn  system/admin

SQL> audit all on test;

SQL> commit;

SQL> delete from test;

SQL> commit;

SQL> selectos_username,username,userhost,terminal,timestamp,owner,obj_name,action_name,sessionid,os_process,sql_textfrom 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 byaccess;

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

例:

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

audit delete any table whenever notsuccessful; --只审计删除失败的情况

audit delete any table whenever successful;--只审计删除成功的情况

audit delete,update,insert on user.table bysystem;
--审计system用户对表user.table的delete,update,insert操作

4.5.3 撤销审计

SQL> noaudit all on t_test;

原文链接:https://blog.csdn.net/tianlesoftware/java/article/details/4712932

posted @ 2020-05-21 10:17  雪竹子  阅读(2915)  评论(0编辑  收藏  举报