Oracle使用大量不同的审计方法来监控使用何种权限,以及访问哪些对象。审计不会防止使用这些权限,但可以提供有用的信息,用于揭示权限的滥用和误用。

下表中总结了Oracle数据库中不同类型的审计。

审 计 类 型

说    明

语句审计

按照语句类型审计SQL语句,而不论访问何种特定的模式对象。也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户

权限审计

审计系统权限,例如CREATE TABLE或ALTER INDEX。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标

模式对象审计

审计特定模式对象上运行的特定语句(例如,DEPARTMENTS表上的UPDATE语句)。模式对象审计总是应用于数据库中的所有用户

细粒度的审计

根据访问对象的内容来审计表访问和权限。使用程序包DBMS_FGA来建立特定表上的策略

DBA如何管理系统和对象权限使用的审计。当需要一定的粒度时,DBA可以使用细粒度的审计来监控对表中某些行或列的访问,而不仅仅是是否访问表。

和审计相关的主要参数

SQL>show parameter audit

audit_file_dest
audit_sys_operations
audit_trail


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里新增的。

注:参数AUDIT_TRAIL不是动态的,为了使AUDIT_TRAIL参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时,应该注意监控该表的大小,以避免影响SYS表空间中其他对象的空间需求。推荐周期性归档SYS.AUD$中的行,并且截取该表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批处理作业中的特殊账户一起使用,用于归档和截取审计表。

audit_file_dest:Audit_trail=OS时文件位置

1.查看数据库审计是否打开 

SQL> show parameter audit;

NAME TYPE VALUE

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

audit_file_dest          string       /oracle/app/oracle/admin/PTBCS/adump

audit_sys_operations    boolean     FALSE

audit_syslog_level       string

audit_trail               string       DB_EXTENDED

audit_sys_operations:审计系统的操作  默认为 false,当设置为 true 时,所有 sys(包括以 sysdba,sysopr 身份登录的用户)操作都会被记录,但记录不会被写在 aud$表中。如果为 windows 平台,会记录在windows事件管理当中。

audit_trail:审计追踪  none 为默认值,11G 之后默认值为‘db’,如果默认值为 none,那么不做审计,说明如下:

DB:将audit trail记录在数据库审计相关的表中,审计只有连接信息 

DB_EXTENDED:这样审计还包含当时的执行的具体语句 

OS:将 audit trail 记录在系统文件中,文件名有audit_file_dest参数指定

修改语句为:SQL> alter system set audit_trail='db_extended' scope=spfile;

注:参数audit_trail不是动态,为了使此参数中的改动生效,必须关闭数据库并重新启动。在对

sys.aud$进行审计时,还需要监控该表的大小,以免影响system表空间中其他对象的空间需求。

推荐周期性归档sys.aud$中的行,并截取该表。 

目前采用计划任务,每日删除上月数据,只保留当月数据。 

Audit_file_dest:audit_trail=os时,文件位置。

2.语句审计

每次动作发生时都对其进行审计

SQL> audit on table by access; 

SQL> audit on table by session; 

只审计一次,默认为 by session ,有时希望审计成功的动作:没有生成错误消息的语句。对于这些语句,添加whenever successful。而有时只关心使用审计语句的命令是否失败,失败原因是权限违犯、用完表空

间中的空间还是语法错误。对于这些情况,使用whenever not successful

对于大多数类别的审计方法,如果确实希望审计所有类型的表访问或某个用户的任何权限

则可以指定all而不是单个的语句类型或对象。

所有ALTER SYSTEM选项,例如,动态改变实例参数,切换到下一个日志文件组,以及终

止用户会话

SQL> audit alter system ; 

CREATEALTERDROP TRUNCATE 集群

SQL> audit cluster;

CREATE CONTEXT DROP CONTEXT;

SQL> audit context;

CREATE DROP 数据库链接;

SQL> audit database link;

CREATEALTER DROP 维数

SQL> audit dimension; 

CREATE DROP 目录;

SQL> audit directory;

CREATEALTER DROP 索引

SQL> audit index; 

CREATEALTER DROP 物化视图

SQL> audit materialized view;

由于不存在的引用对象而造成的SQL语句的失败;

SQL> audit not exists; 

CREATE DROP FUNCTIONLIBRARYPACKAGEPACKAGE BODY PROCEDURE

SQL> audit procedure; 

CREATEALTER DROP 配置文件

SQL> audit profile; 

SQL> audit public database link;

CREATE DROP 公有数据库链接

CREATE DROP 公有同义词

SQL> audit public synonym;

CREATEALTERDROP SET 角色

SQL> audit role;

CREATEALTER DROP 回滚段

SQL> audit rollback segment;

CREATE DROP 序列

SQL> audit sequence;

登录和退出

SQL> audit session;

系统权限的 AUDIT NOAUDIT

SQL> audit system audit;

GRANT REVOKE 系统权限和角色

SQL> audit system grant;

CREATEDROP TRUNCATE

