由来

细粒度审计 (FGA)(通过 Oracle9i 引入)可以理解为“基于策略的审计”。与标准的审计功能相反,FGA 可用于指定生成审计记录必需的条件:

FGA 策略通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过 VPD ("dbms_rls") 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真实审计事件:

在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。

使用了公司网络外部的某个 IP 地址。

选定或更新了特定列。

使用了该列的特定值。

对表进行了插入、删除、修改、查询的操作。

这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从 Oracle 数据库 10g 开始,FGA 支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。事实上,绑定到表的 FGA 策略简化了审计策略的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web 接口或通过 SQL*Plus),其操作都会记录下来。

需要的角色和权限

必须在DBMS_FGA包上具有AUDIT_ADMIN角色或EXECUTE权限才能创建审计策略。

要分析和审计数据,您必须具有AUDIT_VIEWER角色。由于审计功能可能捕获所有用户环境和应用程序上下文值,因此策略管理应该仅由特权用户执行。策略事件处理程序模块以模块所有者的权限执行。

关于操作

此包仅可用于基于成本的优化。基于规则的优化器可能会生成不必要的审计记录,因为审计监视可以在行筛选之前进行。

对于基于规则的优化器和基于成本的优化器,都可以查询UNIFIED_AUDIT_TRAIL视图的SQL_TEXT和sql_bind列,以分析发出的SQL文本和相应的绑定变量。

子程序

该表列出了DBMS_FGA子程序并对它们进行了简要描述。

子程序

解释

ADD_POLICY Procedure

使用提供的谓词作为审计条件创建审计策略

ENABLE_POLICY Procedure

启用审计策略

DISABLE_POLICY Procedure

禁用审计策略

DROP_POLICY Procedure

删除审计策略

添加审计策略

此过程使用提供的谓词作为审计条件创建一个审计策略。

语法:

DBMS_FGA.ADD_POLICY(
   object_schema      IN  VARCHAR2 DEFAULT NULL, 
   object_name        IN  VARCHAR2, 
   policy_name        IN  VARCHAR2, 
   audit_condition    IN  VARCHAR2 DEFAULT NULL, 
   audit_column       IN  VARCHAR2 DEFAULT NULL, 
   handler_schema     IN  VARCHAR2 DEFAULT NULL, 
   handler_module     IN  VARCHAR2 DEFAULT NULL, 
   enable             IN  BOOLEAN DEFAULT TRUE, 
   statement_types    IN  VARCHAR2 DEFAULT SELECT,
   audit_trail        IN  BINARY_INTEGER DEFAULT NULL,
   audit_column_opts  IN  BINARY_INTEGER DEFAULT ANY_COLUMNS,
   policy_owner       IN  VARCHAR2 DEFAULT NULL);

参数解释:

参数

解释

object_schema

要审计的对象的模式。如果为NULL,则假定当前登录的用户模式。

object_name

被审计对象的名称

policy_name

唯一的策略名称。请勿输入空格、逗号等特殊字符。如果要为策略名称使用特殊字符,请将名称括在引号中。

audit_conditioin

行中指示监视条件的条件。NULL是允许的,并充当TRUE。

audit_column

要检查访问的列。这些列可以包括OLS隐藏列或对象类型列。默认值为NULL,如果任何列被访问或受到影响,则会导致审计。

handler_schema

包含事件处理程序的模式。默认值NULL将导致使用当前模式。

handler_module

事件处理程序的函数名;必要时包括包名。只有在处理了查询中符合审计条件的第一行之后,才调用此函数。如果过程失败并出现异常,则用户SQL语句也将失败。

enable

如果为TRUE,则启用该策略,这是默认值

statement_types

适用此策略的SQL语句类型:仅INSERT、UPDATE、DELETE或SELECT

audit_trail

在尚未迁移到统一审计的环境中,细粒度审计记录的目标(DB或XML)。还指定是否填充FGA_LOG$ system表中的sqltext和sqlbind列。

audit_column_opts

确定是在查询引用audit_column参数中指定的任何列时审计语句,还是仅在引用所有这些列时审计语句

policy_owner

拥有细粒度审计策略的用户。但是,此设置不是用户提供的参数。Oracle Data Pump客户端在内部使用此设置来适当地重新创建细粒度审计策略。

示例:

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_column_opts  =>   DBMS_FGA.ANY_COLUMNS,
   policy_owner       =>  'sec_admin);

Usage Notes:

• 一个表或视图最多可以应用256个细粒度审计策略。

• 如果未指定object_schema,则假定当前登录的用户模式。

• 不应该将FGA策略应用于LOB列等脱线列。

• 每个审计策略分别应用于查询。但是,每个策略最多只能生成一条审计记录,无论返回多少行满足该策略的audit_condition。换句话说,只要返回的任意数量的行满足表上定义的审计条件,就会为每个这样的策略生成单个审计记录。

