如何理解orcle审计策略

发布时间:2021-11-12 16:26:50 作者:柒染
来源:亿速云 阅读:152

如何理解orcle审计策略,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Oracle审计功能

一、    审计分类:

Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和()不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANTREVOKE操作以及其他数据库级权限下的操作。

二、    标准审计:

2.1 分类:

ORACLE中分别支持以下三种标准审计类型:

u          语句审计,对某种类型的SQL语句审计,不指定结构或对象。

u          特权审计,对执行相应动作的系统特权的使用审计。

u          对象审计,对一特殊模式对象上的指定语句的审计。

这三种标准审计类型分别对如下3方面进行审计:

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

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

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

     当数据库的审计功能打开后,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。

2.2设置ORACLE标准审计:

下列步骤可以设置ORACLE的标准审计功能:

1.    修改初始化参数文件(init<sid>.ora

如果使用服务器参数文件使用alter system set <parameter>=<value> scope=spfile|both,详情参照1.1节中关于参数文件的介绍),设置 AUDIT_TRAIL参数,并且重启数据库。AUDIT_TRAIL的取值如下:

l         DB/TRUE:启动审计功能,并且把审计结果存放在数据库的 SYS.AUD$ 表中

l         OS:启动审计功能,并把审计结果存放在操作系统的审计信息中  

l         DB_EXTENDED:具有DB/TRUE的功能,另外填写AUD$SQLBINDSQLTEXT字段

l         NONE/FALSE:关闭审计功能 

2.设置AUDIT_TRAIL参数:

如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST

    如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE

_DEST所指定的目录下,并且文件名包含进程的PID

   比如: 

    AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit  

    $ ls -l $ORACLE_HOME/rdbms/audit  

   -rw-rw----  1 ora92    dba        881 Mar 17 09:57 ora_13264.aud

    $ ps -ef|grep 13264

    ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)

    SQL> select spid, program, username from v$process;

    SPID PROGRAM                                 USERNAME

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

   ...

   13264        oracle@frhp11 (TNS V1-V3)                    ora92

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表空间又足够的空间存放审计信息。

4. 关闭并重启数据库 

5. 设置所需要的审计信息

 下面是一个例子

   SQL> connect system/manager

   SQL> grant audit system to scott;     

   SQL> connect scott/tiger

   SQL> audit session;

 停止审计:

   SQL> noaudit session; 

通常设置了标准审计后都是通过Audit语句开启审计,使用noaudit语句收回审计。如下所示:

对修改SC表结构或数据的操作进行审计可使用如下语句:

AUDIE ALTERUPDATE ON SC;

取消对SC表的一切审计可使用如下语句:

NOAUDIT ALL ON SC;

2.3设置审计的实例(对试图尝试口令的访问的审计):

以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:

1. 修改审计相关参数(参照上面介绍的方法)

2. 重启数据库

3. 设置审计信息

   SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL

 

4. 查询AUD$

   SQL> select returncode, action#, userid, userhost, terminal,timestamp

from aud$

 

   RETURNCODE    ACTION# USERID   USERHOST  TERMINAL

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

    1017        100      SCOTT    WPRATA-BR

    1017        100      SCOTT    WPRATA-BR

    1017        100      SCOTT    WPRATA-BR

 

 ORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到WPRATA-BR尝试破译SCOTT的口令。可以通过下面一个存储过程来分析AUD$表,找出可疑的信息:

create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)

is

USER_ID VARCHAR2(20);

cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')

  group by userid;

cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')

  from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;

ct PLS_INTEGER;

V_USERHOST VARCHAR2(40);

V_TERMINAL VARCHAR(40);

V_DATE VARCHAR2(40);

BEGIN

    OPEN C1;

    dbms_output.enable(1024000);

    LOOP

      FETCH C1 INTO USER_ID,CT;

      EXIT WHEN C1%NOTFOUND;

      IF(CT>=TIMES) THEN

        DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);

        OPEN C2;

        LOOP

          FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;

          DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);

          EXIT WHEN C2%NOTFOUND;

        END LOOP;

        close c2;

      END IF;

    END LOOP;

    close c1;

END;

/

一下是执行结果:

SQL>set serveroutput on;

SQL> execute auditlogin('2004-01-01',2);

USER BROKEN ALARM:SYS

        HOST:,TERM:XUJI,TIME:2004-09-22:11:08:00

        HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01

        HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

        HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

 

PL/SQL 过程已成功完成。

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

由于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>;

三、       细粒度审计:

    细粒度审计 (FGA)(通过 Oracle9i 引入)可以理解为基于政策的审计。与标准的审计功能相反,FGA 可用于指定生成审计记录必需的条件:

FGA 政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过 VPD ("dbms_rls") 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:

这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从 Oracle 数据库 10g 开始,FGA 支持在一个策略中使用选择插入更新删除语句的任意组合。事实上,绑定到表的 FGA 政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web 接口或通过 SQL*Plus),其操作都会记录下来。

