再谈细粒度审计(DBMS_FGA)

大部分内容都是来自oracle官方文档,权当学习学习。

1.DBMS_FGA包一般是用在基于成本的优化器下.
在基于规则的优化器下可能生成不必要的审计记录.(因为审计监控可以在行过滤前发生)
无论是基于规则或是基于成本的优化器,都可以通过DBA_FGA_AUDIT_TRAIL视图分析SQL文本和其对应的绑定变量.

2.DBMS_FGA的子程序
ADD_POLICY
DISABLE_POLICY
DROP_POLICY
ENABLE_POLICY

ADD_POLICY
在任何表或视图对象上的FGA审计策略的最大数量为256.
语法:
DBMS_FGA.ADD_POLICY(
object_schema VARCHAR2,--要被审计的对象的模式(如果为NULL,则默认为当前登录用户的模式)
object_name VARCHAR2,--要被审计的对象名
policy_name VARCHAR2,--唯一的审计策略名
audit_condition VARCHAR2,--监控条件.为NULL,则表示都监控,即条件为TRUE
audit_column VARCHAR2,--检查访问的列. 可以包含OLS隐藏列或对象类型列.缺省为NULL,为审计所有列
handler_schema VARCHAR2,--包含事件句柄的模式.缺省为NULL, 使用当前模式
handler_module VARCHAR2,--事件句柄的函数名.如果必要包含还包含包名.该函数仅仅当查询的第一行匹配到了审计条件时被调用.
--如果存储以某个异常失败,用户的SQL语句也将失败
enable BOOLEAN, --为TRUE时,表示启用该策略(缺省为TRUE)
statement_types VARCHAR2,--审计的SQL语句的类型.只有INSERT、UPDATE、DELETE、SELECT几个类型.
audit_trail BINARY_INTEGER IN DEFAULT,--细粒度审计的目的地(DB或XML).并且也指定是否填充fga_log$的LSQLTEXT和LSQLBIND。
audit_column_opts BINARY_INTEGER IN DEFAULT);--当查询参考audit_column参数指定的任何列或所有列参考时,建立是否一个语句被审计了.
例如:

DBMS_FGA.ADD_POLICY (
   object_schema      =>  'scott', 
   object_name        =>  'emp', 
   policy_name        =>  'mypolicy1', 
   audit_condition    =>  'sal < 100', 
   audit_column       =>  'comm,sal', 
   handler_schema     =>   NULL, 
   handler_module     =>   NULL, 
   enable             =>   TRUE, 
   statement_types    =>  'INSERT, UPDATE', 
   audit_trail        =>   DBMS_FGA.XML + DBMS_FGA.EXTENDED, 
   audit_column_opts  =>   DBMS_FGA.ANY_COLUMNS); 



说明:
1.FGA策略不应该应用到外部行的列,如LOB列(LOB列单独存储的).
2.每个审计策略都是单独应用到查询的.每个审计策略最多生成一条审计记录,不管有多少行满足审核条件.
3.如果一个表上定义的FGA策略收到了一个快速的路径插入(直接路径加载)或向量更新,则该HINT在任何这样的操作之前自动禁用.禁用该HINT允许
审计按照审计策略发生.
4.审计条件必须是一个BOOL表达式,可以使用USER或者SYS_CONTEXT等函数.不能使用AND或OR连接两个条件.
它不能包含序列或子查询.
使用SYS_CONTEXT函数时,不能使用CURRENT_SQL、CURRENT_SQL_LENGTH、CURRENT_BIND.
不能使用伪列(LEVEL、PRIOR、ROWNUM等)
如果条件为'1=1',则强制审计指定列的所有的语句类型.该参数为NULL时,使审计在没有行处理的时候也发生.
5.审计函数(handler_module)是管理员的一种报警机制(可以建立一个发邮件的函数,用来给管理员发邮件提示警报).如先建立函数:
PROCEDURE fname ( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 ) AS ...,

然后这样调用:handler_module => 'FNAME',
6.如果审计追踪包含XML,则细粒度审计记录将写到XML格式的操作系统文件中,并存储在参数AUDIT_FILE_DEST指定的目录中.
AUDIT_FILE_DEST缺省路径为$ORACLE_BASE/admin/$DB_UNIQUE_NAME/adump (UNIX)
$ORACLE_BASE\admin\$DB_UNIQUE_NAME\adump (WINDOWS)
如果审计追踪包含DB,则细粒度审计记录将写到表SYS.FGA_LOG$中.如果是在只读数据库中则,默认写到XML文件中,而不管此参数的设置.
如果审计追踪包含EXTENDED,则查询的SQL文本和SQL绑定变了的信息包含在审计追踪里.
注意SQL文本可能包含敏感信息.如信用卡号码等.
audit_trail参数的几种设置:DBMS_FGA.DB、DBMS_FGA.DB + DBMS_FGA.EXTENDED、DBMS_FGA.XML、DBMS_FGA.XML + DBMS_FGA.EXTENDED.
该参数出现在ALL_AUDIT_POLICIES视图中.
可以通过命令改变AUDIT_FILE_DEST的值:
ALTER SYSTEM SET AUDIT_FILE_DEST = '<New Directory>' DEFERRED
7.在很多平台,审计的XML文件格式都是<process_name>_<processId>.xml,如:ora_2111.xml.
WINDOWS平台格式为<process_name>_<ThreadId>.xml.
8.当查询参考指定audit_column参数中的所有列,则audit_column_opts = DBMS_FGA.ANY_COLUMNS
当查询参考所有的列,则audit_column_opts = DBMS_FGA.ALL_COLUMNS
缺省为DBMS_FGA.ANY_COLUMNS
9. 当audit_column_opts被设置为DBMS_FGA.ALL_COLUMNS时,则一个SQL语句被审计需要所有的列显示参考audit_column指定的列.
如果一个查询语句从不同的表别名查询列,则该语句不被审计.(SELECT A.COL1 FROM TAB A)