• 如果在表上定义了FGA策略的表接收到快速路径插入或矢量更新,则在任何此类操作之前自动禁用提示。禁用提示允许根据策略条款进行审计。(快速路径插入的一个例子是insert - with - append_hint语句。)

• audit_condition必须是一个布尔表达式,可以使用插入、更新或删除的行中的值对其求值。表达式也可以使用函数,如USER或SYS_CONTEXT函数。

• 表达式不能使用“与”、“或”等运算符组合条件。audit_condition可以为NULL(或省略),它被解释为TRUE,但它不能包含以下元素:

• 子查询或序列

• 使用SYS_CONTEXT函数访问USERENV命名空间时的以下属性:

• CURRENT_SQL

• CURRENT_SQL_LENGTH

• CURRENT_BIND

• 任意使用伪列LEVEL、PRIOR或ROWNUM。

• 不再需要指定审计条件“1=1”来强制审计影响指定列(“audit_column”)的所有指定语句(“statement_types”)。如果audit_condition的值为NULL,则即使没有处理任何行,也会进行审计,因此使用此策略的表上的所有操作都会被审计。

• 使用创建策略的用户的权限对audit_condition进行评估。

• 对于audit_condition设置,不要在audit_condition设置中包含在同一基表上执行可审计语句的函数。例如,假设您创建了一个在HR上执行INSERT语句的函数。员工表。策略audit_condition包含这个函数,它用于INSERT语句(由statement_types参数设置)。当使用该策略时,该函数将递归执行,直到系统内存耗尽。这会引发错误ORA-1000:超过最大打开游标或ORA-00036:超过最大递归SQL级别数(50)。

• 不下发DBMS_FGA。ENABLE_POLICY或DBMS_FGA。在条件中从策略函数中DISABLE_POLICY语句。

• 审计函数(handler_module)是一种针对管理员的警报机制。该功能所需的接口如下:

PROCEDURE fname (object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2) AS…其中fname是过程的名称,object_schema是被审计表的模式名称,object_name是被审计表的名称,policy_name是被执行策略的名称。审计函数将以函数所有者的权限执行。

• 如果您已经迁移到统一审计,那么省略audit_trail参数,因为审计记录将自动写入统一审计跟踪。

• 请注意,敏感数据,如信用卡信息,可以以明文形式记录。

• 如果使用audit_trail参数,则指定细粒度审计跟踪将写入的位置,以及是否包含查询的SQL Text和SQL Bind变量信息(通常在名为sqltext和sqlbind的列中):

• 如果audit_trail包含XML,那么细粒度审计记录将被写入XML格式的操作系统文件中,这些文件存储在由SQL中的AUDIT_FILE_DEST语句指定的目录中。(unix系统默认AUDIT_FILE_DEST为$ORACLE_BASE/admin/$DB_UNIQUE_NAME/adump, Windows系统默认为$ORACLE_BASE\admin\$DB_UNIQUE_NAME\adump)

• 如果audit_trail包含DB,则审计记录将被写入SYS。数据库中的FGA_LOG$表。但是,对于只读数据库,Oracle数据库将细粒度的审计记录写入XML文件,而不考虑audit_trail设置。

• 如果audit_trail包含EXTENDED,那么查询的SQL Text和SQL Bind变量信息将包含在审计跟踪中。

• 例如:

• 将audit_trail设置为DBMS_FGA.DB,将审计跟踪发送到SYS。数据库中的FGA_LOG$表,省略SQL Text和SQL Bind。

• 将audit_trail设置为DBMS_FGA. db + DBMS_FGA。EXTENDED将审计跟踪发送到SYS。数据库中的FGA_LOG$表,包括SQL Text和SQL Bind。

• 将audit_trail设置为dbms_fgga .XML,将审计跟踪写入发送给操作系统的XML文件中,而忽略SQL Text和SQL Bind。

• 将audit_trail设置为DBMS_FGA. xml + DBMS_FGA。EXTENDED将审计跟踪写入发送到操作系统的XML文件中,并包括SQL Text和SQL Bind。

• audit_trail参数出现在ALL_AUDIT_POLICIES视图中。

• 修改操作系统目标的命令如下:

ALTER SYSTEM SET AUDIT_FILE_DEST =  New Directory DEFERRED• 在许多平台上,XML审计文件命名为process_name_processId.xml,例如ora_2111.xml。或者,在Windows上,XML审计文件命名为process_name_ThreadId.xml(如果进程不是作为线程运行,则命名为process_name_ProcessId.xml)。

• audit_column_opts参数确定是否审计语句

• 当查询引用audit_column参数中指定的任何列时(audit_column_opts = DBMS_FGA.ANY_COLUMNS),或者

• 只有当所有这样的列都被引用时(audit_column_opts = DBMS_FGA.ALL_COLUMNS)。

