一、概述
Fine-grained auditing精细审计是一种特殊的审计,比普通审计提供了更加精细的审计粒度。 它可以创建一个policy策略来定义促发审计的条件,这就使得可以监视满足某种条件的数据访问。
一般来说,精细审计的策略是基于用户定义在表对象上的条件来决定审计的。在取数据时,当满足定义的条件时,这个查询就被审计(记录)
精细审计创建一个更有意义的审计记录,其中只包含了你指定行为操作的审计。这也就排除了记录访问表时发生的所有没必要的信息,和普通审计相比有如下特点:
1). It performs a Boolean condition check
满足条件的语句才会被记录
2). It captures the SQL that triggered the audit
可以同时捕获导致审计的SQL语句和相关的绑定变量(bind variables).
注:只能从scalar类型的列里捕获数据,而不能从object类型的列里捕获数据,如:LOBs, user-defined column types.
3). It adds extra protection to sensitive columns
可以审计敏感数据相关的特殊列,如工资。
4). It provides an event handler feature
如:可以编写一个function来发送警告信息给安全管理员,由于被审计的列在深夜被更新了。
5). You do not need to set initialization parameters to enable fine-grained auditing
并不需要初始化参数来开始或关闭精细审计。只要有DBMS_FGA包的执行权限就可以用ADD_POLICY, DELETE_POLICY, ENABLE_POLICY来管理精细审计策略。
注:
1). 精细审计只支CBO(Cost-based optimization)。当使用基于RBO(rule-based optimization)的查询时,精细审计在执行行过滤前会执行精细审计检查,这导致了没必要的触发器触发。
2). 当前涉及到flashback query闪回查询的对象审计来自于闪回快照(flashback snapshot).
二 、 关于DBMS_FGA系统包
1. 视图
精细审计的记录被存储在SYS.FGA_LOG$表。可以查询DBA_FGA_AUDIT_TRAIL视图来查看精细审计的策略policy。
DBA_COMMON_AUDIT_TRAIL视图包括标准的审计记录和精细审计的记录。除此外,可以查看V$XML_AUDIT_TRAIL来查看存储在XML文件里的审计记录。
2. 包操作
2.1 添加策略ADD_POLICY
DBMS_FGA.ADD_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2,
audit_condition VARCHAR2,
audit_column VARCHAR2,
handler_schema VARCHAR2,
handler_module VARCHAR2,
enable BOOLEAN,
statement_types VARCHAR2,
audit_trail BINARY_INTEGER IN DEFAULT,
audit_column_opts BINARY_INTEGER IN DEFAULT);
以下是各个参数选项的说明:
object_schema: 指定审计对象,如表名,视图名.
object_name: 指定要审计的对象名.
policy_name: 指定要创建的策略名.
audit_condition: 指定一个boolean条件. 可以为NULL:如果想保证针对某列(audit_column)的行为(statement_types)一定生效,可以指定audit_condition为NULL,也相当于条件为TRUE。
audit_column: 指定要审计的一列或多列(包括隐含列),如果为NULL或缺省的则审计所有列,可以通过audit_column_opts参数来控制是只审计指定的列还是所有列.
handler_schema: 如果定义了当审计条件满足时发送一个警告, 指定包含event handler对象的名字.
handler_module: 指定event handler的名字.
enable: Enables 或 disables策略(true | false).缺省为enabled.
statement_types: 指定要审计的SQL语句的类型(INSERT,UPDATE,DELETE). MERGE是由INSERT,UPDATE组合而来的,当执行MERGE时将分别插入满足条件的语句INSERT或UPDATE。
audit_trail: 指定存储审计记录的位置(DB or XML). 也指定是否要产生 LSQLTEXT and LSQLBIND 在 FGA_LOG$表里.
audit_column_opts: 如果在audit_column参数里指定了多列, 决定是审计多列还是指定的列。
实例:
audit_condition => 'department_id = 50',
audit_column => 'salary,commission_pct',
audit_column_opts => DBMS_FGA.ANY_COLUMNS,
audit_column_opts => DBMS_FGA.ALL_COLUMNS,
2.2 Enable & Disable精细审计策略:
DBMS_FGA.DISABLE_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2 );
例如:
DBMS_FGA.DISABLE_POLICY(
object_schema => 'hr',
object_name => 'employees'
policy_name => 'chk_hr_employees');
DBMS_FGA.ENABLE_POLICY(
object_schema => 'hr',
object_name => 'employees',
policy_name => 'chk_hr_employees'
enable => 'true');
2.3 删除精细审计策略:
例如:
DBMS_FGA.DROP_POLICY(
object_schema => 'hr',
object_name => 'employees',
policy_name => 'chk_hr_employees');
如果要修改一个策略,必须先把它删除再创建新的。
3. Tutorial 实战演习
第一步:
创建用户并检查实例用户HR有效。
1). sqlplus / as sysdba
2). SQL> GRANT CREATE SESSION, DBA TO sysadmin_fga IDENTIFIED BY oracle;
SQL> GRANT SELECT ON hr.employees TO sysadmin_fga;
SQL> GRANT EXECUTE ON DBMS_FGA TO sysadmin_fga;
3). 检查用户HR存在并可用
SQL> SELECT username, account_status FROM DBA_USERS WHERE username='HR';
SQL> ALTER USER hr account unlock identified by oracle;
第二步: 创建一个表来存储警告信息和一个procedure来产生警告信息
1). SQL> CONN sysadmin_fga/oracle
2). 创建表emp_violations
SQL>
CREATE TABLE emp_violations (
username VARCHAR(20),
userhost VARCHAR(20),
time TIMESTAMP);
3). 创建存储过程 emp_violations_alert
SQL>
CREATE OR REPLACE PROCEDURE emp_violations_alert (
hr_schema VARCHAR2,
employees_table VARCHAR2,
hr_policy VARCHAR2)
AS
BEGIN
INSERT INTO sysadmin_fga.emp_violations (
username, userhost, time)
SELECT user, sys_context('userenv','terminal'), sysdate FROM DUAL;
END emp_violations_alert;
/
第三步: 创建精细审计策略
SQL>
BEGIN
DBMS_FGA.ADD_POLICY (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'chk_hr_emp',
audit_condition => 'department_id = 50',
audit_column => 'salary,commission_pct',
handler_schema => 'sysadmin_fga',
handler_module => 'emp_violations_alert',
enable => TRUE,
statement_types => 'INSERT, UPDATE, SELECT, DELETE',
audit_trail => DBMS_FGA.XML + DBMS_FGA.EXTENDED,
audit_column_opts => DBMS_FGA.ANY_COLUMNS);
END;
/
第四步: 测试警告信息
1). 以HR用户登录并执行某些操作
SQL> CONN HR/oracle
SQL> SELECT COUNT(*) FROM employees WHERE salary > 4500;
2). 以SYSTEM用户登录执行同样的操作
SQL> CONN SYSTEM/oracle
SQL> SELECT COUNT(*) FROM employees WHERE salary > 4500;
3). 以SYSADMIN_FGA用户登录查询emp_violations表
SQL> CONN SYSADMIN_FGA /oracle
SQL> SELECT * FROM emp_violations ;
4). 由于指定的audit_trail => DBMS_FGA.XML + DBMS_FGA.EXTENDED, 所有可以在v$xml_audit_trail表里查到记录,而不能在DBA_FGA_AUDIT_TRAIL表里查到记录。
SQL> select AUDIT_TYPE,OBJECT_SCHEMA, OBJECT_NAME, policy_name from v$xml_audit_trail;
AUDIT_TYPE OBJECT_SCHEMA OBJECT_NAME POLICY_NAME
---------- --------------- --------------- ---------------
2 HR EMPLOYEES CHK_HR_EMP
2 HR EMPLOYEES CHK_HR_EMP
SQL> SELECT * FROM DBA_FGA_AUDIT_TRAIL WHERE policy_name='CHK_HR_EMP';
no rows selected
如果把 audit_trail改为 DBMS_FGA.DB + DBMS_FGA.EXTENDED,则可以在DBA_FGA_AUDIT_TRAIL和FGA_LOG$上查到记录。
但DBA_COMMON_AUDIT_TRAIL 视图里包含了DB, XML存储的标准审计和精细审计记录。
SQL> select OBJECT_SCHEMA, OBJECT_NAME, policy_name from dba_common_audit_trail where policy_name='CHK_HR_EMP';
OBJECT_SCHEMA OBJECT_NAME POLICY_NAME
--------------- --------------- ---------------
HR EMPLOYEES CHK_HR_EMP
HR EMPLOYEES CHK_HR_EMP
第五步: 恢复环境
删除SYSADMIN_FGA用户,LOCK HR用户。
Fine-grained auditing精细审计是一种特殊的审计,比普通审计提供了更加精细的审计粒度。 它可以创建一个policy策略来定义促发审计的条件,这就使得可以监视满足某种条件的数据访问。
一般来说,精细审计的策略是基于用户定义在表对象上的条件来决定审计的。在取数据时,当满足定义的条件时,这个查询就被审计(记录)
精细审计创建一个更有意义的审计记录,其中只包含了你指定行为操作的审计。这也就排除了记录访问表时发生的所有没必要的信息,和普通审计相比有如下特点:
1). It performs a Boolean condition check
满足条件的语句才会被记录
2). It captures the SQL that triggered the audit
可以同时捕获导致审计的SQL语句和相关的绑定变量(bind variables).
注:只能从scalar类型的列里捕获数据,而不能从object类型的列里捕获数据,如:LOBs, user-defined column types.
3). It adds extra protection to sensitive columns
可以审计敏感数据相关的特殊列,如工资。
4). It provides an event handler feature
如:可以编写一个function来发送警告信息给安全管理员,由于被审计的列在深夜被更新了。
5). You do not need to set initialization parameters to enable fine-grained auditing
并不需要初始化参数来开始或关闭精细审计。只要有DBMS_FGA包的执行权限就可以用ADD_POLICY, DELETE_POLICY, ENABLE_POLICY来管理精细审计策略。
注:
1). 精细审计只支CBO(Cost-based optimization)。当使用基于RBO(rule-based optimization)的查询时,精细审计在执行行过滤前会执行精细审计检查,这导致了没必要的触发器触发。
2). 当前涉及到flashback query闪回查询的对象审计来自于闪回快照(flashback snapshot).
二 、 关于DBMS_FGA系统包
1. 视图
精细审计的记录被存储在SYS.FGA_LOG$表。可以查询DBA_FGA_AUDIT_TRAIL视图来查看精细审计的策略policy。
DBA_COMMON_AUDIT_TRAIL视图包括标准的审计记录和精细审计的记录。除此外,可以查看V$XML_AUDIT_TRAIL来查看存储在XML文件里的审计记录。
2. 包操作
2.1 添加策略ADD_POLICY
DBMS_FGA.ADD_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2,
audit_condition VARCHAR2,
audit_column VARCHAR2,
handler_schema VARCHAR2,
handler_module VARCHAR2,
enable BOOLEAN,
statement_types VARCHAR2,
audit_trail BINARY_INTEGER IN DEFAULT,
audit_column_opts BINARY_INTEGER IN DEFAULT);
以下是各个参数选项的说明:
object_schema: 指定审计对象,如表名,视图名.
object_name: 指定要审计的对象名.
policy_name: 指定要创建的策略名.
audit_condition: 指定一个boolean条件. 可以为NULL:如果想保证针对某列(audit_column)的行为(statement_types)一定生效,可以指定audit_condition为NULL,也相当于条件为TRUE。
audit_column: 指定要审计的一列或多列(包括隐含列),如果为NULL或缺省的则审计所有列,可以通过audit_column_opts参数来控制是只审计指定的列还是所有列.
handler_schema: 如果定义了当审计条件满足时发送一个警告, 指定包含event handler对象的名字.
handler_module: 指定event handler的名字.
enable: Enables 或 disables策略(true | false).缺省为enabled.
statement_types: 指定要审计的SQL语句的类型(INSERT,UPDATE,DELETE). MERGE是由INSERT,UPDATE组合而来的,当执行MERGE时将分别插入满足条件的语句INSERT或UPDATE。
audit_trail: 指定存储审计记录的位置(DB or XML). 也指定是否要产生 LSQLTEXT and LSQLBIND 在 FGA_LOG$表里.
audit_column_opts: 如果在audit_column参数里指定了多列, 决定是审计多列还是指定的列。
实例:
audit_condition => 'department_id = 50',
audit_column => 'salary,commission_pct',
audit_column_opts => DBMS_FGA.ANY_COLUMNS,
audit_column_opts => DBMS_FGA.ALL_COLUMNS,
2.2 Enable & Disable精细审计策略:
DBMS_FGA.DISABLE_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2 );
例如:
DBMS_FGA.DISABLE_POLICY(
object_schema => 'hr',
object_name => 'employees'
policy_name => 'chk_hr_employees');
DBMS_FGA.ENABLE_POLICY(
object_schema => 'hr',
object_name => 'employees',
policy_name => 'chk_hr_employees'
enable => 'true');
2.3 删除精细审计策略:
例如:
DBMS_FGA.DROP_POLICY(
object_schema => 'hr',
object_name => 'employees',
policy_name => 'chk_hr_employees');
如果要修改一个策略,必须先把它删除再创建新的。
3. Tutorial 实战演习
第一步:
创建用户并检查实例用户HR有效。
1). sqlplus / as sysdba
2). SQL> GRANT CREATE SESSION, DBA TO sysadmin_fga IDENTIFIED BY oracle;
SQL> GRANT SELECT ON hr.employees TO sysadmin_fga;
SQL> GRANT EXECUTE ON DBMS_FGA TO sysadmin_fga;
3). 检查用户HR存在并可用
SQL> SELECT username, account_status FROM DBA_USERS WHERE username='HR';
SQL> ALTER USER hr account unlock identified by oracle;
第二步: 创建一个表来存储警告信息和一个procedure来产生警告信息
1). SQL> CONN sysadmin_fga/oracle
2). 创建表emp_violations
SQL>
CREATE TABLE emp_violations (
username VARCHAR(20),
userhost VARCHAR(20),
time TIMESTAMP);
3). 创建存储过程 emp_violations_alert
SQL>
CREATE OR REPLACE PROCEDURE emp_violations_alert (
hr_schema VARCHAR2,
employees_table VARCHAR2,
hr_policy VARCHAR2)
AS
BEGIN
INSERT INTO sysadmin_fga.emp_violations (
username, userhost, time)
SELECT user, sys_context('userenv','terminal'), sysdate FROM DUAL;
END emp_violations_alert;
/
第三步: 创建精细审计策略
SQL>
BEGIN
DBMS_FGA.ADD_POLICY (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'chk_hr_emp',
audit_condition => 'department_id = 50',
audit_column => 'salary,commission_pct',
handler_schema => 'sysadmin_fga',
handler_module => 'emp_violations_alert',
enable => TRUE,
statement_types => 'INSERT, UPDATE, SELECT, DELETE',
audit_trail => DBMS_FGA.XML + DBMS_FGA.EXTENDED,
audit_column_opts => DBMS_FGA.ANY_COLUMNS);
END;
/
第四步: 测试警告信息
1). 以HR用户登录并执行某些操作
SQL> CONN HR/oracle
SQL> SELECT COUNT(*) FROM employees WHERE salary > 4500;
2). 以SYSTEM用户登录执行同样的操作
SQL> CONN SYSTEM/oracle
SQL> SELECT COUNT(*) FROM employees WHERE salary > 4500;
3). 以SYSADMIN_FGA用户登录查询emp_violations表
SQL> CONN SYSADMIN_FGA /oracle
SQL> SELECT * FROM emp_violations ;
4). 由于指定的audit_trail => DBMS_FGA.XML + DBMS_FGA.EXTENDED, 所有可以在v$xml_audit_trail表里查到记录,而不能在DBA_FGA_AUDIT_TRAIL表里查到记录。
SQL> select AUDIT_TYPE,OBJECT_SCHEMA, OBJECT_NAME, policy_name from v$xml_audit_trail;
AUDIT_TYPE OBJECT_SCHEMA OBJECT_NAME POLICY_NAME
---------- --------------- --------------- ---------------
2 HR EMPLOYEES CHK_HR_EMP
2 HR EMPLOYEES CHK_HR_EMP
SQL> SELECT * FROM DBA_FGA_AUDIT_TRAIL WHERE policy_name='CHK_HR_EMP';
no rows selected
如果把 audit_trail改为 DBMS_FGA.DB + DBMS_FGA.EXTENDED,则可以在DBA_FGA_AUDIT_TRAIL和FGA_LOG$上查到记录。
但DBA_COMMON_AUDIT_TRAIL 视图里包含了DB, XML存储的标准审计和精细审计记录。
SQL> select OBJECT_SCHEMA, OBJECT_NAME, policy_name from dba_common_audit_trail where policy_name='CHK_HR_EMP';
OBJECT_SCHEMA OBJECT_NAME POLICY_NAME
--------------- --------------- ---------------
HR EMPLOYEES CHK_HR_EMP
HR EMPLOYEES CHK_HR_EMP
第五步: 恢复环境
删除SYSADMIN_FGA用户,LOCK HR用户。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9466564/viewspace-609570/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9466564/viewspace-609570/