如果audit_trail参数被设置为DBMS_FGA.XML + DBMS_FGA.EXTENDED,则会将细粒度审计记录写到操作系统的XML文件中,
审计记录写到操作系统文件比写到数据库更安全.一个新的动态视图V$XML_AUDIT_TRAIL用来查询所有审计到的XML文件(解析后以关系表格式展现)

DISABLE_POLICY
禁用策略
语法
DBMS_FGA.DISABLE_POLICY(
object_schema VARCHAR2, --审计的模式对象(如果为NULL,则默认为当前登录用户的模式)
object_name VARCHAR2, --审计的对象名
policy_name VARCHAR2 ); --审计策略的唯一名
例:

DBMS_FGA.DISABLE_POLICY (
object_schema   =>  'scott',
object_name     =>  'emp',
policy_name     =>  'mypolicy1');


DROP_POLICY
删除策略
语法
DBMS_FGA.DROP_POLICY(
object_schema VARCHAR2, --审计的模式对象(如果为NULL,则默认为当前登录用户的模式)
object_name VARCHAR2, --审计的对象名
policy_name VARCHAR2 );--审计策略的唯一名
例:

DBMS_FGA.DROP_POLICY (
object_schema   =>  'scott',
object_name     =>  'emp',
policy_name     =>  'mypolicy1');


说明:
删除策略前,建议先COMMIT,因为此操作隐藏DDL操作。如果使用DBMS_FGA.ADD_POLICY将object_name移除,或者删除创建策略的用户,则默认自动删除策略.


ENABLE_POLICY
启用策略
语法
DBMS_FGA.ENABLE_POLICY(
object_schema VARCHAR2,--审计的模式对象(如果为NULL,则默认为当前登录用户的模式)
object_name VARCHAR2,--审计的对象名
policy_name VARCHAR2,--审计策略的唯一名
enable BOOLEAN);--缺省为TRUE,即启用策略
例:

DBMS_FGA.ENABLE_POLICY (
object_schema    =>  'scott',
object_name      =>  'emp',
policy_name      =>  'mypolicy1',
enable           =>   TRUE);


----

由于视图DBA_FGA_AUDIT_TRAIL的内容个人感觉不是很完善,没有IP地址,没有客户端连接工具等信息,故也可自定义视图供特定审计策略查询,如:

CREATE OR REPLACE VIEW DBA_FGA_AUDIT_TRAIL_CRY_TEST(session_id, timestamp, db_user, os_user, userhost, client_id, econtext_id, ext_name, object_schema, object_name, policy_name, scn, sql_text, sql_bind, comment$text, statement_type, extended_timestamp, proxy_sessionid, global_uid, instance_number, os_process, transactionid, statementid, entryid, obj_edition_name, dbid,client_ip,PROGRAM)
AS
select sessionid,
       CAST((FROM_TZ(ntimestamp#, '00:00') AT LOCAL) AS DATE),
       dbuid,
       osuid,
       oshst,
       clientid,
       auditid,
       extid,
       obj$schema,
       obj$name,
       policyname,
       scn,
       to_nchar(substr(lsqltext, 1, 2000)),
       to_nchar(substr(lsqlbind, 1, 2000)),
       comment$text,
       DECODE(stmt_type,
              1,
              'SELECT',
              2,
              'INSERT',
              4,
              'UPDATE',
              8,
              'DELETE',
              'INVALID'),
       FROM_TZ(ntimestamp#, '00:00') AT LOCAL,
       proxy$sid,
       user$guid,
       instance#,
       process#,
       xid,
       statement,
       entryid,
       obj$edition,
       dbid,
       sys_context('USERENV', 'IP_ADDRESS'),--获得IP地址
       (select program
          from V$SESSION
         where sys.fga_log$.sessionid = V$SESSION.AUDSID
           and rownum = 1) --获得客户端连接工具的信息(SQLPLUS/PLSQL/JDBC等等)
  from sys.fga_log$
 where sys.fga_log$.policyname = 'CRY_TEST'; --只查CRY_TEST该审计策略的数据


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值