oracle审计

Posted DBDoctor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle审计相关的知识,希望对你有一定的参考价值。

审计介绍

oracle审计帮助我们记录用户对数据库的操作,有了审计功能我们可以很方便做如下事情:
1、  在没有源代码的软件中,我们可以查看到软件的各个功能针对数据库的是什么操作;
2、  可以定位用户连接数据库的方式,在数据库的操作有哪些;
3、  如果你想回收某些账号的权限,可通过监测,知道用了哪些权限;

审计说明

审计的记录数据存放有两种方式:
1、存放在数据库中,通过aud$或者dba_audit_trail视图中,在system表空间下,因此注意system表空间的使用情况;如果你查看表不存在说明审计的表还没有安装,需要手动安装如下:
SQL> @$ORACLE_HOME/rdbms/admin/cataudit.sql
2、存放在操作系统下,通过参数audit_file_dest查看存放位置,默认是
SQL> show parameter audit_file_dest;
NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest              string  /u01/app/admin/orcl/adump
关于审计默认是开启还是关闭的这个问题,看网上好多文章都是说默认是关闭的,但是我所有的库包括新建的都是开启的(audit_trail=DB)。

不管你的审计是开启的还是关闭的,如下几种操作都是会被记录的:
1、  用管理员身份连接数据库;
2、  关闭数据库;
3、  开启数据库;
注:如果审计是关闭的,这几种情况下的日志记录在audit_file_dest参数文件目录下。

审计参数

和审计相关的参数有以下几个:
SQL> show parameter audit;
NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest              string  /u01/app/admin/orcl/adump
audit_sys_operations             boolean     FALSE
audit_syslog_level           string
audit_trail              string  NONE

audit_file_dest   如果采用操作系统存放审计记录,此目录是存放记录的路径;
audit_sys_operations 取值true | false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录;
audit_syslog_level 这个参数和采用OS存储审计日志有关系,暂时不研究;
audit_tail  
AUDIT_TRAIL = { none | os | db [, extended] | xml [, extended] }
    none不开启审计
    os开启审计,采用操作系统存储记录
    db开启审计,采用aud$存储审计记录
    db,extended开启审计,采用aud$存储审计记录,并且填充SYS.AUD$表的SQLBIND列和SQLTEXT CLOB列
    xml开启审计,采用xml存储审计记录
    xml,extended开启审计,采用xml存储审计记录,并且填充SYS.AUD$表的SQLBIND列和SQLTEXT CLOB列

审计级别

可以三个级别进行设置审计:
语句级别(statement)
权限级别(privilege)
对象级别(object)
语句级别
    语句审计,对某种类型的SQL语句审计,不指定结构或对象,例如create table、alter table等等。
权限级别
    权限审计,当用户使用了该权限则被审计。
对象级别
对象审计,对一特殊模式对象上的指定语句的审计.

审计语法

这里写图片描述

audit_operation_clause::=
这里写图片描述
auditing_by_clause::=
这里写图片描述
audit_schema_object_clause::=
这里写图片描述
auditing_on_clause::=
这里写图片描述
by access 每一个被审计的操作都会生成一条audit trail。
by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。
whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计。
whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。

审计相关的视图

dba_audit_trail:保存所有的audit trail,实际上它只是一个基于aud$的视图。
其它的视图 dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail 的一个子集。
dba_stmt_audit_opts:可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图 功能与之类似
all_def_audit_opts:用来查看数据库用on default子句设置了哪些默认对象审计。

取消审计

将对应审计语句的audit改为noaudit即可,
如audit sessionwhenever successful
对应的取消审计语句为noauditsession whenever successful;

以下信息来源于网络

Fine-grainedauditing(FGA) 细粒度审计

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

增加 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;

管理 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。

处理器模块

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

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

FGA 数据字典视图

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

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

其它用途

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

视图部分字段说明

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

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

以上是关于oracle审计的主要内容,如果未能解决你的问题,请参考以下文章

Oracle ETL日志审计存储过程示例

oracle 审计功能怎么配置

oracle audit,如何审计ORACLE日志

oracle 审计包括哪几种,都是啥

oracle数据库的审计功能

从 oracle 中的触发器进行审计