Oracle审计功能.docx
- 文档编号:9402399
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:25.17KB
Oracle审计功能.docx
《Oracle审计功能.docx》由会员分享,可在线阅读,更多相关《Oracle审计功能.docx(18页珍藏版)》请在冰豆网上搜索。
Oracle审计功能
Oracle审计功能
一、审计分类:
Oracle中审计总体上可分为“标准审计”和“细粒度审计”后者也称为“基于政策的审计”,在Oracle10G之后功能得到很大增强。
其中标准审计可分为用户级审计和系统级审计。
用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。
系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
二、标准审计:
2.1分类:
在ORACLE中分别支持以下三种标准审计类型:
◆ 语句审计,对某种类型的SQL语句审计,不指定结构或对象。
◆ 特权审计,对执行相应动作的系统特权的使用审计。
◆ 对象审计,对一特殊模式对象上的指定语句的审计。
这三种标准审计类型分别对如下3方面进行审计:
◆ 审计语句的成功执行、不成功执行,或者其两者。
◆ 对每一用户会话审计语句执行一次或者对语句每次执行审计一次。
◆ 对全部用户或指定用户的活动的审计。
当数据库的审计功能打开后,在语句执行阶段产生审计记录。
审计记录包含有审计的操作、用户执行的操作、操作的日期和时间等信息。
审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。
数据库审计记录是在SYS模式的AUD$表中。
2.2设置ORACLE标准审计:
下列步骤可以设置ORACLE的标准审计功能:
1.修改初始化参数文件(init
如果使用服务器参数文件使用altersystemset
AUDIT_TRAIL的取值如下:
● DB/TRUE:
启动审计功能,并且把审计结果存放在数据库的SYS.AUD$表中
● OS:
启动审计功能,并把审计结果存放在操作系统的审计信息中
● DB_EXTENDED:
具有DB/TRUE的功能,另外填写AUD$的SQLBIND和SQLTEXT字段
● 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----1ora92dba881Mar1709:
57ora_13264.aud
$ps-ef|grep13264
ora921326413235009:
56:
43?
0:
00oracleV92(DESCRIPTION=(LOCAL=Y)
SQL>selectspid,program,usernamefromv$process;
SPIDPROGRAMUSERNAME
---------------------------------------------------------------
...
13264oracle@frhp11(TNSV1-V3)ora92
3.确认审计相关的表是否已经安装
SQLPLUS>connect/ASSYSDBA
SQLPLUS>select*fromsys.aud$;--没有记录返回
SQLPLUS>select*fromdba_audit_trail;--没有记录返回
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
SQLPLUS>connect/assysdba
SQLPLUS>@$ORACLE_HOME/rdbms/admin/cataudit.sql
审计表安装在SYSTEM表空间。
所以要确保SYSTEM表空间又足够的空间存放审计信息。
4.关闭并重启数据库
5.设置所需要的审计信息
下面是一个例子
SQL>connectsystem/manager
SQL>grantauditsystemtoscott;
SQL>connectscott/tiger
SQL>auditsession;
停止审计:
SQL>noauditsession;
通常设置了标准审计后都是通过Audit语句开启审计,使用noaudit语句收回审计。
如下所示:
对修改SC表结构或数据的操作进行审计可使用如下语句:
AUDIEALTER,UPDATEONSC;
取消对SC表的一切审计可使用如下语句:
NOAUDITALLONSC;
2.3设置审计的实例(对试图尝试口令的访问的审计):
以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子:
1.修改审计相关参数(参照上面介绍的方法)
2.重启数据库
3.设置审计信息
SQL>AUDITALLBYACCESSWHENEVERNOTSUCCESSFUL
4.查询AUD$
SQL>selectreturncode,action#,userid,userhost,terminal,timestamp
fromaud$
RETURNCODEACTION#USERIDUSERHOSTTERMINAL
--------------------------------------------------------------------
1017100SCOTTWPRATA-BR
1017100SCOTTWPRATA-BR
1017100SCOTTWPRATA-BR
ORA-1017的含义为错误的用户名口令。
通过查看AUD$表可以清楚地看到WPRATA-BR尝试破译SCOTT的口令。
可以通过下面一个存储过程来分析AUD$表,找出可疑的信息:
createorreplaceprocedureAuditLogin(SinceVarchar2,TimesPLS_Integer)
is
USER_IDVARCHAR2(20);
cursorc1isselectuserid,count(*)fromsys.aud$wherereturncode='1017'andtimestamp#>=to_date(Since,'yyyy-mm-dd')
groupbyuserid;
cursorC2ISSelectuserhost,terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:
HH24:
MI:
SS')
fromsys.aud$WHEREreturncode='1017'andtimestamp#>=to_date(Since,'yyyy-mm-dd')ANDUSERID=USER_ID;
ctPLS_INTEGER;
V_USERHOSTVARCHAR2(40);
V_TERMINALVARCHAR(40);
V_DATEVARCHAR2(40);
BEGIN
OPENC1;
dbms_output.enable(1024000);
LOOP
FETCHC1INTOUSER_ID,CT;
EXITWHENC1%NOTFOUND;
IF(CT>=TIMES)THEN
DBMS_OUTPUT.PUT_LINE('USERBROKENALARM:
'||USER_ID);
OPENC2;
LOOP
FETCHC2INTOV_USERhOST,V_TERMINAL,V_DATE;
DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:
'||V_USERHOST||',TERM:
'||V_TERMINAL||',TIME:
'||V_DATE);
EXITWHENC2%NOTFOUND;
ENDLOOP;
closec2;
ENDIF;
ENDLOOP;
closec1;
END;
/
一下是执行结果:
SQL>setserveroutputon;
SQL>executeauditlogin('2004-01-01',2);
USERBROKENALARM:
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/assysdba;
sql>altertableaud$movetablespace
sql>alterindexI_aud1rebuildonlinetablespace
SQL>altertableaudit$movetablespace
SQL>alterindexi_auditrebuildonlinetablespace
SQL>altertableaudit_actionsmovetablespace
SQL>alterindexi_audit_actionsrebuildonlinetablespace
三、细粒度审计:
细粒度审计(FGA)(通过Oracle9i引入)可以理解为“基于政策的审计”。
与标准的审计功能相反,FGA可用于指定生成审计记录必需的条件:
FGA政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。
类似于用于通过VPD("dbms_rls")进行访问控制的程序包,它允许您创建任何需要的条件,例如:
仅当以下条件为真时审计事件:
∙在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。
∙使用了公司网络外部的某个IP地址。
∙选定或更新了特定列。
∙使用了该列的特定值。
这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。
从Oracle数据库10g开始,FGA支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。
事实上,绑定到表的FGA政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。
此外。
无论用户通过何种方式连接至数据库(通过应用程序、Web接口或通过SQL*Plus),其操作都会记录下来。
3.1使用细粒度审计:
1、创建测试表:
createtableACCOUNT
(AACT_NOnumbernotnull,
CUST_IDnumbernotnull,
BALANCEnumber(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*frombank.accounts;
审计线索记录此操作。
可以使用以下语句查看线索:
selecttimestamp,
db_user,
os_user,
object_schema,
object_name,
sql_text
fromdba_fga_audit_trail;
TIMESTAMPDB_USEROS_USEROBJECT_OBJECT_NSQL_TEXT
------------------------------------------------------------
26-MAR-10TESTanandaTESTACCOUNTselect*fromaccount
注意名为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语句
审计状态
selectbalancefromaccount;
进行审计。
用户选择了在添加策略时所指定的审计列BALANCE。
select*fromaccount;
进行审计。
即使用户没有明确指定列BALANCE,*也隐含地选择了它。
selectcust_idfromaccountwherebalance<10000;
进行审计。
即使用户没有明确指定列BALANCE,where子句也隐含地选择了它。
selectcust_idfromaccount;
不进行审计。
用户没有选择列BALANCE。
selectcount(*)fromaccount;
不进行审计。
用户没有明确或隐含地选择列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.5FGA数据字典视图:
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如下:
createviewvw_accountasselect*fromaccount;
现在,如果用户从视图中而不是从表中进行选择:
select*fromvw_account;
您将看到以下审计线索:
selectobject_name,sql_textfromdba_fga_audit_trail;
OBJECT_NAMESQL_TEXT
------------------------------------------------------------
ACCOUNTselect*fromvw_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.8FGA在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
用户发出:
updateaccountsetbalance=1200whereACCOUNT_NO=....
旧的和新的balance都小于3,000,审计条件不满足;因此这条语句将不会被审计。
第2种情况
之前:
BALANCE=1000
用户发出:
updateaccountsetbalance=3200whereACCOUNT_NO=....
新的balance大于3,000,审计条件满足;因此这条语句将会被审计。
第3种情况
之前:
BALANCE=3200
用户发出:
updateaccountsetbalance=1200whereACCOUNT_N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 审计 功能
![提示](https://static.bdocx.com/images/bang_tan.gif)