暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 安全策略--审计(一)

oracleEDU 2017-08-16
4683

审计功能在11gR2版本进一步增强,关于审计的主要知识点罗列如下:

1.    始化参数AUDIT_TRAIL的默认值为'DB',也就是将所有的审计数据都存放到AUD$表,而这个表又默认是在SYSTEM的表空间里,建议将AUD$表迁移到其它的专门存放审计数据的表空间维护。

2.    监控可疑行为,数据库出现安全隐患以后利于排查分析。

3.    审计消耗性能,不是所有都审计,只审计可疑行为。

4.    审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。

审计的结果保存位置

    操作系统OS:参数audit_file_dest指定

    数据库DB:sys.aud$  、 sys.FGA_LOG$ 

    SQL> show parameter audit_file_dest

    NAME                                 TYPE        VALUE

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

    audit_file_dest                      string      /u01/app/oracle/admin/orcl/adu

                                                                    mp

强制审计

    无论是否开启审计,强制审计默认开启的,审计哪些行为一定记录?

    使用 as sysdba 或者 as sysoper 登录的用户

    启动数据库

    关闭数据库

    强制审计的结果一定在OS上面

    $ show parameter audit_file_dest

    例:

    sqlplus as sysdba 

    exit

    $ cd u01/app/oracle/admin/orcl/adump

    $ ls

     orcl_ora_29370_1.aud

    $ vim orcl_ora_29370_1.aud

Audit file u01/app/oracle/admin/orcl/adump/orcl_ora_29370_1.aud

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1

System name:    Linux

Node name:      oracleEDU

Release:        2.6.18-308.el5

Version:        #1 SMP Fri Jan 27 17:17:51 EST 2017

Machine:        x86_64

Instance name: orcl

Redo thread mounted by this instance: 1

Oracle process number: 25

Unix process pid: 29370, image: oracle@oracleEDU (TNS V1-V3)

Sat Aug 16 07:24:00 2014 +08:00

LENGTH : '160'

ACTION :[7] 'CONNECT'

DATABASE USER:[1] '/'

PRIVILEGE :[6] 'SYSDBA'

CLIENT USER:[6] 'oracle'

CLIENT TERMINAL:[5] 'pts/1'

STATUS:[1] '0'

DBID:[10] '1380804050'

强制审计记录很少,只有启动和关闭  sysdba sysoper登录。如果想知道DBA登录后做了什么操作,强制审计不足,需要对DBA审计。

对DBA的审计

    目的:监控管理所有操作行为

    设置审计: AUDIT_SYS_OPERATIONS用来指定是超级管理员的审计

    设置:true 审计  false 关闭(默认)

    开启审计:

SQL> show parameter audit

NAME                                 TYPE        VALUE

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

audit_file_dest                      string      /u01/app/oracle/admin/orcl/adu

                                                 mp

audit_sys_operations                 boolean     FALSE --> 未开审计

SQL> alter system set audit_sys_operations=true scope=spfile ;

SQL> shutdown immediate

SQL> startup

SQL> show parameter audit ;

NAME                                 TYPE        VALUE

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

audit_file_dest                      string      /u01/app/oracle/admin/orcl/adu

                                                 mp

audit_sys_operations                 boolean     TRUE  --> 管理员审计开启

测试:

操作命令  

dql:  select 

dml: insert update delete 

dcl: grant reovke 

ddl: create  drop alter 

事务语句:commit  rollback;

conn as sysdba

select * from scott.dept;

create table a (a number);

insert into a values(1);

commit;

grant select on a to scott;

查审计

cd $ORACLE_BASE/admin/orcl/adump 

先找出服务进程号 然后找到文件 

SQL> SELECT spid

          FROM v$session s, v$process p, v$mystat m

         WHERE s.paddr = p.addr AND s.sid = m.sid AND m.statistic# = 0 ;

SPID

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

30609

查看orcl_ora_30609.aud 文件