SQL> audit table;

CREATEALTER DROP 表空间

SQL> audit tablespace;

CREATEALTER(启用/禁用)DROP触发器;具有ENABLE ALL TRIGGERSDISABLE

ALL TRIGGERSALTER TABLE

SQL> audit trigger; 

CREATEALTER DROP 类型以及类型主体

SQL> audit type;

CREATEALTER DROP 用户

SQL> audit user;

CREATE DROP 视图

SQL> audit view;

3.显式指定的语句类型

任何 ALTER SEQUENCE 命令

SQL> audit alter sequence;

任何 ALTER TABLE 命令

SQL> audit alter table;

添加注释到表、视图、物化视图或它们中的任何列

SQL> audit comment table;

删除表或视图中的行

SQL> audit delete table;

执行程序包中的过程、函数或任何变量或游标

SQL> audit execute procedure;

GRANT REVOKE DIRECTORY 对象上的权限

SQL> audit grant directory;

GRANT REVOKE 过程、函数或程序包上的权限

SQL> audit grant procedure;

GRANT REVOKE 序列上的权限

SQL> audit grant sequence; 

GRANTREVOKE表、视图或物化视图上的权限

SQL> audit grant table;

GRANT REVOKE TYPE 上的权限

SQL> audit grant type;

INSERT INTO 表或视图

SQL> audit insert table;

表或视图上的 LOCK TABLE 命令

SQL> audit lock table; 

引用序列的CURRVALNEXTVAL的任何命令

SQL> audit select sequence;

SELECT FROM 表、视图或物化视图

SQL> audit select table;

在表或视图上执行UPDATE

SQL> audit update table; 

SQL> select username,to_char(timestamp,'MM/DD/YY HH24:MI') timestamp

obj_name,action_name,sql_text

from dba_audit_trail

where username = 'SCOTT';

我用的基本查询审计信息,显示结果如下

scott 08/12/21 17:15 JOB_TITLE_IDX CREATE INDEX create index hr. job_title_idx on hr.jobs(job_title)

1 row selected.

4.权限审计

审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause,而不是在语句中,指定系统权限。

SQL> audit alter tablespace by access whenever successful;

使用SYSDBASYSOPER权限或者以SYS用户连接到数据库的系统管理员可以利用特殊

的审计,为了启用这种额外的审计级别,可以设置初始参数AUDIT_SYS_OPERATIONS

TRUE这种审计记录发送到与操作系统审计记录相同的位置。因此,这个位置是和操作系

统相关的。当使用其中一种权限时执行的所有SQL语句,以及作为用户SYS执行的任何

SQL语句,都会发送到操作系统审计位置。

5.模式对象审计

改变表、序列或物化视图

SQL> audit alter on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

审计任何对象上的命令

SQL> audit AUDIT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

添加注释到表、视图或物化视图

SQL> audit COMMENT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

从表、视图或物化视图中删除行

SQL> audit DELETE on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

执行过程、函数或程序包

SQL> audit EXECUTE on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

执行表或视图上的闪操作

SQL> audit FLASHBACK on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

授予任何类型对象上的权限

SQL> audit GRANT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

创建表或物化视图上的索引

SQL> audit INDEX on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

将行插入表、视图或物化视图中

SQL> audit INSERT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

锁定表、视图或物化视图

SQL> audit LOCK on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

DIRECTORY 对象的内容执行读操作

SQL> audit READ on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

重命名表、视图或过程

SQL> audit RENAME on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

从表、视图、序列或物化视图中选择行

SQL> audit SELECT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

更新表、视图或物化视图

SQL> audit UPDATE on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;

6.细粒度审计

称为FGA,审计变得更为关注某个方面,并且更为精确。由称为DBMS_FGAPL/SQL

序包实现FGA

使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行

或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(where 子句)

还指定了表中访问的列。通过只在访问某些行和列时审计对表的访问,可以极大地减少审

计表条目的数量。

例如:用户TAMARA通常每天访问 HR.EMPLOYEES 表,查找雇员的电子邮件地址。系统

管理员怀疑TAMARA正在查看经理们的薪水信息,因此他们建立一个FGA策略,用于审计