3.1 使用细粒度审计:

   1、创建测试表

   create table ACCOUNT

(AACT_NO number not null,

     CUST_ID number not null,

     BALANCE number(15,2)

);

   2、添加审计策略:

   begin

    DBMS_FGA.DROP_POLICY(object_schema => 'TEST',

                       object_name   => 'ACCOUNT',

                       policy_name   => 'ACCOUNT_ACCESS');

end;

这段代码必须由具有执行程序包 dbms_fga 权限的用户来执行。建议应该建立一个专门的用户来专门负责添加审计策略。该过程有许多参数,具体含义如下:

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在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:

select * from bank.accounts;

审计线索记录此操作。可以使用以下语句查看线索:

select timestamp,

db_user,

os_user,

object_schema,

object_name,

sql_text

from dba_fga_audit_trail;

 

TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT

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

26-MAR-10 TEST    ananda  TEST    ACCOUNT select * from account

注意名为 DBA_FGA_AUDIT_TRAIL 的新视图,它记录细粒度的访问信息。其中显示了审计事件的时间标记、查询者的数据库用户 ID、操作系统用户 ID、查询中所使用表的名称和所有者,最后还有确切的查询语句。

3.2 审计列和审计条件:

默认情况下会对被审计对象的所有列开启审计,当任何一列被访问时都会纪录一条审计信息,这在现实情况下不太常见,因为这样会使审计信息表增长过快造成存储空间的压力,因此通常都会设置审计条件,当条件触发时再发起审计。例如我们可以对Account表的Balance列设置审计条件,当访问该列并触发审计条件时才进行审计。如下所示:

begin

dbms_fga.add_policy (

object_schema=>'TEST',

object_name=>'ACCOUNT',

policy_name=>'ACCOUNT_ACCESS',

audit_column => 'BALANCE',

audit_condition => 'BALANCE >= 11000'

  );

end;

该策略将在访问BALANCE列并且只有访问列值大于等于11000时才发起审计。因此根据该条件户有如下不同审计状态:

SQL 语句

审计状态

select balance from account;

进行审计。用户选择了在添加策略时所指定的审计列 BALANCE

select * from account;

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

select cust_id from account where balance < 10000;

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

select cust_id from account;

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

select count(*) from account;

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

 

3.3优化器模式:

