下表中总结了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里新增的。
10g Values:
none
Disables database auditing.
os
Enables database auditing and directs all audit records to the operating system's audit trail.
db
Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).
db,extended
Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.
xml
Enables database auditing and writes all audit records to XML format OS files.
xml,extended
Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.
注:参数AUDIT_TRAIL不是动态的,为了使AUDIT_TRAIL参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时,应该注意监控该表的大小,以避免影响SYS表空间中其他对象的空间需求。推荐周期性归档SYS.AUD$中的行,并且截取该表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批处理作业中的特殊账户一起使用,用于归档和截取审计表。
audit_file_dest:Audit_trail=OS时 文件位置
1.语句审计
所有类型的审计都使用audit命令来打开审计,使用noaudit命令来关闭审计。对于语句审计,audit命令的格式看起来如下所示:
AUDIT sql_statement_clause BY {SESSION | ACCESS}
WHENEVER [NOT] SUCCESSFUL;
sql_statement_clause包含很多条不同的信息,例如希望审计的SQL语句类型以及审计什 么人。
此外,希望在每次动作发生时都对其进行审计(by access)或者只审计一次(by session)。默认是by session。
有时希望审计成功的动作:没有生成错误消息的语句。对于这些语句,添加whenever successful。而有时只关心使用审计语句的命令是否失败,失败原因是权限违犯、用完表空间中的空间还是语法错误。对于这些情况,使用 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
一些示例可以帮助读者更清楚地了解所有这些选项。在示例数据库中,用户KSHELTON具有HR模式和其他模式中所有表上的权限。允许 KSHELTON创建其中一些表上的索引,但如果有一些与执行计划改动相关的性能问题,则需要知道何时创建这些索引。可以使用如下命令审计 KSHELTON创建的索引:
SQL> audit index by kshelton;
Audit succeeded.
后面的某一天,KSHELTON在HR.JOBS表上创建了一个索引:
SQL> create index job_title_idx on hr.jobs(job_title);
Index created.
检查数据字典视图DBA_AUDIT_TRAIL中的审计跟踪,可以看到KSHELTON实际上在8月12日的5:15 P.M.创建了索引:
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 = 'KSHELTON';
USERNAME TIMESTAMP OBJ_NAME ACTION_NAME SQL_TEXT
--------- -------------- -------------- -------------- ----------------
KSHELTON 08/12/07 17:15 JOB_TITLE_IDX CREATE INDEX create index hr.
job_title_idx on
hr.jobs(job_title)
1 row selected.
注意:
从Oracle Database 11g开始,只有在初始参数AUDIT_TRAIL被设置为DB_EXTENDED时,才填充DBA_AUDIT_TRAIL中的列SQL_TEXT和SQL_BIND。默认情况下,AUDIT_TRAIL的值是DB。
为了关闭HR.JOBS表上KSHELTON的审计,可以使用noaudit命令,如下所示:
SQL> noaudit index by kshelton;
Noaudit succeeded.
也可能希望按常规方式审计成功的和不成功的登录,这需要两个audit命令:
SQL> audit session whenever successful;
Audit succeeded.
SQL> audit session whenever not successful;
Audit succeeded.
2.权限审计
审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限。
例如,可能希望将ALTER TABLESPACE权限授予所有的DBA,但希望在发生这种情况时生成审计记录。启用对这种权限的审计的命令看起来类似于语句审计:
SQL> audit alter tablespace by access whenever successful;
Audit succeeded.
每次成功使用ALTER TABLESPACE权限时,都会将一行内容添加到SYS.AUD$。
使用SYSDBA和SYSOPER权限或者以SYS用户连接到数据库的系统管理员可以利用特殊的审计。为了启用这种额外的审计级别,可以设置初始参数AUDIT_SYS_OPERATIONS为TRUE。这种审计记录发送到与操作系统审计记录相同的位置。因此,这个位置是和操作系统相关的。当使用其中一种权限时执行的所有SQL语句,以及作为用户SYS执行的任何SQL语句,都会发送到操作系统审计位置。
模式对象审计
审计对各种模式对象的访问看起来类似于语句审计和权限审计:
AUDIT schema_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命令,而不管谁正在进行更新,则每次该动作发生时,都可以使用如下所示的audit命令:
SQL> audit insert, update on hr.jobs by access whenever successful;
Audit successful.
用户KSHELTON决定向HR.JOBS表添加两个新行:
SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary)
2 values ('IN_CFO','Internet Chief Fun Officer', 7500, 50000);
1 row created.
SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary)
2 values ('OE_VLD','Order Entry CC Validation', 5500, 20000);
1 row created.
查看DBA_AUDIT_TRAIL视图,可以看到KSHELTON会话中的两个insert命令:
USERNAME TIMESTAMP OWNER OBJ_NAME ACTION_NAME
SQL_TEXT
---------- -------------- -------- ---------- ---------------
---------------------------------------------------------------
KSHELTON 08/12/07 22:54 HR JOBS INSERT
insert into hr.jobs (job_id, job_title, min_salary, max_salary)
values ('IN_CFO','Internet Chief Fun Officer', 7500, 50000);
KSHELTON 08/12/07 22:53 HR JOBS INSERT
insert into hr.jobs (job_id, job_title, min_salary, max_salary)
values ('OE_VLD','Order Entry CC Validation', 5500, 20000);
KSHELTON 08/12/07 22:51 LOGON
3 rows selected.
4.细粒度的审计
从Oracle9i开始,通过引入细粒度的对象审计,或称为FGA,审计变得更为关注某个方面,并且更为精确。由称为DBMS_FGA的PL/SQL程序包实现FGA。
使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where子句),还指定了表中访问的列。通过只在访问某些行和列时审计对表的访问,可以极大地减少审计表条目的数量。
程序包DBMS_FGA具有4个过程:
ADD_POLICY
添加使用谓词和审计列的审计策略
DROP_POLICY
删除审计策略
DISABLE_POLICY
禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY
启用策略
用户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;
可以使用数据字典视图DBA_FGA_AUDIT_TRAIL访问细粒度审计的审计记录。如果一般需要查看标准的审计行和细粒度的审计行,则数据字典视图DBA_COMMON_AUDIT_TRAIL结合了这两种审计类型中的行。
继续看示例,用户TAMARA运行了如下两个SQL查询:
SQL> select employee_id, first_name, last_name, email from hr.employees
2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL
----------- ------------------ --------------------- --------------
114 Den Raphaely DRAPHEAL
1 row selected.
SQL> select employee_id, first_name, last_name, salary from hr.employees
2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- ------------------ ----------------------- ----------
114 Den Raphaely 11000
1 row selected.
第一个查询访问经理信息,但没有访问SALARY列。第二个查询与第一个查询相同,但是访问了SALARY列,因此触发了FGA策略,从而在审计跟踪中生成了一行:
SQL> select to_char(timestamp,'mm/dd/yy hh24:mi') timestamp,
2 object_schema, object_name, policy_name, statement_type
3 from dba_fga_audit_trail
4 where db_user = 'TAMARA';
TIMESTAMP OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE
-------------- ------------- ------------- ---------------- --------------
08/12/07 18:07 HR EMPLOYEES SAL_SELECT_AUDIT SELECT
1 row selected.
因为在本章前面的VPD示例中建立了细粒度的访问控制来阻止对SALARY列的未授权访问,因此需要加倍检查策略函数,确保仍然正确限制了SALARY信息。细粒度的审计以及标准审计是确保首先正确建立授权策略的好方法。
5.与审计相关的数据字典视图
下表包含了与审计相关的数据字典视图。
数据字典视图
说 明
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
对语句生效的审计选项
6.保护审计跟踪
审计跟踪自身需要受到保护,特别是在非系统用户必须访问表SYS.AUD$时。内置的角色DELETE_ANY_CATALOG是非SYS用户可以访问审计跟踪的一种方法(例如,归档和截取审计跟踪,以确保它不会影响到SYS表空间中其他对象的空间需求)。
为了建立对审计跟踪自身的审计,以SYSDBA身份连接到数据库,并运行下面的命令:
SQL> audit all on sys.aud$ by access;
Audit succeeded.
现在,所有针对表SYS.AUD$的动作,包括select、insert、update和delete,都记录在SYS.AUD$自身中。但是,您可能会问,如果某个人删除了标识对表SYS.AUD$访问的审计记录,这时会发生什么?此时将删除表中的行,但接着插入另一行,记录行的删除。因此,总是存在一些针对SYS.AUD$表的(有意的或偶然的)活动的证据。此外,如果将AUDIT_SYS _OPERATIONS设置为True,使用as sysdba、as sysoper或以SYS自身连接的任何会话将记录到操作系统审计位置中,甚至Oracle DBA可能都无法访问该位置。因此,有许多合适的安全措施,用于确保记录数据库中所有权限的活动,以及隐藏该活动的任何尝试。
7.启用增强的审计
从Oracle Database 11g开始,数据库配置助手(Database Configuration Assistant,DBCA)很容易启用默认的(增强的)审计。虽然记录审计信息有一些系统开销,但兼容性需求(例如,Sarbanes-Oxley法案中规定的兼容性需求)要求严格监控所有业务操作,包括数据库中与安全相关的操作。
可以在创建数据库时或在数据库已经创建之后使用DBCA配置默认审计。如果已经改变了很多审计设置,并想要将审计选项重置为基线值,则在数据库已创建之后使用DBCA配置默认审计就非常有用。
除将初始参数AUDIT_TRAIL的值设置为DB外,默认审计设置还审计audit role命令本身。另外,在Audited Privileges选项卡的Oracle Enterprise Manager Audit Settings页面中,可以查看默认的审计权限。
补充说明:
8、实例讲解
8.1、激活审计
审计相关的表安装
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表空间又足够的空间存放审计信息。
安装后要重启数据库
将审计相关的表移动到其他表空间
由于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
audit_trail string NONE
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
8.2、开始审计
SQL> conn /as sysdba
SQL> audit all on t_test;
SQL> conn u_test
SQL> select * from t_test;
SQL> insert into u_test.t_test (c2,c5) values ('test1','2');
SQL> commit;
SQL> delete from u_test.t_test;
SQL> commit;
SQL> conn /as sysdba
SQL> col DEST_NAME format a30
col OS_USERNAME format a15
col USERNAME format a15
col USERHOST format a15
col TERMINAL format a15
col OBJ_NAME format a30
col SQL_TEXT format a60
SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
sql> audit select table by u_test by access;
如果在命令后面添加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操作
8.3、撤销审计
SQL> noaudit all on t_test;
9、审计语句
多层环境下的审计: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; -- 取消所有对象审计
10、清除审计信息
DELETE FROM SYS.AUD$;
DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、审计视图
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 -- 标准审计+精细审计
12、将审计结果表从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;
一、 审计分类:
Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
二、 标准审计:
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$的SQLBIND和SQLTEXT字段
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 ALTER,UPDATE 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") 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:
在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。
使用了公司网络外部的某个 IP 地址。
选定或更新了特定列。
使用了该列的特定值。
这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从 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;
进行审计。即使用户没有明确指定列 BALANCE,where 子句也隐含地选择了它。
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,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。
由于 FGA 捕获绑定变量,它可以帮助了解绑定变量值的模式,这有助于设计直方图集合等。
可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。
由于 FGA 可以作为 SELECT 语句的触发器,可以在需要这种功能的任何时候使用它。
3.8 FGA在10G中的增强:
3.8.1 对所有DML的审计:
在9i中FGA只能对Select语句进行审计,而不能对其他DML语句(Update、Delete、Insert)进行审计,如果想对其他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 审计和标准审计的差异 :
标准审计必须用参数 AUDIT_TRAIL 在数据库级启用。这个参数不是动态的;您必须重启数据库来使其生效。相比而言,FGA 不需要任何参数修改。
一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,FGA 可以临时禁用和启用,不丢失任何元数据信息。
FGA 只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常规审计可以处理其它许多语句和权限,甚至会话连接和断开。
标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。FGA 并不是同样节省资源;它每次访问运行一次 — 使得线索更大。
通过记录线索,标准审计可以用来检测任何中断企图,如果企图没有成功,则将产生错误代码。而 FGA 不能。
标准审计可以写数据库表或 OS 文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。在 Windows 下,非数据库审计线索记录在事件日志中,并且可以用不同的方式对其进行访问。这个选项保护了审计线索的完整性。然而,FGA 日志仅写到数据库表 FGA_LOG$ 中。可以在 FGA 中创建用户自定义的审计处理程序来写 OS 文件,但它们的完整性不能保证。
标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在 FGA 中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。
在 FGA 中,审计更加灵活 — 仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在您需要控制线索的增长时非常方便。
在 FGA 中,SQL 赋值变量默认被捕获。在标准审计中,必须把初始化参数 audit_trail设为 db_extended,以启用这一功能。
权限差异:标准审计需要审计系统或语句权限;FGA 只需要 dbms_fga 程序包上的运行权限。
什么是审计
审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)或数据库(存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查看)中。默认情况下审计是没有开启的。
不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。
2、和审计相关的两个主要参数
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里新增的。
注:这两个参数是static参数,需要重新启动数据库才能生效。
3、审计级别
当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、PRivilege(权限)、object(对象)。
Statement:
按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。
Privilege:
按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。
Object:
按对象审计,只审计on关键字指定对象的相关操作,如aduit alter,delete,drop,insert on cmy.t by scott; 这里会对cmy用户的t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。注意Oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle则提供on default子句来实现自动审计,比如执行audit drop on default by access;后, 对于随后创建的对象的drop操作都会审计。但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比trigger可以对schema的DDL进行“审计”,这个功能稍显不足。
4、审计的一些其他选项
by access / by session:
by access 每一个被审计的操作都会生成一条audit trail。
by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。
whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计,
whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。
5、和审计相关的视图
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子句设置了哪些默认对象审计。
6、取消审计
将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;
7、10g中的审计告知一切
Oracle 数据库 10g 审计以一种非常详细的级别捕获用户行为,它可以消除手动的、基于触发器的审计。
假定用户 Joe 具有更新那张表的权限,并按如下所示的方式更新了表中的一行数据:
update SCOTT.EMP set salary = 12000 where empno = 123456;
您如何在数据库中跟踪这种行为呢?在 Oracle 9i 数据库及其较低版本中,审计只能捕获“谁”执行此操作,而不能捕获执行了“什么”内容。例如,它让您知道 Joe 更新了 SCOTT 所有的表EMP,但它不会显示他更新了该表中员工号为 123456 的薪水列。它不会显示更改前的薪水列的值 — 要捕获如此详细的更改,您将不得不编写您自己的触发器来捕获更改前的值,或使用 LogMiner 将它们从存档日志中检索出来。
细粒度审计(FGA) ,是在 Oracle 9i 中引入的,能够记录 SCN 号和行级的更改以重建旧的数据,但是它们只能用于 select 语句,而不能用于 DML ,如 update 、insert 和delete 语句。因此,对于 Oracle 数据库 10g 之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。
8、实例讲解
8.1、激活审计
sqlplus / 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
audit_trail string NONE
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
8.2、开始审计
sqlplus / as sysdba
SQL> audit all on t_test;
SQL> conn u_test
SQL> select * from t_test;
SQL> insert into u_test.t_test (c2,c5) values ('test1','2');
SQL> commit;
SQL> delete from u_test.t_test;
SQL> commit;
SQL> conn /as sysdba
SQL> col DEST_NAME format a30
col OS_USERNAME format a15
col USERNAME format a15
col USERHOST format a15
col TERMINAL format a15
col OBJ_NAME format a30
col SQL_TEXT format a60
SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
sql> audit select table by u_test by access;
如果在命令后面添加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操作
8.3、撤销审计
SQL> noaudit all on t_test;
9、审计语句
多层环境下的审计: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; -- 取消所有对象审计
10、清除审计信息
DELETE FROM SYS.AUD$;
DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、审计视图
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 -- 标准审计+精细审计
12、将审计结果表从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 u
Oracle审计audit启用审计登录审计
审计是监视和记录所选用户的数据活动的。审计操作类型包括登录企图、对象访问和数据库操作。审计记录包括被审计的操作、执行操作的用户、操作的时间等信息。
1 、 启用审计
其具体步骤如下:
(1 ) 进入Oracle 的企业管理器,在服务器下面的数据库配置中选择初始化参数。
(2 ) 点击初始化后进入如下初始化参数界面
该界面有两个选项界面,当前和SPFile ,其中当前是展示参数值的,而SPFile 是修改参数值的。
(3 ) 在SPFile 界面找到audit_trail 参数,该参数是管理审计的,修改它的值。它的取值范围为:DB 、True 、false 、none 、os 、db_extended 、xml 和extended 。如果该参数的值为True 或db ,则审计记录将被记录到sys.aud$ 表中;如果参数值为os ,则写入一个操作系统文件。
(4 ) 修改以后单击应用按钮,然后重启数据库。
2 、登录审计
登录审计的命令如下:
( 1 ) audit session :开启会话审计
( 2 ) audit session whenever successful :开启成功操作审计
( 3 ) audit session whenever not successful :开启失败操作审计
( 4 ) noaudit session :禁止会话审计
3 、操作审计
对表、表空间等数据库对象的任何操作都可被审计。
语法格式如下:
audit {statement_opt | system_priv} [by user,…n]
[by {session | access}] [whenever [not] successful]
注:
statement_opt :审计操作。
system_priv :指定审计的系统权限
by user,…n :指定审计的用户,如果不指定将为所有的用户审计
by session :表示同一会话中的同一类型的 sql 语句仅写单个记录
by access :每个被审计的语句写一个记录。
Whenever [not] successful :表示成功或失败的时候审计
示例代码,对用户 andy 的新建表操作都审计:
audit create table by andy by access;
4 、对象审计
还可以审计对象的数据处理操作,这些操作包括对表的更新、选择、插入和删除等。
语法格式如下:
audit {object_opt | all} on
{[schema.]object | drectory directory_name | default}
[by session | access]
[whenever [not] successful]
其中, object_opt 指审计操作;
all 表示所有对象操作;
object 表示审计对象;
default :默认的审计选项
directory directory_name :审计的目录名
示例代码,审计用户 andy 的 t_module 表的 insert 操作:
audit insert on andy.t_module;
通过对 dba_audit_object 视图进行查询,就可以看到审计记录。
5 、权限审计
权限审计表示只对系统的某一权限的使用情况进行审计。
示例代码:
audit select any table whenever successful;
通过查询 dba_priv_audit_opts 可以看到权限审计的结果
一.粗粒度审计功能。
1.审计级别:
语句级审计(stmt):表示只审计某种类型的SQL语句,不指定结构或对象。
权限级审计(privs):表示只审计执行相应动作的系统权限的使用情况。
实体级审计(obj):表示只对指定模式上的实体指定语句的审计。
根据用户语句的执行结果,审计语句分为成功语句的审计(Whenever Successful)、不成功语句的审计(Whenever NOT Successful)以及无论成功与否都进行审计(默认情况)。
根据用户语句的执行次数,审计又分为对某一用户或全体用户的会话(By Session)审计、对某一用户或全体用户存取方式(By Access)的审计。
某一用户或全体用户的会话审计表示用户语句每执行一次就审计一次;某一用户或全体用户存取方式审计表示相同语句执行多次时,每执行一次就审计一次。
当数据库的审计功能被启动后,在用户语句执行阶段,系统会自动产生审计信息。审计信息中包括审计的操作、用户执行的操作、操作日期、操作时间等信息。
2.初始化参数:
audit_trail=none|false|db|true|os
none,false效果相同,db,true效果相同,os将结果存放到audit_dump_file参数对应的目录下。
audit_sys_operations=false|true 是否启动对sysdba,sysoper身份的用户的审计。
3.语法:
audit stmt opts|privs opts|obj opts by users by session|access whenever [not] successful;
4.审计类型:
语句级审计
语句级审计表示只审计某种类型的SQL语句。可以审计某个用户,也可以审计所有用户的SQL语句。语句级审计的语法如下:
AUDIT SQL语句选项 [by 用户名] [by session|access] [whenever [NOT] successful;
语句选项
被审计的语句
CLUSTER
Create Cluster、Audit Cluster、Drop Cluster、Truncate Cluster
DATABASE LINK
Create Database Link、Drop Database Link
DIRECTORY
Create Directory、Drop Directory
INDEX
Create Index、Alter Index、Drop Index
PROCEDURE
Create Function、Create Library、Create Package、Create Package Body、Create Procedure、Drop Function、Drop Library、Drop Package
PROFILE
Create Profile、Alter Profile、Drop Profile
PUBLIC SYNONYM
Create Public Synonym、Drop Public Synonym
ROLE
Create Role、Alter Role、Drop Role、Set Role
ROLLBACK SEGMENT
Create Rollback Segment、Alter Rollback Segment、Drop Rollback Segment
SEQUENCE
Create Sequence、Drop Sequence
SESSION
Connect、Disconnect
SYNONYM
Create Synonym、Drop Synonym
SYSTEM AUDIT
Audit、Noaudit
SYSTEM GRANT
Grant、Revoke
TABLE
Create Table、Drop Table、Truncate Table
TABLESPACE
Create Tablespace、Alter Tablespace、Drop Tablespace
TRIGGER
Create Trigger、Alter Trigger
USERS
Create User、Alter User、Drop User
TYPE
Create Type、Create Type Body、Alter Type、Drop Type、Drop Type Body
VIEW
Create View、Drop View
ALTER SEQUENCE
Alter Sequence
ALTER TABLE
Alter Table
DELETE TABLE
Delete from tables、views
EXECUTE
Execute Function、Library、Package
GRANT SEQUENCE
Grant privilege On sequence、Revoke privilege On sequence
GRANT TABLE
Grant privilege on table、Revoke privilege on table
UPDATE TABLE
Lock Table
在使用时,不需要写出全部的SQL语句,只要写出语句的选项即可。
“by 用户名”表示只审计指定用户的SQL语句,不审计其他用户。没有指出用户名时,则审计全体用户。
audit table by scott; 表示scott用户在执行Create Table、Drop Table、Truncate Table操作时将被审计。
audit table; 表示所有用户执行该类型的语句都被审计。
“by session”表示按会话方式审计,在每个会话中,相同的语句只审计一次。这是系统默认的方式。
“by access”表示按存取方式审计,每一次语句都将审计。
“whenever successful”表示只审计成功语句。
“whenever not successful”表示只审计不成功语句。
audit table by scott by access;(审计scott用户每一次对表的CREATE、DROP、Truncate操作)。
audit table by scott by session;(审计scott用户对表的CREATE、DROP、Truncate操作,相同的操作只记录一次)。
audit session by tax02 by session whenever not successful;(审计tax02用户尝试连接数据库,但不成功的信息,相同的操作只记录一次)。
audit session by tax01,tax02;(审计tax01,tax02用户尝试连接数据库,成功的信息,相同的操作只记录一次)。
audit session whenever not successful;(审计尝试连接数据库,但不成功的信息)。
如果要了解对于哪些用户都进行了语句级审计及审计的选项,可以查询数据字典DBA_STMT_AUDIT_OPTS,该数据字典要以sys用户连接数据库查询。
当不再对用户进行审计时,可以使用noaudit命令,把用户进行的审计取消。
noaudit SQL语句或选项 [by 用户名] [by session|access] [Whenever [NOT] Successful];
权限级审计
权限级审计表示只审计某一个系统权限的使用情况。可以审计某个用户所使用的系统权限,也可以审计所有用户使用的系统权限。权限级审计的语法如下:
Audit 权限名称 [by 用户名] [by session|Access] [Whenever [NOT] Successful];
例如:
audit delete any table whenever not successful;(审计所有用户不成功的DELETE ANY TABLE权限使用情况)。
audit create table whenever not successful;(审计所有用户不成功的CREATE TABLE权限使用情况)。
audit alter any table,alter any procedure by scott by access whenever not successful;
audit create user by tax02 whenever not successful;
如果要了解对哪些用户进行了权限级审计及审计选项,可以查询数据字典DBA_PRIV_AUDIT_OPTS,该数据字典必须以sys用户连接数据库进行查询。
当不再对用户的系统权限进行审计时,可以使用noaudit命令取消对用户所进行的审计。取消用户权限审计的命令如下:
noaudit 权限名称 [by 用户名] [by session|access] [whenever [NOT] Successful];
例如:
noaudit alter any table,alter any procedure by scott by access whenever not successful;
noaudit create user by tax02 whenever not successful;
noaudit create table whenever not successful;
审计停止后,用户所进行的操作将不再记录。
实体级审计
实体审计用于监视所有用户对某一指定用户的表的存取状况。实体级审计是不分审计对象的,数据库管理员关心的重点是哪些用户操作某一个指定用户的表。实体级审计的语法如下:
audit 实体选项 on schema.实体名称 [by session | access] [Whenever [NOT] Successful];
实体级审计中的实体选项及对实体操作的语句
TABLE
VIEW
SEQUENCE
PROCEDURE
SNAPSHOTS
ALTER
√
√
DELETE
√
√
EXECUTE
√
INDEX
√
INSERT
√
√
REFERENCES
√
SELECT
√
√
√
√
UPDATE
√
√
例如:
audit delete on scott.emp by access whenever successful;(审计所有用户对scott.emp表所有成功的DELETE操作,每次操作都会记录)
audit delete on scott.dept by access whenever not successful;(审计所有用户对scott.emp表所有不成功的DELETE操作,每次操作都会记录)
audit select on sys.tab;(审计所有用户对sys.tab表的SELECT操作,相同的操作只会记录一次)
audit update on scott.dept;
audit update,delete on hr.employees by access whenever successful;
audit update,delete on hr.employees by user;(对user用户对hr.employees的update,delete进行审计)
如果要了解对哪些用户的实体进行了实体级审计及审计选项,可以查询数据字典DBA_OBJ_AUDIT_OPTS,该数据字典必须以sys用户连接数据库进行查询。例如对于用户scott所进行的实体级审计信息,可以使用以下命令:
select object_name,object_type,alt,aud,com,del,gra,ind,ins,loc,ren,sel,upd,ref,exe,cre,rea,wri from dba_obj_audit_opts where owner='SCOTT';
“-”表示没有设置该选项的审计。
“S”表示使用by session选项进行审计。
“A”表示使用by access选项进行审计。
“/”表示使用过whenever successful、whenever not successful选项值。
使用noaudit命令取消对用户实体所进行的审计。
例如:
noaudit delete on scott.emp by access whenever successful;
noaudit delete on scott.dept by access whenever not successful;
5.查看审计结果:
dba_audit_trail;
DBA_AUDIT_TRAIL displays all standard audit trail entries.
dba_audit_session;
DBA_AUDIT_SESSION displays all audit trail records concerning CONNECT and DISCONNECT.
dba_audit_object;
DBA_AUDIT_OBJECT displays audit trail records for all objects in the database.
6.查看创建了哪些审计:
dba_obj_audit_opts;(实体级审计)
dba_priv_audit_opts;(权限级审计)
dba_stmt_audit_opts;(语句级审计)
7.取消审计(将原有的audit语句的audit换成noaudit执行即可):
noaudit all;
noaudit all privileges;
noaudit update,delete on table_name [by username];
8.删除审计记录:
delete from sys.aud$ where timestamp#
二.细粒度审计(FGA)功能。
细粒度的审计使用DBMS_FGA包完成配置和管理工作。细粒度审计除了审计功能外,还可用于绑定变量值的捕获,下面简单讨论一下DBMS_FGA包的使用:
SQL> desc dbms_fga
PROCEDURE ADD_POLICY
Argument Name
下面介绍几个最常用的初始化参数和视图:
1).SYS.FGA_LOG$:如果audit_trail参数包含DB,那么审计记录会被记录在FGA_LOG$表中。
2).AUDIT_FILE_DEST初始化参数:设置审计操作系统文件的存放位置。
3).V$XML_AUDIT_TRAIL:如果audit_trail参数包含XML,那么审计记录会记录在AUDIT_FILE_DEST初始化参数指定的目的地下的XML文件中,Oracle会读取这些XML文件,生成V$XML_AUDIT_TRAIL动态性能视图,方便DBA查看审计详细信息。
4).DBA_AUDIT_POLICIES:详细记录了审计配置的策略信息。
5).DBA_FGA_AUDIT_TRAIL:查看到审计的SQL语句和绑定变量。
6).DBA_COMMON_AUDIT_TRAIL:包含V$XML_AUDIT_TRAIL动态性能视图的内容,是标准和细粒度审计记录。
注意:
启用细粒度的审计功能不需要设置数据库的AUDIT_TRAIL初始化参数,只需要设置DBMS_FGA.ADD_POLICY存储过程中的AUDIT_TRAIL参数或使用默认值即可。
审 计 类 型
说 明
语句审计
按照语句类型审计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里新增的。
10g Values:
none
Disables database auditing.
os
Enables database auditing and directs all audit records to the operating system's audit trail.
db
Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).
db,extended
Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.
xml
Enables database auditing and writes all audit records to XML format OS files.
xml,extended
Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.
注:参数AUDIT_TRAIL不是动态的,为了使AUDIT_TRAIL参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时,应该注意监控该表的大小,以避免影响SYS表空间中其他对象的空间需求。推荐周期性归档SYS.AUD$中的行,并且截取该表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批处理作业中的特殊账户一起使用,用于归档和截取审计表。
audit_file_dest:Audit_trail=OS时 文件位置
1.语句审计
所有类型的审计都使用audit命令来打开审计,使用noaudit命令来关闭审计。对于语句审计,audit命令的格式看起来如下所示:
AUDIT sql_statement_clause BY {SESSION | ACCESS}
WHENEVER [NOT] SUCCESSFUL;
sql_statement_clause包含很多条不同的信息,例如希望审计的SQL语句类型以及审计什 么人。
此外,希望在每次动作发生时都对其进行审计(by access)或者只审计一次(by session)。默认是by session。
有时希望审计成功的动作:没有生成错误消息的语句。对于这些语句,添加whenever successful。而有时只关心使用审计语句的命令是否失败,失败原因是权限违犯、用完表空间中的空间还是语法错误。对于这些情况,使用 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
一些示例可以帮助读者更清楚地了解所有这些选项。在示例数据库中,用户KSHELTON具有HR模式和其他模式中所有表上的权限。允许 KSHELTON创建其中一些表上的索引,但如果有一些与执行计划改动相关的性能问题,则需要知道何时创建这些索引。可以使用如下命令审计 KSHELTON创建的索引:
SQL> audit index by kshelton;
Audit succeeded.
后面的某一天,KSHELTON在HR.JOBS表上创建了一个索引:
SQL> create index job_title_idx on hr.jobs(job_title);
Index created.
检查数据字典视图DBA_AUDIT_TRAIL中的审计跟踪,可以看到KSHELTON实际上在8月12日的5:15 P.M.创建了索引:
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 = 'KSHELTON';
USERNAME TIMESTAMP OBJ_NAME ACTION_NAME SQL_TEXT
--------- -------------- -------------- -------------- ----------------
KSHELTON 08/12/07 17:15 JOB_TITLE_IDX CREATE INDEX create index hr.
job_title_idx on
hr.jobs(job_title)
1 row selected.
注意:
从Oracle Database 11g开始,只有在初始参数AUDIT_TRAIL被设置为DB_EXTENDED时,才填充DBA_AUDIT_TRAIL中的列SQL_TEXT和SQL_BIND。默认情况下,AUDIT_TRAIL的值是DB。
为了关闭HR.JOBS表上KSHELTON的审计,可以使用noaudit命令,如下所示:
SQL> noaudit index by kshelton;
Noaudit succeeded.
也可能希望按常规方式审计成功的和不成功的登录,这需要两个audit命令:
SQL> audit session whenever successful;
Audit succeeded.
SQL> audit session whenever not successful;
Audit succeeded.
2.权限审计
审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限。
例如,可能希望将ALTER TABLESPACE权限授予所有的DBA,但希望在发生这种情况时生成审计记录。启用对这种权限的审计的命令看起来类似于语句审计:
SQL> audit alter tablespace by access whenever successful;
Audit succeeded.
每次成功使用ALTER TABLESPACE权限时,都会将一行内容添加到SYS.AUD$。
使用SYSDBA和SYSOPER权限或者以SYS用户连接到数据库的系统管理员可以利用特殊的审计。为了启用这种额外的审计级别,可以设置初始参数AUDIT_SYS_OPERATIONS为TRUE。这种审计记录发送到与操作系统审计记录相同的位置。因此,这个位置是和操作系统相关的。当使用其中一种权限时执行的所有SQL语句,以及作为用户SYS执行的任何SQL语句,都会发送到操作系统审计位置。
模式对象审计
审计对各种模式对象的访问看起来类似于语句审计和权限审计:
AUDIT schema_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命令,而不管谁正在进行更新,则每次该动作发生时,都可以使用如下所示的audit命令:
SQL> audit insert, update on hr.jobs by access whenever successful;
Audit successful.
用户KSHELTON决定向HR.JOBS表添加两个新行:
SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary)
2 values ('IN_CFO','Internet Chief Fun Officer', 7500, 50000);
1 row created.
SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary)
2 values ('OE_VLD','Order Entry CC Validation', 5500, 20000);
1 row created.
查看DBA_AUDIT_TRAIL视图,可以看到KSHELTON会话中的两个insert命令:
USERNAME TIMESTAMP OWNER OBJ_NAME ACTION_NAME
SQL_TEXT
---------- -------------- -------- ---------- ---------------
---------------------------------------------------------------
KSHELTON 08/12/07 22:54 HR JOBS INSERT
insert into hr.jobs (job_id, job_title, min_salary, max_salary)
values ('IN_CFO','Internet Chief Fun Officer', 7500, 50000);
KSHELTON 08/12/07 22:53 HR JOBS INSERT
insert into hr.jobs (job_id, job_title, min_salary, max_salary)
values ('OE_VLD','Order Entry CC Validation', 5500, 20000);
KSHELTON 08/12/07 22:51 LOGON
3 rows selected.
4.细粒度的审计
从Oracle9i开始,通过引入细粒度的对象审计,或称为FGA,审计变得更为关注某个方面,并且更为精确。由称为DBMS_FGA的PL/SQL程序包实现FGA。
使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where子句),还指定了表中访问的列。通过只在访问某些行和列时审计对表的访问,可以极大地减少审计表条目的数量。
程序包DBMS_FGA具有4个过程:
ADD_POLICY
添加使用谓词和审计列的审计策略
DROP_POLICY
删除审计策略
DISABLE_POLICY
禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY
启用策略
用户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;
可以使用数据字典视图DBA_FGA_AUDIT_TRAIL访问细粒度审计的审计记录。如果一般需要查看标准的审计行和细粒度的审计行,则数据字典视图DBA_COMMON_AUDIT_TRAIL结合了这两种审计类型中的行。
继续看示例,用户TAMARA运行了如下两个SQL查询:
SQL> select employee_id, first_name, last_name, email from hr.employees
2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL
----------- ------------------ --------------------- --------------
114 Den Raphaely DRAPHEAL
1 row selected.
SQL> select employee_id, first_name, last_name, salary from hr.employees
2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- ------------------ ----------------------- ----------
114 Den Raphaely 11000
1 row selected.
第一个查询访问经理信息,但没有访问SALARY列。第二个查询与第一个查询相同,但是访问了SALARY列,因此触发了FGA策略,从而在审计跟踪中生成了一行:
SQL> select to_char(timestamp,'mm/dd/yy hh24:mi') timestamp,
2 object_schema, object_name, policy_name, statement_type
3 from dba_fga_audit_trail
4 where db_user = 'TAMARA';
TIMESTAMP OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE
-------------- ------------- ------------- ---------------- --------------
08/12/07 18:07 HR EMPLOYEES SAL_SELECT_AUDIT SELECT
1 row selected.
因为在本章前面的VPD示例中建立了细粒度的访问控制来阻止对SALARY列的未授权访问,因此需要加倍检查策略函数,确保仍然正确限制了SALARY信息。细粒度的审计以及标准审计是确保首先正确建立授权策略的好方法。
5.与审计相关的数据字典视图
下表包含了与审计相关的数据字典视图。
数据字典视图
说 明
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
对语句生效的审计选项
6.保护审计跟踪
审计跟踪自身需要受到保护,特别是在非系统用户必须访问表SYS.AUD$时。内置的角色DELETE_ANY_CATALOG是非SYS用户可以访问审计跟踪的一种方法(例如,归档和截取审计跟踪,以确保它不会影响到SYS表空间中其他对象的空间需求)。
为了建立对审计跟踪自身的审计,以SYSDBA身份连接到数据库,并运行下面的命令:
SQL> audit all on sys.aud$ by access;
Audit succeeded.
现在,所有针对表SYS.AUD$的动作,包括select、insert、update和delete,都记录在SYS.AUD$自身中。但是,您可能会问,如果某个人删除了标识对表SYS.AUD$访问的审计记录,这时会发生什么?此时将删除表中的行,但接着插入另一行,记录行的删除。因此,总是存在一些针对SYS.AUD$表的(有意的或偶然的)活动的证据。此外,如果将AUDIT_SYS _OPERATIONS设置为True,使用as sysdba、as sysoper或以SYS自身连接的任何会话将记录到操作系统审计位置中,甚至Oracle DBA可能都无法访问该位置。因此,有许多合适的安全措施,用于确保记录数据库中所有权限的活动,以及隐藏该活动的任何尝试。
7.启用增强的审计
从Oracle Database 11g开始,数据库配置助手(Database Configuration Assistant,DBCA)很容易启用默认的(增强的)审计。虽然记录审计信息有一些系统开销,但兼容性需求(例如,Sarbanes-Oxley法案中规定的兼容性需求)要求严格监控所有业务操作,包括数据库中与安全相关的操作。
可以在创建数据库时或在数据库已经创建之后使用DBCA配置默认审计。如果已经改变了很多审计设置,并想要将审计选项重置为基线值,则在数据库已创建之后使用DBCA配置默认审计就非常有用。
除将初始参数AUDIT_TRAIL的值设置为DB外,默认审计设置还审计audit role命令本身。另外,在Audited Privileges选项卡的Oracle Enterprise Manager Audit Settings页面中,可以查看默认的审计权限。
补充说明:
8、实例讲解
8.1、激活审计
审计相关的表安装
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表空间又足够的空间存放审计信息。
安装后要重启数据库
将审计相关的表移动到其他表空间
由于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
audit_trail string NONE
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
8.2、开始审计
SQL> conn /as sysdba
SQL> audit all on t_test;
SQL> conn u_test
SQL> select * from t_test;
SQL> insert into u_test.t_test (c2,c5) values ('test1','2');
SQL> commit;
SQL> delete from u_test.t_test;
SQL> commit;
SQL> conn /as sysdba
SQL> col DEST_NAME format a30
col OS_USERNAME format a15
col USERNAME format a15
col USERHOST format a15
col TERMINAL format a15
col OBJ_NAME format a30
col SQL_TEXT format a60
SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
sql> audit select table by u_test by access;
如果在命令后面添加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操作
8.3、撤销审计
SQL> noaudit all on t_test;
9、审计语句
多层环境下的审计: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; -- 取消所有对象审计
10、清除审计信息
DELETE FROM SYS.AUD$;
DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、审计视图
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 -- 标准审计+精细审计
12、将审计结果表从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;
一、 审计分类:
Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
二、 标准审计:
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$的SQLBIND和SQLTEXT字段
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 ALTER,UPDATE 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") 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:
在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。
使用了公司网络外部的某个 IP 地址。
选定或更新了特定列。
使用了该列的特定值。
这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从 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;
进行审计。即使用户没有明确指定列 BALANCE,where 子句也隐含地选择了它。
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,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。
由于 FGA 捕获绑定变量,它可以帮助了解绑定变量值的模式,这有助于设计直方图集合等。
可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。
由于 FGA 可以作为 SELECT 语句的触发器,可以在需要这种功能的任何时候使用它。
3.8 FGA在10G中的增强:
3.8.1 对所有DML的审计:
在9i中FGA只能对Select语句进行审计,而不能对其他DML语句(Update、Delete、Insert)进行审计,如果想对其他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 审计和标准审计的差异 :
标准审计必须用参数 AUDIT_TRAIL 在数据库级启用。这个参数不是动态的;您必须重启数据库来使其生效。相比而言,FGA 不需要任何参数修改。
一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,FGA 可以临时禁用和启用,不丢失任何元数据信息。
FGA 只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常规审计可以处理其它许多语句和权限,甚至会话连接和断开。
标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。FGA 并不是同样节省资源;它每次访问运行一次 — 使得线索更大。
通过记录线索,标准审计可以用来检测任何中断企图,如果企图没有成功,则将产生错误代码。而 FGA 不能。
标准审计可以写数据库表或 OS 文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。在 Windows 下,非数据库审计线索记录在事件日志中,并且可以用不同的方式对其进行访问。这个选项保护了审计线索的完整性。然而,FGA 日志仅写到数据库表 FGA_LOG$ 中。可以在 FGA 中创建用户自定义的审计处理程序来写 OS 文件,但它们的完整性不能保证。
标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在 FGA 中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。
在 FGA 中,审计更加灵活 — 仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在您需要控制线索的增长时非常方便。
在 FGA 中,SQL 赋值变量默认被捕获。在标准审计中,必须把初始化参数 audit_trail设为 db_extended,以启用这一功能。
权限差异:标准审计需要审计系统或语句权限;FGA 只需要 dbms_fga 程序包上的运行权限。
什么是审计
审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)或数据库(存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查看)中。默认情况下审计是没有开启的。
不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。
2、和审计相关的两个主要参数
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里新增的。
注:这两个参数是static参数,需要重新启动数据库才能生效。
3、审计级别
当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、PRivilege(权限)、object(对象)。
Statement:
按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。
Privilege:
按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。
Object:
按对象审计,只审计on关键字指定对象的相关操作,如aduit alter,delete,drop,insert on cmy.t by scott; 这里会对cmy用户的t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。注意Oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle则提供on default子句来实现自动审计,比如执行audit drop on default by access;后, 对于随后创建的对象的drop操作都会审计。但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比trigger可以对schema的DDL进行“审计”,这个功能稍显不足。
4、审计的一些其他选项
by access / by session:
by access 每一个被审计的操作都会生成一条audit trail。
by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。
whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计,
whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。
5、和审计相关的视图
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子句设置了哪些默认对象审计。
6、取消审计
将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;
7、10g中的审计告知一切
Oracle 数据库 10g 审计以一种非常详细的级别捕获用户行为,它可以消除手动的、基于触发器的审计。
假定用户 Joe 具有更新那张表的权限,并按如下所示的方式更新了表中的一行数据:
update SCOTT.EMP set salary = 12000 where empno = 123456;
您如何在数据库中跟踪这种行为呢?在 Oracle 9i 数据库及其较低版本中,审计只能捕获“谁”执行此操作,而不能捕获执行了“什么”内容。例如,它让您知道 Joe 更新了 SCOTT 所有的表EMP,但它不会显示他更新了该表中员工号为 123456 的薪水列。它不会显示更改前的薪水列的值 — 要捕获如此详细的更改,您将不得不编写您自己的触发器来捕获更改前的值,或使用 LogMiner 将它们从存档日志中检索出来。
细粒度审计(FGA) ,是在 Oracle 9i 中引入的,能够记录 SCN 号和行级的更改以重建旧的数据,但是它们只能用于 select 语句,而不能用于 DML ,如 update 、insert 和delete 语句。因此,对于 Oracle 数据库 10g 之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。
8、实例讲解
8.1、激活审计
sqlplus / 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
audit_trail string NONE
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
8.2、开始审计
sqlplus / as sysdba
SQL> audit all on t_test;
SQL> conn u_test
SQL> select * from t_test;
SQL> insert into u_test.t_test (c2,c5) values ('test1','2');
SQL> commit;
SQL> delete from u_test.t_test;
SQL> commit;
SQL> conn /as sysdba
SQL> col DEST_NAME format a30
col OS_USERNAME format a15
col USERNAME format a15
col USERHOST format a15
col TERMINAL format a15
col OBJ_NAME format a30
col SQL_TEXT format a60
SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
sql> audit select table by u_test by access;
如果在命令后面添加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操作
8.3、撤销审计
SQL> noaudit all on t_test;
9、审计语句
多层环境下的审计: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; -- 取消所有对象审计
10、清除审计信息
DELETE FROM SYS.AUD$;
DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、审计视图
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 -- 标准审计+精细审计
12、将审计结果表从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 u
Oracle审计audit启用审计登录审计
审计是监视和记录所选用户的数据活动的。审计操作类型包括登录企图、对象访问和数据库操作。审计记录包括被审计的操作、执行操作的用户、操作的时间等信息。
1 、 启用审计
其具体步骤如下:
(1 ) 进入Oracle 的企业管理器,在服务器下面的数据库配置中选择初始化参数。
(2 ) 点击初始化后进入如下初始化参数界面
该界面有两个选项界面,当前和SPFile ,其中当前是展示参数值的,而SPFile 是修改参数值的。
(3 ) 在SPFile 界面找到audit_trail 参数,该参数是管理审计的,修改它的值。它的取值范围为:DB 、True 、false 、none 、os 、db_extended 、xml 和extended 。如果该参数的值为True 或db ,则审计记录将被记录到sys.aud$ 表中;如果参数值为os ,则写入一个操作系统文件。
(4 ) 修改以后单击应用按钮,然后重启数据库。
2 、登录审计
登录审计的命令如下:
( 1 ) audit session :开启会话审计
( 2 ) audit session whenever successful :开启成功操作审计
( 3 ) audit session whenever not successful :开启失败操作审计
( 4 ) noaudit session :禁止会话审计
3 、操作审计
对表、表空间等数据库对象的任何操作都可被审计。
语法格式如下:
audit {statement_opt | system_priv} [by user,…n]
[by {session | access}] [whenever [not] successful]
注:
statement_opt :审计操作。
system_priv :指定审计的系统权限
by user,…n :指定审计的用户,如果不指定将为所有的用户审计
by session :表示同一会话中的同一类型的 sql 语句仅写单个记录
by access :每个被审计的语句写一个记录。
Whenever [not] successful :表示成功或失败的时候审计
示例代码,对用户 andy 的新建表操作都审计:
audit create table by andy by access;
4 、对象审计
还可以审计对象的数据处理操作,这些操作包括对表的更新、选择、插入和删除等。
语法格式如下:
audit {object_opt | all} on
{[schema.]object | drectory directory_name | default}
[by session | access]
[whenever [not] successful]
其中, object_opt 指审计操作;
all 表示所有对象操作;
object 表示审计对象;
default :默认的审计选项
directory directory_name :审计的目录名
示例代码,审计用户 andy 的 t_module 表的 insert 操作:
audit insert on andy.t_module;
通过对 dba_audit_object 视图进行查询,就可以看到审计记录。
5 、权限审计
权限审计表示只对系统的某一权限的使用情况进行审计。
示例代码:
audit select any table whenever successful;
通过查询 dba_priv_audit_opts 可以看到权限审计的结果
一.粗粒度审计功能。
1.审计级别:
语句级审计(stmt):表示只审计某种类型的SQL语句,不指定结构或对象。
权限级审计(privs):表示只审计执行相应动作的系统权限的使用情况。
实体级审计(obj):表示只对指定模式上的实体指定语句的审计。
根据用户语句的执行结果,审计语句分为成功语句的审计(Whenever Successful)、不成功语句的审计(Whenever NOT Successful)以及无论成功与否都进行审计(默认情况)。
根据用户语句的执行次数,审计又分为对某一用户或全体用户的会话(By Session)审计、对某一用户或全体用户存取方式(By Access)的审计。
某一用户或全体用户的会话审计表示用户语句每执行一次就审计一次;某一用户或全体用户存取方式审计表示相同语句执行多次时,每执行一次就审计一次。
当数据库的审计功能被启动后,在用户语句执行阶段,系统会自动产生审计信息。审计信息中包括审计的操作、用户执行的操作、操作日期、操作时间等信息。
2.初始化参数:
audit_trail=none|false|db|true|os
none,false效果相同,db,true效果相同,os将结果存放到audit_dump_file参数对应的目录下。
audit_sys_operations=false|true 是否启动对sysdba,sysoper身份的用户的审计。
3.语法:
audit stmt opts|privs opts|obj opts by users by session|access whenever [not] successful;
4.审计类型:
语句级审计
语句级审计表示只审计某种类型的SQL语句。可以审计某个用户,也可以审计所有用户的SQL语句。语句级审计的语法如下:
AUDIT SQL语句选项 [by 用户名] [by session|access] [whenever [NOT] successful;
语句选项
被审计的语句
CLUSTER
Create Cluster、Audit Cluster、Drop Cluster、Truncate Cluster
DATABASE LINK
Create Database Link、Drop Database Link
DIRECTORY
Create Directory、Drop Directory
INDEX
Create Index、Alter Index、Drop Index
PROCEDURE
Create Function、Create Library、Create Package、Create Package Body、Create Procedure、Drop Function、Drop Library、Drop Package
PROFILE
Create Profile、Alter Profile、Drop Profile
PUBLIC SYNONYM
Create Public Synonym、Drop Public Synonym
ROLE
Create Role、Alter Role、Drop Role、Set Role
ROLLBACK SEGMENT
Create Rollback Segment、Alter Rollback Segment、Drop Rollback Segment
SEQUENCE
Create Sequence、Drop Sequence
SESSION
Connect、Disconnect
SYNONYM
Create Synonym、Drop Synonym
SYSTEM AUDIT
Audit、Noaudit
SYSTEM GRANT
Grant、Revoke
TABLE
Create Table、Drop Table、Truncate Table
TABLESPACE
Create Tablespace、Alter Tablespace、Drop Tablespace
TRIGGER
Create Trigger、Alter Trigger
USERS
Create User、Alter User、Drop User
TYPE
Create Type、Create Type Body、Alter Type、Drop Type、Drop Type Body
VIEW
Create View、Drop View
ALTER SEQUENCE
Alter Sequence
ALTER TABLE
Alter Table
DELETE TABLE
Delete from tables、views
EXECUTE
Execute Function、Library、Package
GRANT SEQUENCE
Grant privilege On sequence、Revoke privilege On sequence
GRANT TABLE
Grant privilege on table、Revoke privilege on table
UPDATE TABLE
Lock Table
在使用时,不需要写出全部的SQL语句,只要写出语句的选项即可。
“by 用户名”表示只审计指定用户的SQL语句,不审计其他用户。没有指出用户名时,则审计全体用户。
audit table by scott; 表示scott用户在执行Create Table、Drop Table、Truncate Table操作时将被审计。
audit table; 表示所有用户执行该类型的语句都被审计。
“by session”表示按会话方式审计,在每个会话中,相同的语句只审计一次。这是系统默认的方式。
“by access”表示按存取方式审计,每一次语句都将审计。
“whenever successful”表示只审计成功语句。
“whenever not successful”表示只审计不成功语句。
audit table by scott by access;(审计scott用户每一次对表的CREATE、DROP、Truncate操作)。
audit table by scott by session;(审计scott用户对表的CREATE、DROP、Truncate操作,相同的操作只记录一次)。
audit session by tax02 by session whenever not successful;(审计tax02用户尝试连接数据库,但不成功的信息,相同的操作只记录一次)。
audit session by tax01,tax02;(审计tax01,tax02用户尝试连接数据库,成功的信息,相同的操作只记录一次)。
audit session whenever not successful;(审计尝试连接数据库,但不成功的信息)。
如果要了解对于哪些用户都进行了语句级审计及审计的选项,可以查询数据字典DBA_STMT_AUDIT_OPTS,该数据字典要以sys用户连接数据库查询。
当不再对用户进行审计时,可以使用noaudit命令,把用户进行的审计取消。
noaudit SQL语句或选项 [by 用户名] [by session|access] [Whenever [NOT] Successful];
权限级审计
权限级审计表示只审计某一个系统权限的使用情况。可以审计某个用户所使用的系统权限,也可以审计所有用户使用的系统权限。权限级审计的语法如下:
Audit 权限名称 [by 用户名] [by session|Access] [Whenever [NOT] Successful];
例如:
audit delete any table whenever not successful;(审计所有用户不成功的DELETE ANY TABLE权限使用情况)。
audit create table whenever not successful;(审计所有用户不成功的CREATE TABLE权限使用情况)。
audit alter any table,alter any procedure by scott by access whenever not successful;
audit create user by tax02 whenever not successful;
如果要了解对哪些用户进行了权限级审计及审计选项,可以查询数据字典DBA_PRIV_AUDIT_OPTS,该数据字典必须以sys用户连接数据库进行查询。
当不再对用户的系统权限进行审计时,可以使用noaudit命令取消对用户所进行的审计。取消用户权限审计的命令如下:
noaudit 权限名称 [by 用户名] [by session|access] [whenever [NOT] Successful];
例如:
noaudit alter any table,alter any procedure by scott by access whenever not successful;
noaudit create user by tax02 whenever not successful;
noaudit create table whenever not successful;
审计停止后,用户所进行的操作将不再记录。
实体级审计
实体审计用于监视所有用户对某一指定用户的表的存取状况。实体级审计是不分审计对象的,数据库管理员关心的重点是哪些用户操作某一个指定用户的表。实体级审计的语法如下:
audit 实体选项 on schema.实体名称 [by session | access] [Whenever [NOT] Successful];
实体级审计中的实体选项及对实体操作的语句
TABLE
VIEW
SEQUENCE
PROCEDURE
SNAPSHOTS
ALTER
√
√
DELETE
√
√
EXECUTE
√
INDEX
√
INSERT
√
√
REFERENCES
√
SELECT
√
√
√
√
UPDATE
√
√
例如:
audit delete on scott.emp by access whenever successful;(审计所有用户对scott.emp表所有成功的DELETE操作,每次操作都会记录)
audit delete on scott.dept by access whenever not successful;(审计所有用户对scott.emp表所有不成功的DELETE操作,每次操作都会记录)
audit select on sys.tab;(审计所有用户对sys.tab表的SELECT操作,相同的操作只会记录一次)
audit update on scott.dept;
audit update,delete on hr.employees by access whenever successful;
audit update,delete on hr.employees by user;(对user用户对hr.employees的update,delete进行审计)
如果要了解对哪些用户的实体进行了实体级审计及审计选项,可以查询数据字典DBA_OBJ_AUDIT_OPTS,该数据字典必须以sys用户连接数据库进行查询。例如对于用户scott所进行的实体级审计信息,可以使用以下命令:
select object_name,object_type,alt,aud,com,del,gra,ind,ins,loc,ren,sel,upd,ref,exe,cre,rea,wri from dba_obj_audit_opts where owner='SCOTT';
“-”表示没有设置该选项的审计。
“S”表示使用by session选项进行审计。
“A”表示使用by access选项进行审计。
“/”表示使用过whenever successful、whenever not successful选项值。
使用noaudit命令取消对用户实体所进行的审计。
例如:
noaudit delete on scott.emp by access whenever successful;
noaudit delete on scott.dept by access whenever not successful;
5.查看审计结果:
dba_audit_trail;
DBA_AUDIT_TRAIL displays all standard audit trail entries.
dba_audit_session;
DBA_AUDIT_SESSION displays all audit trail records concerning CONNECT and DISCONNECT.
dba_audit_object;
DBA_AUDIT_OBJECT displays audit trail records for all objects in the database.
6.查看创建了哪些审计:
dba_obj_audit_opts;(实体级审计)
dba_priv_audit_opts;(权限级审计)
dba_stmt_audit_opts;(语句级审计)
7.取消审计(将原有的audit语句的audit换成noaudit执行即可):
noaudit all;
noaudit all privileges;
noaudit update,delete on table_name [by username];
8.删除审计记录:
delete from sys.aud$ where timestamp#
二.细粒度审计(FGA)功能。
细粒度的审计使用DBMS_FGA包完成配置和管理工作。细粒度审计除了审计功能外,还可用于绑定变量值的捕获,下面简单讨论一下DBMS_FGA包的使用:
SQL> desc dbms_fga
PROCEDURE ADD_POLICY
Argument Name
下面介绍几个最常用的初始化参数和视图:
1).SYS.FGA_LOG$:如果audit_trail参数包含DB,那么审计记录会被记录在FGA_LOG$表中。
2).AUDIT_FILE_DEST初始化参数:设置审计操作系统文件的存放位置。
3).V$XML_AUDIT_TRAIL:如果audit_trail参数包含XML,那么审计记录会记录在AUDIT_FILE_DEST初始化参数指定的目的地下的XML文件中,Oracle会读取这些XML文件,生成V$XML_AUDIT_TRAIL动态性能视图,方便DBA查看审计详细信息。
4).DBA_AUDIT_POLICIES:详细记录了审计配置的策略信息。
5).DBA_FGA_AUDIT_TRAIL:查看到审计的SQL语句和绑定变量。
6).DBA_COMMON_AUDIT_TRAIL:包含V$XML_AUDIT_TRAIL动态性能视图的内容,是标准和细粒度审计记录。
注意:
启用细粒度的审计功能不需要设置数据库的AUDIT_TRAIL初始化参数,只需要设置DBMS_FGA.ADD_POLICY存储过程中的AUDIT_TRAIL参数或使用默认值即可。