任何经理对SALARY列的任何访问:(脱敏策略的使用

begin

dbms_fga.add_policy(

object_schema =>  'HR',

object_name =>    'EMPLOYEES',

policy_name =>    'SAL_SELECT_AUDIT',

audit_condition =>  'instr(job_id,''_MAN'') > 0',

audit_column =>   'SALARY'

);

end;

/

ADD_POLICY     添加使用谓词和审计列的审计策略 

DROP_POLICY    删除审计策略 

DISABLE_POLICY 禁用审计策略,但保留与表或视图关联的策略 

ENABLE_POLICY  启用策略 

7.与审计相关的数据字典视图 

数据字典视图

说明

audit_actions

包含审计跟踪动作类型代码的描述,

例如insert、 drop view、delete、logon 和 lock

dba_audit_object

与数据库中对象相关的审计跟踪记录

dba_audit_policies

数据库中的细粒度审计策略

dba_audit_session

与 connect 和 disconnect 相关的所有审计跟踪记录

dba_audit_statement

与 grant、revoke、audit、noaudit 和 alter
system 命令相关的审计跟踪条目dba_audit_trail
包含标准审计跟踪条目。

user_audit_trailuser_trail_audit

只包含已连接用户的审计行

dba_fga_audit_trail

细粒度审计策略的审计跟踪条目

dba_common_audit_trail

将标准的审计行和细粒度的审计行结合在一个视图中

dba_obj_audit_opts

对数据库对象生效的审计选项

dba_priv_audit_opts

对系统权限生效的审计选项

dba_stmt_audit_opts

语句生效的审计选项

8.保护审计跟踪

审计跟踪自身需要受到保护,特别是在非系统用户必须访问表SYS.AUD$时,内置的角色

DELETE_ANY_CATALOG是非SYS用户可以访问审计跟踪的一种方法(例如,归档和截取审

计跟踪,以确保它不会影响到SYS表空间中其他对象的空间需求)

为了建立对审计跟踪自身的审计,以 SYSDBA身份连接到数据库,并运行下面的命令:

SQL> audit all on sys.aud$ by access;

现在,所有针对表 SYS.AUD$的动作,包括selectinsertupdate delete,都记录在

SYS.AUD$自身中。但如果某个人删除了标识对表SYS.AUD$访问的审计记录,这时会发生什么?此时将删除表中的行,但接着插入另一行,记录行的删除。因此,总是存在一些针对SYS.AUD$表的(有意的或偶然的)活动的证据。此外,如果将AUDIT_SYS _OPERATIONS设置为True,使用as sysdbaas sysoper 或以SYS自身连接的任何会话将记录到操作系统审计位置中,甚至Oracle DBA可能都无法访问该位置。因此,有许多合适的安全措施,用于确保记录数据库中所有权限的活动,以及隐藏该活动的任何尝试。

9.将审计相关的表更换表空间

需求:由于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>;

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

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 /u01/app/oracle/admin/ORCL/adump

audit_sys_operations boolean TRUE

audit_syslog_level string

audit_trail string DB, EXTENDED

如果在命令后面添加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 test; --审计 test 用户对表 user.table

delete,update,insert 操作

10.撤销审计

SQL> noaudit all on t_test;

11.将审计结果表从system表空间里移动到别的表空间上

实际上sys.aud$表上包含了两个lob段,并不是简单的move table就可以。

下面是具体的过程:

alter table sys.aud$ move tablespace users;

alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);

alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);

alter index sys.I_AUD1 rebuild tablespace users;应用

12.语句审计

多层环境下的审计appserve-应用服务器,jackson-client

AUDIT SELECT TABLE BY appserve ON BEHALF OF jackson;

审计连接或断开连接

AUDIT SESSION;

AUDIT SESSION BY jeff, lori; -- 指定用户 

审计权限(使用该权限才能执行的操作)

AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;

AUDIT DELETE ANY TABLE;

AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY

ACCESS WHENEVER NOT SUCCESSFUL;

对象审计:

AUDIT DELETE ON jeff.emp;

AUDIT SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;

取消审计:

NOAUDIT session;

NOAUDIT session BY jeff, lori;

NOAUDIT DELETE ANY TABLE;

NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;

NOAUDIT ALL; -- 取消所有statement审计

NOAUDIT ALL PRIVILEGES; --取消所有权限审计

NOAUDIT ALL ON DEFAULT; --取消所有对象审计

13.清除审计信息 

DELETE FROM SYS.AUD$;

DELETE FROM SYS.AUD$ WHERE obj$name='EMP';审计相关视图

14.审计相关视图

STMT_AUDIT_OPTION_MAP -- 审计选项类型代码 

AUDIT_ACTIONS -- action代码 

ALL_DEF_AUDIT_OPTS -- 对象创建时默认的对象审计选项

DBA_STMT_AUDIT_OPTS -- 当前数据库系统审计选项

DBA_PRIV_AUDIT_OPTS -- 权限审计选项

DBA_OBJ_AUDIT_OPTS

USER_OBJ_AUDIT_OPTS -- 对象审计选项

DBA_AUDIT_TRAIL

USER_AUDIT_TRAIL -- 审计记录 

DBA_AUDIT_OBJECT

USER_AUDIT_OBJECT -- 审计对象列表 

DBA_AUDIT_SESSION

USER_AUDIT_SESSION -- session审计

DBA_AUDIT_STATEMENT

USER_AUDIT_STATEMENT -- 语句审计

DBA_AUDIT_EXISTS -- 使用BY AUDIT NOT EXISTS(排除)选项的审计

DBA_AUDIT_POLICIES -- 审计POLICIES

DBA_COMMON_AUDIT_TRAIL--标准审计+精细审计

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