• 默认值是DBMS_FGA.ANY_COLUMNS。

• ALL_AUDIT_POLICIES视图还显示了audit_column_opts。

• 当audit_column_opts设置为DBMS_FGA时。只有当audit_column中提到的所有列都在语句中被显式引用时,才对SQL语句进行审计。这些列必须在同一sql语句或子选择中被引用。

• 所有这些列必须引用单个表/视图或别名。

• 如果SQL语句从不同的表别名中选择列,则不会审计该语句。

• 每个XML审计记录都包含AUDIT_TYPE和EXTENDED_TIMESTAMP元素,后者以UTC时区打印(没有时区信息)。使用V$XML_AUDIT_TRAIL视图检索的值被转换为会话时区并打印。

• 对于SQL_TEXT和SQL_BIND元素值(CLOB类型列),动态视图只显示前4000个字符。底层XML文件的SQL_TEXT和SQL_BIND值可能超过4000个字符。

• 对于大量的XML审计文件,当使用SQL*Loader或类似的工具将V$XML_AUDIT_TRAIL加载到数据库表中时,查询V$XML_AUDIT_TRAIL会更快。当AUDIT_TRAIL=OS时,XML审计文件比写入OS文件的等效审计文件大。

• 错误处理与AUDIT_TRAIL=OS时相同。如果在向磁盘写入审计记录时出现错误,包括AUDIT_FILE_DEST标识的目录已满,则审计操作失败。记录一条警告消息。

• 策略事件处理程序模块将以模块所有者的权限执行。

• 不要创建递归的细粒度审计处理程序。例如,假设您创建了一个处理程序,该处理程序在HR上执行INSERT语句。员工表。与此处理程序相关联的策略用于INSERT语句(由statement_types参数设置)。当使用策略时,处理程序将递归执行,直到系统内存耗尽。这会引发错误ORA-1000:超过最大打开游标或ORA-00036:超过最大递归SQL级别数(50)。参见Oracle数据库安全指南关于创建细粒度审计策略。

• audit_trail参数的值(XML和XML+EXTENDED)导致以XML格式将细粒度审计记录写入操作系统文件。动态视图V$XML_AUDIT_TRAIL使dba可以通过SQL查询访问XML文件中的审计记录,从而增强了可用性。查询此视图将导致对AUDIT_FILE_DEST目录中的所有XML文件(所有扩展名为. XML的文件)进行解析,并以关系表格式显示。

• 存储在操作系统文件中的审计记录可能比存储在数据库中的审计记录更安全,因为访问可能需要dba不具备的文件权限。审计记录的操作系统存储也提供了更高的可用性,因为即使数据库暂时无法访问,这些记录仍然可用。

• DBA_COMMON_AUDIT_TRAIL视图包含标准和细粒度审计记录的V$XML_AUDIT_TRAIL动态视图的内容。

• 注意,V$XML_AUDIT_TRAIL视图只有在没有启用统一审计的情况下才会被填充。如果您已经启用了统一审计,那么您可以在UNIFIED_AUDIT_TRAIL数据字典视图中查询审计跟踪记录。

关闭审计策略

语法:

DBMS_FGA.DISABLE_POLICY(
   object_schema  IN  VARCHAR2, 
   object_name    IN  VARCHAR2, 
   policy_name    IN  VARCHAR2);

参数解释:

参数

解释

object_schema

要审计的对象的模式。如果为NULL,则假定当前登录的用户模式。

object_name

被审计对象的名称

policy_name

唯一的策略名称

示例:

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

删除审计策略

语法:

DBMS_FGA.DROP_POLICY(
   object_schema  IN  VARCHAR2, 
   object_name    IN  VARCHAR2, 
   policy_name    IN  VARCHAR2);

参数解释:

参数

解释

object_schema

要审计的对象的模式。如果为NULL,则假定当前登录的用户模式。

object_name

被审计对象的名称

policy_name

唯一的策略名称

示例:

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

启用审计策略

语法:

DBMS_FGA.ENABLE_POLICY(
   object_schema  IN  VARCHAR2,
   object_name    IN  VARCHAR2,
   policy_name    IN  VARCHAR2,
   enable         IN  BOOLEAN);

参数解释:

参数

解释

object_schema

要审计的对象的模式。如果为NULL,则假定当前登录的用户模式。

object_name

被审计对象的名称

policy_name

唯一的策略名称

enable

默认为TRUE以启用该策略

示例:

DBMS_FGA.ENABLE_POLICY(
   object_schema  IN  VARCHAR2,
   object_name    IN  VARCHAR2,
   policy_name    IN  VARCHAR2,
   enable         IN  BOOLEAN);

查询审计记录:

select * from dba_fga_audit_trail;

感谢观看。本文官方文档 DBMS_FGA