标准数据库审计(只针对普通用户)

    1.    开启审计 设置参数audit_trail

        对自己的对象开启审计,不需要授权,如果开启对其他用户的审计,需要audit any。为了安全性:O7_DICTIONARY_ACCESSIBILITY 一定设置为false  这样审计记录只有管理员可以看 ,而且非管理员是不可以审计sys的对象。

        SQL> alter system set audit_trail=DB;

        一般建议放入数据库中.保存在DB里由Oracle进行维护会减少和OS通信的IO操作.

        开启数据审计,审计结果放入数据字典:

        SQL> ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;

        SQL> startup force ; 重启生效

        开启审计后, 确认审计相关的表是否已经安装

        SQL> connect AS SYSDBA 

        SQL> select * from sys.aud$;  

        SQL> select * from dba_audit_trail;

         如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。

        SQL> connect as sysdba 

        SQL> @$ORACLE_HOME/rdbms/admin/cataudit.sql 

    2.    设置审计选项 auit  /noauit

        EM中的操作步骤:Server --> Security --> Audit Settings

        审计:

            i.对象:对一特殊模式对象上的指定语句的审计

            ii.权限:对执行相应动作的系统特权的使用审计

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

        

            BY SESSION:该选项表示在同一个会话中对完全相同的SQL语句只生成一条审计跟踪记录,该选项是默认选择.(相同语句只记录一次)

            BY ACCESS:该选项标识每执行一次语句生成一条审计跟踪记录.当审计DDL语句或DDL系统权限时,无论指定BY ACCESS 还是 BY SESSION选项.oracle总是使用BY ACCESS选项.

            BY 用户名:该选项用于指定审计特定的数据库用户.如果不指定该选项.oracle会自动审计除特权用户外的所有其他用户.(默认审计所有普通用户)

            WHENEVER [NOT] SUCCESSFUL: WHENEVER SUCCESSFUL选项用于指定审计执行成功的操作,WHENEVER NOT SUCCESSFUL选项用于指定审计失败的操作.如果忽略这两个选项,则操作无论成功与否都会被审计.(默认无任成功还是失败都要记录)

SQL> show parameter audit_trail

NAME                                 TYPE        VALUE

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

audit_trail                          string      DB

SQL> truncate table sys.aud$;

Table truncated.

SQL> select count(*) from sys.aud$;

  COUNT(*)

----------

         0

语句审计

1.使用审计

audit table  (审计的是有关表的操作的DDL语句)

作用:审计普通用户对表的操作(create alter drop)

2. 执行一个对表修改的语句,让审计生效

conn scott/oracle 

create table a (a number);

3. 查看审计记录

知道:所有标准数据库审计的结果:sys.aud$表里,查看视图dba_audit_trail

ACTION_NAME 查出对象操作语句是什么

查看审计    

SELECT username,action_name,obj_name,

To_char(timestamp,'YYYY-MM_DD HH24:MI')

FROM dba_audit_trail;

4. 如何查看开启了那些语句审计DBA_STMT_AUDIT_OPTS

select  USER_NAME, AUDIT_OPTION   from DBA_STMT_AUDIT_OPTS

结果:对所有人都对表的操作语句审计

noaudit table ;  关闭多所有用户对表操作的审计

audit table by hr; 审计某一个用户 (测试一下)

5. 关闭审计

noaudit table by hr;

系统权限审计

默认设置为by access

查看系统权限

select distinct PRIVILEGE from dba_sys_privs order by 1;

1. 使用系统权限审计

audit create table  

2. 执行一个对表修改的语句,让审计生效

conn scott/oracle 

create table a ( id number);

3.查看审计记录

知道:所有标准数据库审计的结果:sys.aud$

需要用视图去访问? DBA_AUDIT_TRAIL

SELECT username,action_name,obj_name,

To_char(timestamp,'YYYY-MM_DD HH24:MI')

FROM dba_audit_trail;

4.查看有已经设置了多少个权限审计

DBA_PRIV_AUDIT_OPTS

select * from DBA_PRIV_AUDIT_OPTS;

5. 删除权限审计

noaudit create table ;

对象的审计

可用来审计对表、视图、过程、序列、目录和用户定义的数据类型执行操作。

1. 使用对象审计

audit insert on scott.e  by access;

2. 执行一个对表插入的语句,让审计生效

conn scott/oracle

insert into e(empno,ename) values(1,'tst');

commit;

3. 查看审计记录

