首页 > 代码库 > Oracle 数据库审计

Oracle 数据库审计

    

保证数据库的安全有两种方式,一种是通过权限的存取控制机制,即通过预先控制来防止安全事件的发生;另一种是数据库审计,即对数据库活动做跟踪记录,当发生安全事件时,通过对数据库活动记录进行审计来发现并修复安全问题。

Oracle使用大量不同的审计方法来监控使用何种权限,以及访问哪些对象。审计不会防止使用这些权限,但可以提供有用的信息,用于揭示权限的滥用和误用。数据库审计的主要对象包括数据库链接、SQL语句执行、数据库对象访问等方面。审计记录存储的位置有两种选择:一种是存储在操作系统文件中,一种是存储在system表空间的sys.aud$表中。

1、和审计相关的参数

(1)  audit_sys_operations

(2)  audit_trail

(3)  audit_file_dest:指定审计信息的文件夹

SQL>show parameter audit –查询和审计相关的两个参数

2、audit_sys_operations参数

audit_sys_operations参数审计SYSDBA的活动,默认值false,相关的审计信息记录在操作系统文件中(因为有可能记录时数据库还未启动)。当参数值为false时,以下操作系统会强制记录在audit_file_dest指定的文件夹中:

(1)  用管理员权限连接实例

(2)  启动数据库

(3)  关闭数据库

audit_sys_operations参数设置为true后,作为SYSDBA和SYSOPER连接数据库的用户所发布的每条语句都会被写入操作系统的审计中,从而能够给出DBA所进行操作的完整记录。设置audit_sys_operations参数的语句如下:

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

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

3、audit_trail 参数

(1)audit_trail 参数的值可以设置为以下几种:

?  NONE:不审计,默认值。

?  DB:开启审计功能,将audit记录到sys.aud$表(审计的结果只有连接信息,不记录到SQLBIND和SQLTEXT字段)。

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

?  DB,extended:开启审计功能,将audit记录到sys.aud$表(审计信息除了连接信息还包含了当时执行的具体语句,记录到SQLBIND和SQLTEXT字段)。

?  Xml:审计记录写入xml格式的操作系统文件。

?  Xml,extended:审计记录写入xml格式的操作系统文件,包括SQLBIND和SQLTEXT值。

说明:这个参数是写到spfile里面的静态参数,需要重启数据库。

(2)设置参数值

SQL> alter system setaudit_trail=‘DB‘ scope=spfile;

说明:参数AUDIT_TRAIL不是动态的,为了使AUDIT_TRAIL参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时,应该注意监控该表的大小,以避免影响SYS表空间中其他对象的空间需求。

4、开启与关闭审计

(1)  开启审计案例

SQL>conn /as sysdba

SQL>show parameter audit

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   –对比先后两次的参照值

(2)  关闭审计案例

SQL>conn /as sysdba

SQL>show parameter audit

SQL>alter system set audit_trail=none scope=spfile;

SQL>startup force       --完成审计的关闭

SQL>conn /as sysdba

SQL>show parameter audit   –对比先后两次的参照值

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

5、审计类型

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

审 计 类 型

说    明

语句审计

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

权限审计

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

模式对象审计

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

细粒度的审计

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

(1)  语句级审计

所有类型的审计都使用audit命令来打开审计,使用noaudit命令来关闭审计。对于语句审计,audit命令的格式如下所示:

AUDIT sql_statement_clause BY {SESSION |ACCESS}

WHENEVER [NOT] SUCCESSFUL;

其中:

?  sql_statement_clause包含很多条不同的信息,例如希望审计的SQL语句类型以及审计什 么人。

?  希望在每次动作发生时都对其进行审计(by access);动作重复发生时只审计一次(by session)。默认是by session。

?  审计成功执行的语句,使用wheneversuccessful。审计没有成功执行的语句,使用 whenever not successful。

例如:按常规方式审计成功的和不成功的登录,这需要两个audit命令:

SQL>audit session whenever successful;

SQL>audit session whenever not successful;

?  对于大多数类别的审计方法,如果确实希望审计所有类型的表访问或某个用户的任何权限,则可以指定all而不是单个的语句类型或对象。

表1列出了可以审计的语句类型,并且在每个类别中包含了相关语句的简要描述。如果指定all,则审计该列表中的任何语句。表2中的语句类型在启用审计时不属于all类别;必须在audit命令中显式地指定它们。

表1 包括在ALL类别中的可审计语句

语 句 选 项

SQL操作

ALTER SYSTEM

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

CLUSTER

CREATE、ALTER、DROP或TRUNCATE集群

CONTEXT

CREATE CONTEXT或DROP CONTEXT

DATABASE LINK

CREATE或DROP数据库链接

DIMENSION

CREATE、ALTER或DROP维数

DIRECTORY

CREATE或DROP目录

INDEX

CREATE、ALTER或DROP索引

MATERIALIZED VIEW

CREATE、ALTER或DROP物化视图

NOT EXISTS

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

PROCEDURE

CREATE或DROP FUNCTION、LIBRARY、PACKAGE、PACKAGE BODY或PROCEDURE

PROFILE

CREATE、ALTER或DROP配置文件

PUBLIC DATABASE LINK

CREATE或DROP公有数据库链接

PUBLIC SYNONYM

CREATE或DROP公有同义词

ROLE

CREATE、ALTER、DROP或SET角色

ROLLBACK SEGMENT

CREATE、ALTER或DROP回滚段

