2023年8月1日发(作者:)
* *
Oracle审计功能详解
一、 审计分类:
Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
二、 标准审计:
2.1 分类:
在ORACLE中分别支持以下三种标准审计类型:
语句审计,对某种类型的SQL语句审计,不指定结构或对象。
特权审计,对执行相应动作的系统特权的使用审计。
对象审计,对一特殊模式对象上的指定语句的审计。
这三种标准审计类型分别对如下3方面进行审计:
审计语句的成功执行、不成功执行,或者其两者。
对每一用户会话审计语句执行一次或者对语句每次执行审计一次。
对全部用户或指定用户的活动的审计。
当数据库的审计功能打开后,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。
2.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:与DB一样,但是审计结果里面除了连接信息还包含了当时执行的SQL_TEXT和SQL_BIND;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增,将audit trail以XML格式记录在操作系统文件中;
XML,Extended:与XML一样,但是审计结果里面除了连接信息还包含了当时执行的SQL_TEXT和SQL_BIND
注:这两个参数是static参数,需要重新启动数据库才能生效。
2.3 审计级别
当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege(权限)、object(对象)。
Statement: * *
按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。
用法:AUDIT sql_statement_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL;
表1列出了可以审计的语句类型,并且在每个类别中包含了相关语句的简要描述。如果指定all,则审计该列表中的任何语句。然而,表2中的语句类型在启用审计时不属于all类别;必须在audit命令中显式地指定它们。
表1 包括在ALL类别中的可审计语句
语 句 选 项
ALTER SYSTEM
SQL操作
所有ALTER SYSTEM选项,例如,动态改变实例参数,切换到下一个日志文件组,以及终止用户会话
CLUSTER
CONTEXT
DATABASE LINK
DIMENSION
DIRECTORY
INDEX
MATERIALIZED
VIEW
NOT EXISTS 由于不存在的引用对象而造成的SQL语句的失败
CREATE、ALTER、DROP或TRUNCATE集群
CREATE CONTEXT或DROP CONTEXT
CREATE或DROP数据库链接
CREATE、ALTER或DROP维数
CREATE或DROP目录
CREATE、ALTER或DROP索引
CREATE、ALTER或DROP物化视图 * *
PROCEDURE CREATE或DROP FUNCTION、LIBRARY、PACKAGE、PACKAGE
BODY或PROCEDURE
PROFILE CREATE、ALTER或DROP配置文件
PUBLIC DATABASE CREATE或DROP公有数据库链接
LINK
PUBLIC SYNONYM CREATE或DROP公有同义词
ROLE
ROLLBACK
SEGMENT
SEQUENCE
SESSION
SYNONYM
SYSTEM AUDIT
SYSTEM GRANT
TABLE
TABLESPACE
TRIGGER
CREATE或DROP序列
登录和退出
CREATE或DROP同义词
系统权限的AUDIT或NOAUDIT
GRANT或REVOKE系统权限和角色
CREATE、DROP或TRUNCATE表
CREATE、ALTER或DROP表空间
CREATE、ALTER(启用/禁用)、DROP触发器;具有ENABLE ALL
TRIGGERS或DISABLE ALL TRIGGERS的ALTER TABLE
TYPE CREATE、ALTER和DROP类型以及类型主体
CREATE、ALTER、DROP或SET角色
CREATE、ALTER或DROP回滚段 * *
USER
VIEW
CREATE、ALTER或DROP用户
CREATE或DROP视图
表2 显式指定的语句类型
语 句 选 项
ALTER SEQUENCE
ALTER TABLE
COMMENT TABLE
DELETE TABLE
SQL 操 作
任何ALTER SEQUENCE命令
任何ALTER TABLE命令
添加注释到表、视图、物化视图或它们中的任何列
删除表或视图中的行
EXECUTE PROCEDURE 执行程序包中的过程、函数或任何变量或游标
GRANT DIRECTORY
GRANT PROCEDURE
GRANT SEQUENCE
GRANT TABLE
GRANT TYPE
INSERT TABLE
LOCK TABLE
SELECT SEQUENCE
SELECT TABLE
UPDATE TABLE
GRANT或REVOKE DIRECTORY对象上的权限
GRANT或REVOKE过程、函数或程序包上的权限
GRANT或REVOKE序列上的权限
GRANT或REVOKE表、视图或物化视图上的权限
GRANT或REVOKE TYPE上的权限
INSERT INTO表或视图
表或视图上的LOCK TABLE命令
引用序列的CURRVAL或NEXTVAL的任何命令
SELECT FROM表、视图或物化视图
在表或视图上执行UPDATE * *
Privilege:
按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select
* from b.t)会用到select any table权限,故会被审计。注重用户是自己表的所有者,所以用户访问自己的表不会被审计。
用法:审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限
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进行“审计”,这个功能稍显不足。
用法: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
RENAME
SELECT
UPDATE
授予任何类型对象上的权限
创建表或物化视图上的索引
将行插入表、视图或物化视图中
锁定表、视图或物化视图
对DIRECTORY对象的内容执行读操作
重命名表、视图或过程
从表、视图、序列或物化视图中选择行
更新表、视图或物化视图
2.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 反之。省略该子句的话,不管操作成功与否都会审计。
2.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子句设置了哪些默认对象审计。
1. $
审计功能的底层视图,如果需要对数据进行删除,只需要对aud$视图进行删除既可,其他视图里的数据都是由aud$所得.
2. DBA_AUDIT_EXISTS
列出audit not exists和audit exists产生的审计跟踪,我们默认的都是audit exists. * *
3. DBA_AUDIT_TRAIL
可以在里面查处所有审计所跟踪的信息,保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一个子集。
4. DBA_AUDIT_OBJECT
可以查询所有对象跟踪信息.(例如,对grant,revoke等不记录),信息完全包含于dba_audit_trail
5. DBA_AUDIT_SESSION
所得到的数据都是有关logon或者logoff的信息.
6. DBA_AUDIT_STATEMENT
列出grant ,revoke ,audit ,noaudit ,alter system语句的审计跟踪信息.
7. DBA_PRIV_AUDIT_OPTS
通过系统和由用户审计的当前系统特权
8. DBA_OBJ_AUDIT_OPTS
可以查询到所有用户所有对象的审计选项
9. DB_STMT_AUDIT_OPTS
可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似
10. ALL_DEF_AUDIT_OPTS
用来查看数据库用on default子句设置了哪些默认对象审计
11. AUDIT_ACTIONS
可以查询出在aud$等视图中actions列的含义 * *
12. SYSTEM_PRIVILEGE_MAP
可以查询出aud$等视图中priv$used列的含义(注意前面加'-')
13. STMT_AUDIT_OPTION_MAP
审计选项类型代码
14. DBA_AUDIT_POLICIES
审计POLICIES
15. DBA_COMMON_AUDIT_TRAIL
标准审计+细粒度审计合并视图
16. DBA_FGA_AUDIT_TRAIL
细粒度审计策略的审计跟踪条目
2.6 取消审计
将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;
2.7设置ORACLE标准审计:
下列步骤可以设置ORACLE的标准审计功能:
1. 修改初始化参数文件(init
如果使用服务器参数文件使用alter system set
DB/TRUE:启动审计功能,并且把审计结果存放在数据库的 $ 表中 * *
DB_EXTENDED:具有DB/TRUE的功能,另外记录AUD$的SQLBIND和SQLTEXT字段
OS:启动审计功能,并把审计结果存放在操作系统的审计信息中
XML:启动审计功能,并且把审计结果以
XML格式存放在操作系统的审计信息中
XML_EXTENDED:具有XML的功能,另外会记录SQLBIND和SQLTEXT信息
NONE/FALSE:关闭审计功能
2.设置AUDIT_TRAIL参数:
如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST。
如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE_DEST所指定的目录下,并且文件名包含进程的PID。
3. 确认审计相关的表是否已经安装
SQLPLUS> connect / AS SYSDBA
SQLPLUS> select * from $; -- 没有记录返回
SQLPLUS> select * from dba_audit_trail; -- 没有记录返回
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
SQLPLUS> connect / as sysdba
SQLPLUS> @$ORACLE_HOME/rdbms/admin/ * *
审计表安装在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.8设置审计的实例(对试图尝试口令的访问的审计):
以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译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 $ 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 $ 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_(1024000);
LOOP
FETCH C1 INTO USER_ID,CT;
EXIT WHEN C1%NOTFOUND;
IF(CT>=TIMES) THEN
DBMS__LINE('USER BROKEN ALARM:'||USER_ID);
OPEN C2;
LOOP
FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;
DBMS__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.9将审计相关的表移动到其他表空间:
由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动: * *
SQL> connect / as sysdba;
SQL> alter table aud$ move tablespace
SQL> alter index I_aud1 rebuild online tablespace
SQL> alter table audit$ move tablespace
SQL> alter index i_audit rebuild online tablespace
SQL> alter table audit_actions move tablespace
SQL> alter index i_audit_actions rebuild online tablespace
2.10审计语句样例
多层环境下的审计: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 ;
AUDIT SELECT, INSERT, DELETE ON 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; -- 取消所有对象审计
2.11清除审计信息
DELETE FROM $;
TRUNCATE TABLE $;
DELETE FROM $ WHERE obj$name='EMP';
* *
三、 细粒度审计:
细粒度审计 (FGA)(通过 Oracle9i 引入)可以理解为“基于政策的审计”。与标准的审计功能相反,FGA 可用于指定生成审计记录必需的条件:
FGA 政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过 VPD ("dbms_rls") 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:
•
•
•
•
在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。
使用了公司网络外部的某个 IP 地址。
选定或更新了特定列。
使用了该列的特定值。
这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从
Oracle 数据库 10g 开始,FGA 支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。事实上,绑定到表的 FGA 政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web
接口或通过 SQL*Plus),其操作都会记录下来。
细粒度审计的程序包DBMS_FGA具有4个过程:
ADD_POLICY --添加使用谓词和审计列的审计策略
DROP_POLICY --删除审计策略
DISABLE_POLICY --禁用审计策略,但保留与表或视图关联的策略 * *
ENABLE_POLICY --启用策略
3.1 使用细粒度审计:
1、创建测试表:
create table ACCOUNT
(AACT_NO number not null,
CUST_ID number not null,
BALANCE number(15,2)
);
2、添加审计策略:
begin
DBMS__POLICY(object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS');
end;
这段代码必须由具有执行程序包 dbms_fga 权限的用户来执行。建议应该建立一个专门的用户来专门负责添加审计策略。该过程有许多参数,具体含义如下:
OBJECT_SCHEMA
OBJECT_NAM对其定义了 FGA 策略的表或视图的所有者
表或视图的名称 * *
E
POLICY_NAME
策略的名称,由用户自定义 — 例如,ACCOUNTS_ACCESS
POLICY_TEXT
在添加策略时指定的审计条件 — 例如,BALANCE >=
11000
POLICY_COLUMN
ENABLED
PF_SCHEMA
PF_PACKAGE
PF_FUNCTION
审计列 — 例如,BALANCE
如果启用则为 YES,否则为 NO
拥有策略处理器模块的模式(如果存在)
处理器模块的程序包名称(如果存在)
处理器模块的过程名称(如果存在)
3、在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:
select * from ts;
审计线索记录此操作。可以使用以下语句查看线索:
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__policy (
object_schema=>'TEST',
object_name=>'ACCOUNT', * *
policy_name=>'ACCOUNT_ACCESS',
audit_column => 'BALANCE',
audit_condition => 'BALANCE >= 11000'
);
end;
该策略将在访问BALANCE列并且只有访问列值大于等于11000时才发起审计。因此根据该条件户有如下不同审计状态:
SQL 语句 审计状态
进行审计。用户选择了在添加策略时所指定的审计列 BALANCE。
进行审计。即使用户没有明确指定列
BALANCE,* 也隐含地选择了它。
进行审计。即使用户没有明确指定列
BALANCE,where 子句也隐含地选择了它。
不进行审计。用户没有选择列 BALANCE。
不进行审计。用户没有明确或隐含地选择列
BALANCE。
select balance from account;
select * from account;
select cust_id from account
where balance < 10000;
select cust_id from account;
select count(*) from account;
更详细的设置策略如下:
DBMS__POLICY ( * *
object_schema VARCHAR2, --schema的名字,表或视图的拥有者
object_name VARCHAR2, --对象名,表或视图的名字
policy_name VARCHAR2, --审计策略名字,它和数据库中其他对象一样,需要有一个不重复,唯一的名字
audit_condition VARCHAR2, --筛选条件比如可以选择哪些符合条件的操作被记录
audit_column VARCHAR2, --表中的某一列,可以只记录对表中某一列的操作.如果不指定表示审计所有的列
handler_schema VARCHAR2, --是下面的handler_module的拥有者,其实也只能是创建policy的用户,而上面的object_schema可以是任意用户
handler_module VARCHAR2,--可以是一个一个存储过程或函数,但监测到任何一条符合条件的操作时执行它.
enable BOOLEAN, --true 或false表示policy是开启或关闭状态,如果是false表示不进行审计
statement_types VARCHAR2, --表示哪些操作将被审计,可以填上select,insert,update,delete中的一个或几个
audit_trail BINARY_INTEGER IN DEFAULT,--有参数db,xml表示审计到的信息保存到数据库中或是以xml文件形式保存到磁盘上
audit_column_opts BINARY_INTEGER IN DEFAULT); --这个选项其实只有在audt_column中指定了某列时才起作用.它有any_columns,all_columns两个选项假如表中有eno,ename两列,并在audit_column中指定了这两列,那么选any_columns表示只要操作其中的任意一列都将被记录,而这里指定* *
all_columns的话是说只有一个sql语句同时操作了这两列才被记录
3.3优化器模式:
FGA 需要基于成本的优化 (CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导项目出现的可能性。为使 FGA 正确地工作,除了在实例级启用 CBO
之外,在 SQL 语句中应该没有规则暗示(hint),并且必须至少使用评估选项对查询中的所有表进行分析。
3.4管理 FGA 策略:
要删除策略,您可以使用以下语句:
begin
dbms__policy (
object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS'
);
end;
对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。但是可以暂时禁用已有策略,如下所示: * *
begin
dbms__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
TIMESTAMP
DB_USER
OS_USER
USERHOST
CLIENT_ID
审计会话标识符;与 V$SESSION 视图中的会话标识符不同
审计记录生成时的时间标记
发出查询的数据库用户
操作系统用户
用户连接的机器的主机名
客户标识符(如果由对打包过程 dbms__identifier * *
的调用所设置)
EXT_NAME
OBJECT_SCHEMA
OBJECT_NAME
外部认证的客户名称,如 LDAP 用户
对该表的访问触发了审计的表所有者
对该表的 SELECT 操作触发了审计的表名称
POLICY_NAME
触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。在此情况下,该列显示哪些行是由哪个策略插入的。)
记录了审计的 Oracle 系统更改号
由用户提交的 SQL 语句
由 SQL 语句使用的绑定变量(如果存在)
SCN
SQL_TEXT
SQL_BIND
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__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__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__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__COLUMNS
这个参数将使策略仅当列 ACCOUNT_NO 和 BALANCE 在查询中都被访问时才创建审计线索项目。例如,以下查询将产生一个审计线索项目。
select account_no, balance from account;
但这条查询不会产生审计线索项目。
select account_no from account;
使用这个参数将把审计的数量限制在一个更易管理的大小。如果希望采用默认的行为 — 即任意列被选中时都进行审计,那么您可以对同一参数的使用不同值。
audit_column_opts => DBMS__COLUMNS
3.8.3 与标准审计的结合: * *
通过制定如下审计策略实现标准审计与细粒度审计的结合
begin
dbms__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__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
程序包上的运行权限。
2023年8月1日发(作者:)
* *
Oracle审计功能详解
一、 审计分类:
Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。其中标准审计可分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
二、 标准审计:
2.1 分类:
在ORACLE中分别支持以下三种标准审计类型:
语句审计,对某种类型的SQL语句审计,不指定结构或对象。
特权审计,对执行相应动作的系统特权的使用审计。
对象审计,对一特殊模式对象上的指定语句的审计。
这三种标准审计类型分别对如下3方面进行审计:
审计语句的成功执行、不成功执行,或者其两者。
对每一用户会话审计语句执行一次或者对语句每次执行审计一次。
对全部用户或指定用户的活动的审计。
当数据库的审计功能打开后,在语句执行阶段产生审计记录。审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。数据库审计记录是在SYS模式的AUD$表中。
2.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:与DB一样,但是审计结果里面除了连接信息还包含了当时执行的SQL_TEXT和SQL_BIND;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增,将audit trail以XML格式记录在操作系统文件中;
XML,Extended:与XML一样,但是审计结果里面除了连接信息还包含了当时执行的SQL_TEXT和SQL_BIND
注:这两个参数是static参数,需要重新启动数据库才能生效。
2.3 审计级别
当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege(权限)、object(对象)。
Statement: * *
按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。
用法:AUDIT sql_statement_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL;
表1列出了可以审计的语句类型,并且在每个类别中包含了相关语句的简要描述。如果指定all,则审计该列表中的任何语句。然而,表2中的语句类型在启用审计时不属于all类别;必须在audit命令中显式地指定它们。
表1 包括在ALL类别中的可审计语句
语 句 选 项
ALTER SYSTEM
SQL操作
所有ALTER SYSTEM选项,例如,动态改变实例参数,切换到下一个日志文件组,以及终止用户会话
CLUSTER
CONTEXT
DATABASE LINK
DIMENSION
DIRECTORY
INDEX
MATERIALIZED
VIEW
NOT EXISTS 由于不存在的引用对象而造成的SQL语句的失败
CREATE、ALTER、DROP或TRUNCATE集群
CREATE CONTEXT或DROP CONTEXT
CREATE或DROP数据库链接
CREATE、ALTER或DROP维数
CREATE或DROP目录
CREATE、ALTER或DROP索引
CREATE、ALTER或DROP物化视图 * *
PROCEDURE CREATE或DROP FUNCTION、LIBRARY、PACKAGE、PACKAGE
BODY或PROCEDURE
PROFILE CREATE、ALTER或DROP配置文件
PUBLIC DATABASE CREATE或DROP公有数据库链接
LINK
PUBLIC SYNONYM CREATE或DROP公有同义词
ROLE
ROLLBACK
SEGMENT
SEQUENCE
SESSION
SYNONYM
SYSTEM AUDIT
SYSTEM GRANT
TABLE
TABLESPACE
TRIGGER
CREATE或DROP序列
登录和退出
CREATE或DROP同义词
系统权限的AUDIT或NOAUDIT
GRANT或REVOKE系统权限和角色
CREATE、DROP或TRUNCATE表
CREATE、ALTER或DROP表空间
CREATE、ALTER(启用/禁用)、DROP触发器;具有ENABLE ALL
TRIGGERS或DISABLE ALL TRIGGERS的ALTER TABLE
TYPE CREATE、ALTER和DROP类型以及类型主体
CREATE、ALTER、DROP或SET角色
CREATE、ALTER或DROP回滚段 * *
USER
VIEW
CREATE、ALTER或DROP用户
CREATE或DROP视图
表2 显式指定的语句类型
语 句 选 项
ALTER SEQUENCE
ALTER TABLE
COMMENT TABLE
DELETE TABLE
SQL 操 作
任何ALTER SEQUENCE命令
任何ALTER TABLE命令
添加注释到表、视图、物化视图或它们中的任何列
删除表或视图中的行
EXECUTE PROCEDURE 执行程序包中的过程、函数或任何变量或游标
GRANT DIRECTORY
GRANT PROCEDURE
GRANT SEQUENCE
GRANT TABLE
GRANT TYPE
INSERT TABLE
LOCK TABLE
SELECT SEQUENCE
SELECT TABLE
UPDATE TABLE
GRANT或REVOKE DIRECTORY对象上的权限
GRANT或REVOKE过程、函数或程序包上的权限
GRANT或REVOKE序列上的权限
GRANT或REVOKE表、视图或物化视图上的权限
GRANT或REVOKE TYPE上的权限
INSERT INTO表或视图
表或视图上的LOCK TABLE命令
引用序列的CURRVAL或NEXTVAL的任何命令
SELECT FROM表、视图或物化视图
在表或视图上执行UPDATE * *
Privilege:
按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select
* from b.t)会用到select any table权限,故会被审计。注重用户是自己表的所有者,所以用户访问自己的表不会被审计。
用法:审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限
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进行“审计”,这个功能稍显不足。
用法: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
RENAME
SELECT
UPDATE
授予任何类型对象上的权限
创建表或物化视图上的索引
将行插入表、视图或物化视图中
锁定表、视图或物化视图
对DIRECTORY对象的内容执行读操作
重命名表、视图或过程
从表、视图、序列或物化视图中选择行
更新表、视图或物化视图
2.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 反之。省略该子句的话,不管操作成功与否都会审计。
2.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子句设置了哪些默认对象审计。
1. $
审计功能的底层视图,如果需要对数据进行删除,只需要对aud$视图进行删除既可,其他视图里的数据都是由aud$所得.
2. DBA_AUDIT_EXISTS
列出audit not exists和audit exists产生的审计跟踪,我们默认的都是audit exists. * *
3. DBA_AUDIT_TRAIL
可以在里面查处所有审计所跟踪的信息,保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一个子集。
4. DBA_AUDIT_OBJECT
可以查询所有对象跟踪信息.(例如,对grant,revoke等不记录),信息完全包含于dba_audit_trail
5. DBA_AUDIT_SESSION
所得到的数据都是有关logon或者logoff的信息.
6. DBA_AUDIT_STATEMENT
列出grant ,revoke ,audit ,noaudit ,alter system语句的审计跟踪信息.
7. DBA_PRIV_AUDIT_OPTS
通过系统和由用户审计的当前系统特权
8. DBA_OBJ_AUDIT_OPTS
可以查询到所有用户所有对象的审计选项
9. DB_STMT_AUDIT_OPTS
可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似
10. ALL_DEF_AUDIT_OPTS
用来查看数据库用on default子句设置了哪些默认对象审计
11. AUDIT_ACTIONS
可以查询出在aud$等视图中actions列的含义 * *
12. SYSTEM_PRIVILEGE_MAP
可以查询出aud$等视图中priv$used列的含义(注意前面加'-')
13. STMT_AUDIT_OPTION_MAP
审计选项类型代码
14. DBA_AUDIT_POLICIES
审计POLICIES
15. DBA_COMMON_AUDIT_TRAIL
标准审计+细粒度审计合并视图
16. DBA_FGA_AUDIT_TRAIL
细粒度审计策略的审计跟踪条目
2.6 取消审计
将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;
2.7设置ORACLE标准审计:
下列步骤可以设置ORACLE的标准审计功能:
1. 修改初始化参数文件(init
如果使用服务器参数文件使用alter system set
DB/TRUE:启动审计功能,并且把审计结果存放在数据库的 $ 表中 * *
DB_EXTENDED:具有DB/TRUE的功能,另外记录AUD$的SQLBIND和SQLTEXT字段
OS:启动审计功能,并把审计结果存放在操作系统的审计信息中
XML:启动审计功能,并且把审计结果以
XML格式存放在操作系统的审计信息中
XML_EXTENDED:具有XML的功能,另外会记录SQLBIND和SQLTEXT信息
NONE/FALSE:关闭审计功能
2.设置AUDIT_TRAIL参数:
如果设置 AUDIT_TRAIL = OS, 还需要修改参数AUDIT_FILE_DEST。
如果操作系统支持设置AUDIT_TRAIL=OS,文件会自动存放在AUDIT_FILE_DEST所指定的目录下,并且文件名包含进程的PID。
3. 确认审计相关的表是否已经安装
SQLPLUS> connect / AS SYSDBA
SQLPLUS> select * from $; -- 没有记录返回
SQLPLUS> select * from dba_audit_trail; -- 没有记录返回
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
SQLPLUS> connect / as sysdba
SQLPLUS> @$ORACLE_HOME/rdbms/admin/ * *
审计表安装在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.8设置审计的实例(对试图尝试口令的访问的审计):
以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译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 $ 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 $ 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_(1024000);
LOOP
FETCH C1 INTO USER_ID,CT;
EXIT WHEN C1%NOTFOUND;
IF(CT>=TIMES) THEN
DBMS__LINE('USER BROKEN ALARM:'||USER_ID);
OPEN C2;
LOOP
FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;
DBMS__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.9将审计相关的表移动到其他表空间:
由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动: * *
SQL> connect / as sysdba;
SQL> alter table aud$ move tablespace
SQL> alter index I_aud1 rebuild online tablespace
SQL> alter table audit$ move tablespace
SQL> alter index i_audit rebuild online tablespace
SQL> alter table audit_actions move tablespace
SQL> alter index i_audit_actions rebuild online tablespace
2.10审计语句样例
多层环境下的审计: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 ;
AUDIT SELECT, INSERT, DELETE ON 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; -- 取消所有对象审计
2.11清除审计信息
DELETE FROM $;
TRUNCATE TABLE $;
DELETE FROM $ WHERE obj$name='EMP';
* *
三、 细粒度审计:
细粒度审计 (FGA)(通过 Oracle9i 引入)可以理解为“基于政策的审计”。与标准的审计功能相反,FGA 可用于指定生成审计记录必需的条件:
FGA 政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过 VPD ("dbms_rls") 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:
•
•
•
•
在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。
使用了公司网络外部的某个 IP 地址。
选定或更新了特定列。
使用了该列的特定值。
这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从
Oracle 数据库 10g 开始,FGA 支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。事实上,绑定到表的 FGA 政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web
接口或通过 SQL*Plus),其操作都会记录下来。
细粒度审计的程序包DBMS_FGA具有4个过程:
ADD_POLICY --添加使用谓词和审计列的审计策略
DROP_POLICY --删除审计策略
DISABLE_POLICY --禁用审计策略,但保留与表或视图关联的策略 * *
ENABLE_POLICY --启用策略
3.1 使用细粒度审计:
1、创建测试表:
create table ACCOUNT
(AACT_NO number not null,
CUST_ID number not null,
BALANCE number(15,2)
);
2、添加审计策略:
begin
DBMS__POLICY(object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS');
end;
这段代码必须由具有执行程序包 dbms_fga 权限的用户来执行。建议应该建立一个专门的用户来专门负责添加审计策略。该过程有许多参数,具体含义如下:
OBJECT_SCHEMA
OBJECT_NAM对其定义了 FGA 策略的表或视图的所有者
表或视图的名称 * *
E
POLICY_NAME
策略的名称,由用户自定义 — 例如,ACCOUNTS_ACCESS
POLICY_TEXT
在添加策略时指定的审计条件 — 例如,BALANCE >=
11000
POLICY_COLUMN
ENABLED
PF_SCHEMA
PF_PACKAGE
PF_FUNCTION
审计列 — 例如,BALANCE
如果启用则为 YES,否则为 NO
拥有策略处理器模块的模式(如果存在)
处理器模块的程序包名称(如果存在)
处理器模块的过程名称(如果存在)
3、在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:
select * from ts;
审计线索记录此操作。可以使用以下语句查看线索:
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__policy (
object_schema=>'TEST',
object_name=>'ACCOUNT', * *
policy_name=>'ACCOUNT_ACCESS',
audit_column => 'BALANCE',
audit_condition => 'BALANCE >= 11000'
);
end;
该策略将在访问BALANCE列并且只有访问列值大于等于11000时才发起审计。因此根据该条件户有如下不同审计状态:
SQL 语句 审计状态
进行审计。用户选择了在添加策略时所指定的审计列 BALANCE。
进行审计。即使用户没有明确指定列
BALANCE,* 也隐含地选择了它。
进行审计。即使用户没有明确指定列
BALANCE,where 子句也隐含地选择了它。
不进行审计。用户没有选择列 BALANCE。
不进行审计。用户没有明确或隐含地选择列
BALANCE。
select balance from account;
select * from account;
select cust_id from account
where balance < 10000;
select cust_id from account;
select count(*) from account;
更详细的设置策略如下:
DBMS__POLICY ( * *
object_schema VARCHAR2, --schema的名字,表或视图的拥有者
object_name VARCHAR2, --对象名,表或视图的名字
policy_name VARCHAR2, --审计策略名字,它和数据库中其他对象一样,需要有一个不重复,唯一的名字
audit_condition VARCHAR2, --筛选条件比如可以选择哪些符合条件的操作被记录
audit_column VARCHAR2, --表中的某一列,可以只记录对表中某一列的操作.如果不指定表示审计所有的列
handler_schema VARCHAR2, --是下面的handler_module的拥有者,其实也只能是创建policy的用户,而上面的object_schema可以是任意用户
handler_module VARCHAR2,--可以是一个一个存储过程或函数,但监测到任何一条符合条件的操作时执行它.
enable BOOLEAN, --true 或false表示policy是开启或关闭状态,如果是false表示不进行审计
statement_types VARCHAR2, --表示哪些操作将被审计,可以填上select,insert,update,delete中的一个或几个
audit_trail BINARY_INTEGER IN DEFAULT,--有参数db,xml表示审计到的信息保存到数据库中或是以xml文件形式保存到磁盘上
audit_column_opts BINARY_INTEGER IN DEFAULT); --这个选项其实只有在audt_column中指定了某列时才起作用.它有any_columns,all_columns两个选项假如表中有eno,ename两列,并在audit_column中指定了这两列,那么选any_columns表示只要操作其中的任意一列都将被记录,而这里指定* *
all_columns的话是说只有一个sql语句同时操作了这两列才被记录
3.3优化器模式:
FGA 需要基于成本的优化 (CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导项目出现的可能性。为使 FGA 正确地工作,除了在实例级启用 CBO
之外,在 SQL 语句中应该没有规则暗示(hint),并且必须至少使用评估选项对查询中的所有表进行分析。
3.4管理 FGA 策略:
要删除策略,您可以使用以下语句:
begin
dbms__policy (
object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS'
);
end;
对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。但是可以暂时禁用已有策略,如下所示: * *
begin
dbms__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
TIMESTAMP
DB_USER
OS_USER
USERHOST
CLIENT_ID
审计会话标识符;与 V$SESSION 视图中的会话标识符不同
审计记录生成时的时间标记
发出查询的数据库用户
操作系统用户
用户连接的机器的主机名
客户标识符(如果由对打包过程 dbms__identifier * *
的调用所设置)
EXT_NAME
OBJECT_SCHEMA
OBJECT_NAME
外部认证的客户名称,如 LDAP 用户
对该表的访问触发了审计的表所有者
对该表的 SELECT 操作触发了审计的表名称
POLICY_NAME
触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。在此情况下,该列显示哪些行是由哪个策略插入的。)
记录了审计的 Oracle 系统更改号
由用户提交的 SQL 语句
由 SQL 语句使用的绑定变量(如果存在)
SCN
SQL_TEXT
SQL_BIND
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__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__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__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__COLUMNS
这个参数将使策略仅当列 ACCOUNT_NO 和 BALANCE 在查询中都被访问时才创建审计线索项目。例如,以下查询将产生一个审计线索项目。
select account_no, balance from account;
但这条查询不会产生审计线索项目。
select account_no from account;
使用这个参数将把审计的数量限制在一个更易管理的大小。如果希望采用默认的行为 — 即任意列被选中时都进行审计,那么您可以对同一参数的使用不同值。
audit_column_opts => DBMS__COLUMNS
3.8.3 与标准审计的结合: * *
通过制定如下审计策略实现标准审计与细粒度审计的结合
begin
dbms__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__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
程序包上的运行权限。
发布评论