知道:所有标准数据库审计的结果:sys.aud$

需要用视图去访问? DBA_AUDIT_TRAIL

SELECT username,action_name,obj_name,

To_char(timestamp,'YYYY-MM_DD HH24:MI')

FROM dba_audit_trail;

4. 查看有已经设置了多少个对象审计

DBA_OBJ_AUDIT_OPTS

select * from DBA_OBJ_AUDIT_OPTS;

5. 关闭对象审计

noaudit insert on scott.e ;

 实例说明审计 
a.审计某用户的会话创建与结束                                                                                    AUDIT SESSION BY scott;                                                                                       b.审计所有用户的会话的创建与结束                                                                             AUDIT SESSION;                                                                                                     c.审计删除表的操作                                                                                                       AUDIT   DELETE  ANY TABLE;                                                                               d.审计删除表的操作(限制:只审计删除失败的情况)                                                       AUDIT  DELETE  ANY TABLE WHENEVER NOT SUCCESSFUL;                            e.审计删除表的操作(限制:只审计删除成功的情况)                                                      AUDIT  DELETE ANY TABLE WHENEVERSUCCESSFUL;                                      f.审计删除表的操作(限制:同一个会话中相同的操作语句只审计一次)                          AUDIT DELETE ANY TABLE BY SESSION;                                                               (注:对于这种情况,如果审计记录被设定为存储在外部文件中时,这个效果是体现不出来的,因为oracle无法判断是否已经审计过相同的操作语句。)                          g.审计删除表的操作(限制:每支删除语句都审计,不论同一会话中是否有多条相同的操作语句)                                                                                                                 AUDIT DELETE ANY TABLE BY ACCESS;                                                               h.审计对scott.emp表的delete操作                                                                              AUDIT DELETE ON scott.emp;                                                                                  i.审计对scott.emp表的delete、updet、insert操作                                                      AUDIT DELETE,UPDATE,INSERT ON soctt.emp;    

当SYS.AUD$表的审计记录越来越多的时候,以至达到存储极限时,会因为审计记录无法写入而产生错误。

或许我还也需要对该表的数据进行一些转储或者碎片的整理,或是删除一些我们认为不再需要的审计记录。这些都是要考虑的事情。下面给出一个对该表进行存储碎片的整理的一个方法:

a.将该表的数据selectinto到另一个表中,或利用export导出到外部文件

b.truncate这张表(要以超级管理员登录才行)

c.再将原先转储的数据再加载进来。

例:

SQL> create table audit_user_1215 tablespace users as select * from sys.aud$;

或者导出:exp system/oracle file=aud1215.dmp tables=sys.aud$;

清空记录: truncate table sys.aud$;

案例:对尝试口令的访问审计

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

1. 修改审计相关参数 

 2. 重启数据库 

 3. 设置审计信息

SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL

 4. 查询AUD$

select returncode, action#, userid, userhost, terminal,To_char(timestamp#,'YYYY-MM_DD HH24:MI') from sys.aud$;

RETURNCODE    ACTION# USERID     USERHOST        TERMINAL        TO_CHAR(TIMESTAM)

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

 1017        100 SCOTT      yutianedu       pts/1     

 1017        100 SCOTT      yutianedu       pts/1      

 1017        100 SCOTT      yutianedu       pts/1 

ORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到尝试破译SCOTT的口令

基于值的审计

解决方法:触发器

CONNECT SCOTT/oracle

DROP TABLE T1;

CREATE TABLE T1 AS SELECT SAL OLD_VALUE,SAL NEW_VALUE FROM EMP WHERE 0=9;


CREATE OR REPLACE TRIGGER TRG1

BEFORE INSERT OR UPDATE OF sal ON emp

FOR EACH ROW

BEGIN

INSERT INTO T1 VALUES(:OLD.SAL,:NEW.SAL);

END;

/


SELECT * FROM T1;

update emp set sal=sal+1;

commit;


select * from t1;



参考文档:Security Guide  --  9 Verifying Security Access with Auditing

Verifying Security Access with Auditing -- Auditing Specific Activities with Fine-Grained Auditing



最后修改时间:2021-04-28 19:51:17
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论