FGA 需要基于成本的优化 (CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导项目出现的可能性。为使 FGA 正确地工作,除了在实例级启用 CBO 之外,在 SQL 语句中应该没有规则暗示(hint),并且必须至少使用评估选项对查询中的所有表进行分析。

3.4管理 FGA 策略:

  要删除策略,您可以使用以下语句:

begin

dbms_fga.drop_policy (

object_schema => 'TEST',

object_name => 'ACCOUNT',

policy_name => 'ACCOUNT_ACCESS'

   );

end;

对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。但是可以暂时禁用已有策略,如下所示:

begin

dbms_fga.enable_policy (

object_schema => 'TEST',

object_name => 'ACCOUNT',

policy_name => 'ACCOUNT_ACCESS',

enable => FALSE

   );

end;

若要重新启用它,可使用同一函数,只需将参数 enable 设置为 TRUE

3.5 FGA 数据字典视图:

FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。该市途中各列含义如下:

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

3.6视图和 FGA

假定在 ACCOUNTS 表上定义视图 VW_ACCOUNT 如下:

create view vw_account as select * from account;

现在,如果用户从视图中而不是从表中进行选择:

select * from vw_account;

您将看到以下审计线索:

select object_name, sql_text from dba_fga_audit_trail;

 

OBJECT_NAME SQL_TEXT

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

ACCOUNT    select * from vw_account

注意,是基表名称而不是视图名称出现在 OBJECT_NAME 列中,因为视图中的选择是从基表中进行选择。但是,SQL_TEXT 列记录了用户提交的实际语句。

如果只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。

3.7 其它用途:

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

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

3.8        FGA10G中的增强:

3.8.1 对所有DML的审计:

   9iFGA只能对Select语句进行审计,而不能对其他DML语句(UpdateDeleteInsert)进行审计,如果想对其他DML语句进行审计那么只能采取数据库处发起的形式来实现。在10G中实现了对所有DML语句的审计,如下所示:

begin
   dbms_fga.add_policy (
      object_schema   => 'TEST',
      object_name     => 'ACCOUNT',
      policy_name     => 'ACCOUNT_ACCESS',
      audit_column    => 'BALANCE',
      audit_condition => 'BALANCE >= 3000',
      statement_types => 'INSERT, UPDATE, DELETE, SELECT'
  );
end;

通过statement_types => 'INSERT, UPDATE, DELETE, SELECT'参数制定了新的策略,该策略可以对Select之外的所有DML操作进行审计。因此根据新的审计条件和审计策略会有如下不同情况:

1 种情况

之前:BALANCE = 1000

用户发出:

update account set balance = 1200 where ACCOUNT_NO = ....

旧的和新的 balance 都小于 3,000,审计条件不满足;因此这条语句将不会被审计。

2 种情况

之前:BALANCE = 1000

用户发出:

update account set balance = 3200 where ACCOUNT_NO = ....

新的 balance 大于 3,000,审计条件满足;因此这条语句将 会被审计。

3 种情况

之前:BALANCE = 3200

用户发出:

update account set balance = 1200 where ACCOUNT_NO = ....

新的 balance 小于 3,000,但旧的 balance 大于 3,000。因此审计条件满足,这条语句将被审计。

4 种情况

用户插入一行,其中有 BALANCE < 3000

insert into account values (9999,1200,'X');

因为 balance 1,200 不满足审计条件,所以这条语句不被审计。如果 balance 列大于或等于 3,000,它将被审计。

5 种情况

用户插入一行,其中 balance 的值为空。

insert into account (account_no, status) values (9997, 'X');

因为 balance 为空,该列没有任何默认值,所以审计条件不满足(比较 NULL >= 3000 结果为 FALSE),这条语句不会被审计。重要注意事项:假设该列有一个大于 3,000 的默认值时,这条语句仍然不会被审计,即使插入行的 balance 列值大于 3000。 注意对于DML语句的审计是由一个自动事务插入的;即使回滚 DML语句的操作,审计记录也将存在不会跟着回滚。

3.8.2制定

在表 ACCOUNT 上定义的一个策略,如下:

begin

   dbms_fga.add_policy (

      object_schema   => 'TEST',

      object_name     => 'ACCOUNT',

      policy_name     => 'ACCOUNT_SEL',

      audit_column    => 'ACCOUNT_NO, BALANCE',

      audit_condition => 'BALANCE >= 3000',

      statement_types => 'SELECT'

  );

end;

在某些情况下,列的组合可能很重要,而不是某个特定的列。以上策略是在 ACCOUNT_NO BALANCE 上定义的。那么如果用户发出以下语句:

select balance from accounts where account_no = 9995;

这条语句将被审计,因为 balance 列被选中,且余额为 3,200,大于 3,000,满足审计条件。

如果一个用户想查出在银行的总余额,他发出:

select sum(balance) from account;

这条查询几乎没什么害处;它不明确指出帐户所有者和帐户余额。因此安全策略可能不会要求审计这条查询。不过,这条查询

select balance from account where account_no = 9995

必须被审计;因为它明确地指定了一个帐户。默认地,所有语句都被审计(无论使用了什么样的列组合)。这将创建大量不需要的审计线索项目,并可能带来一些空间限制问题。为了限制它们,您可以指定仅当在查询中使用了希望的列组合时才开始审计。当定义策略时,您可以使用一个新的参数:

audit_column_opts => DBMS_FGA.ALL_COLUMNS

这个参数将使策略仅当列 ACCOUNT_NO BALANCE 在查询中都被访问时才创建审计线索项目。例如,以下查询将产生一个审计线索项目。

select account_no, balance from account;

但这条查询不会产生审计线索项目。

select account_no from account;

使用这个参数将把审计的数量限制在一个更易管理的大小。如果希望采用默认的行为即任意列被选中时都进行审计,那么您可以对同一参数的使用不同值。

audit_column_opts => DBMS_FGA.ANY_COLUMNS

3.8.3 与标准审计的结合:

   通过制定如下审计策略实现标准审计与细粒度审计的结合

begin
   dbms_fga.add_policy (
      object_schema     => 'TEST',
      object_name       => 'ACCOUNT',
      policy_name       => 'ACCOUNT_SEL',
      audit_column      => 'ACCOUNT_NO, BALANCE',
      audit_condition   => 'BALANCE >= 3000',
      statement_types   => 'SELECT',
      audit_column_opts => DBMS_FGA.ALL_COLUMNS,
      audit_trail       => DB
  );
end;

通过指定audit_trail => DB参数实现在细粒度审计时开启标准审计。在 Oracle Database 10g 中,标准审计也得到了巨大的改进。通过 AUDIT 命令执行标准审计,它现在能够捕获大量其它有用的信息。在内容和功能方面,标准审计类似于细粒度审计。然而,作为一个数据库管理员,有兴趣知道所有的审计项目,而不只是一个审计项目。一个新的视图,DBA_COMMON_AUDIT_TRAIL,结合了标准审计线索和 FGA审计线索。用以下查询来检查它们二者如:

select * from dba_common_audit_trail;通过这条查询可以同时查看两种审计收集的信息。

四、FGA 审计和标准审计的差异 :

关于如何理解orcle审计策略问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. ORCLE RMAN备份脚本
  2. php连接不上orcle的问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

orcle

上一篇:RMAN常用脚本是怎样的

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》