SEQUENCE

CREATE或DROP序列

SESSION

登录和退出

SYNONYM

CREATE或DROP同义词

SYSTEM AUDIT

系统权限的AUDIT或NOAUDIT

SYSTEM GRANT

GRANT或REVOKE系统权限和角色

TABLE

CREATE、DROP或TRUNCATE表

TABLESPACE

CREATE、ALTER或DROP表空间

TRIGGER

CREATE、ALTER(启用/禁用)、DROP触发器;具有ENABLE ALL TRIGGERS或DISABLE ALL TRIGGERS的ALTER TABLE

TYPE

CREATE、ALTER和DROP类型以及类型主体

USER

CREATE、ALTER或DROP用户

VIEW

CREATE或DROP视图

表2 显式指定的语句类型

语 句 选 项

SQL 操 作

ALTER SEQUENCE

任何ALTER SEQUENCE命令

ALTER TABLE

任何ALTER TABLE命令

COMMENT TABLE

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

DELETE TABLE

删除表或视图中的行

EXECUTE PROCEDURE

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

GRANT DIRECTORY

GRANT或REVOKE DIRECTORY对象上的权限

GRANT PROCEDURE

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

GRANT SEQUENCE

GRANT或REVOKE序列上的权限

GRANT TABLE

GRANT或REVOKE表、视图或物化视图上的权限

GRANT TYPE

GRANT或REVOKE TYPE上的权限

INSERT TABLE

INSERT INTO表或视图

LOCK TABLE

表或视图上的LOCK TABLE命令

SELECT SEQUENCE

引用序列的CURRVAL或NEXTVAL的任何命令

SELECT TABLE

SELECT FROM表、视图或物化视图

UPDATE TABLE

在表或视图上执行UPDATE

?  案例1:

SQL> conn / as  sysdba

--可以使用如下命令审计 hr创建的索引

SQL> audit index by hr;

SQL> conn hr/hr –hr用户登陆

SQL> create index job_title_idx onhr.jobs(job_title);

SQL> conn / as  sysdba

--检查数据字典视图DBA_AUDIT_TRAIL中的审计跟踪

SQL> select username,to_char(timestamp,‘MM/DD/YY HH24:MI‘) Timestamp, obj_name, action_name,sql_text from dba_audit_trail where username = ‘HR‘;

--关闭HR.JOBS表上HR的审计

SQL> noaudit index by hr;

?  案例2:

SQL> conn / as  sysdba

--审计数据库中所有的create/drop/alter table语句。

SQL> audit table by scott by access;

SQL> conn scott/abc123

SQL> create table taudit1(a int);

SQL> create table taudit1(a int);

SQL> insert into taudit1 values(1);

SQL> select * from taudit1;

SQL> insert into taudit1 values(1);

SQL> conn / as  sysdba

SQL> select username, timestamp, owner,action_name, obj_name, returncode from dba_audit_object where username=‘SCOTT‘;

说明:所有scott用户创建表的语句均被审计,returncode表示返回码,0表示正确执行,955表示错误:“名称已由现有对象使用”。

(2)  权限级审计

审计系统权限具有与语句审计相同的基本语法,需要在sql_statement_clause上指定系统权限。例如,可能希望将ALTERTABLESPACE权限授予所有的DBA,但希望在发生这种情况时生成审计记录。启用对这种权限的审计的命令如下:

SQL> audit alter tablespace by access whenever successful;

此时,每次成功使用ALTER TABLESPACE权限时,都会将一行内容添加到SYS.AUD$。

?  案例

SQL> conn / as  sysdba

SQL> audit select table by scott bysession;

SQL> conn scott/abc123

SQL> select * from taudit1;

SQL> select * from taudit1;

SQL> conn / as  sysdba

SQL> select username, timestamp, owner,action_name, obj_name, returncode from dba_audit_object where username=‘SCOTT‘;

(3)  对象级审计

审计对各种模式对象的访问的命令格式如下:

AUDITschema_object_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL;

说明:

?  schema_object_clause指定对象访问的类型以及访问的对象。可以审计特定对象上14种不同的操作类型,下表中列出了这些操作。

对 象 选 项

说    明

ALTER

改变表、序列或物化视图

AUDIT

审计任何对象上的命令

COMMENT

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

DELETE

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

EXECUTE

执行过程、函数或程序包

FLASHBACK

执行表或视图上的闪回操作

GRANT

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

INDEX

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

INSERT

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

LOCK

锁定表、视图或物化视图

READ

对DIRECTORY对象的内容执行读操作

RENAME

重命名表、视图或过程

SELECT

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

UPDATE

更新表、视图或物化视图

?  案例:审计HR.JOBS表上所有用户每次成功进行的insert和update命令

SQL> conn / as  sysdba

SQL> audit insert, update on hr.jobs byaccess whenever successful;

SQL> conn hr/hr –hr用户登陆

SQL> insert into hr.jobs (job_id,job_title, min_salary, max_salary) values (‘IN_CFO‘,‘Internet Chief FunOfficer‘, 7500, 50000);

SQL> insert into hr.jobs (job_id,job_title, min_salary, max_salary) values (‘OE_VLD‘,‘Order Entry CCValidation‘, 5500, 20000);

SQL> conn / as  sysdba

--检查数据字典视图DBA_AUDIT_TRAIL中的审计跟踪

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

2  obj_name, action_name, sql_text from dba_audit_trail

3  where username = ‘HR‘;