创建审计策略:指定条件

每会话条件和评估 (Condition and Evaluation PER SESSION)

在会话级别创建审计策略,根据会话用户进行审计。例如:

CREATE AUDIT POLICY audit_mixed_pol5
ACTIONS RENAME ON hr.employees, ALTER ON hr.jobs
WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'')=''JIM'''
EVALUATE PER SESSION;

此审计策略在会话级别进行评估,即在当前会话中,如果会话用户为JIM,则会记录对hr.employees表的RENAME操作和对hr.jobs表的ALTER操作。

每语句条件和评估 (Condition and Evaluation PER STATEMENT)

在语句级别创建审计策略,根据客户端标识符进行审计。例如:

CREATE AUDIT POLICY audit_objpriv_pol6
ACTIONS ALTER ON oe.orders
WHEN 'SYS_CONTEXT(''USERENV'',''CLIENT_IDENTIFIER'')=''OE'''
EVALUATE PER STATEMENT;

此审计策略在每个语句级别进行评估,如果客户端标识符为OE,则会记录对oe.orders表的ALTER操作。

每实例条件和评估 (Condition and Evaluation PER INSTANCE)

在实例级别创建审计策略,根据实例名称进行审计。例如:

CREATE AUDIT POLICY audit_objpriv_pol7
ROLES dba
WHEN SYS_CONTEXT(''USERENV'',''INSTANCE_NAME'')=''sales'''
EVALUATE PER INSTANCE;

此审计策略在实例级别评估,如果实例名称为sales,则会记录dba角色的所有操作。

启用和禁用审计策略

启用审计策略

  1. 应用于所有用户

    AUDIT POLICY audit_syspriv_pol1;

    对所有用户应用audit_syspriv_pol1审计策略。

  2. 仅应用于某些用户

    AUDIT POLICY audit_pol2 BY scott, oe;
    AUDIT POLICY audit_pol3 BY sys;

    仅对scott和oe用户应用audit_pol2审计策略,对sys用户应用audit_pol3审计策略。

  3. 排除某些用户

    AUDIT POLICY audit_pol4 EXCEPT jim, george;

    对所有用户应用audit_pol4审计策略,但排除jim和george用户。

  4. 根据操作成功或失败进行审计

    AUDIT POLICY audit_syspriv_pol1 WHENEVER SUCCESSFUL;
    AUDIT POLICY audit_objpriv_pol2 WHENEVER NOT SUCCESSFUL;
    AUDIT POLICY auditpol5 BY joe WHENEVER SUCCESSFUL;

    对audit_syspriv_pol1策略仅在成功时进行审计,对audit_objpriv_pol2策略仅在失败时进行审计,对auditpol5策略在joe用户成功操作时进行审计。

禁用审计策略

使用NOAUDIT命令禁用审计策略:

NOAUDIT POLICY audit_syspriv_pol1;

禁用audit_syspriv_pol1审计策略。

在CDB和PDB中审计操作

  1. 连接到CDB根目录或PDB

    连接到CDB根目录、应用程序根目录或常规PDB。

  2. 创建全局或本地统一审计策略

    • 对所有PDBs (连接到CDB根目录)

      CREATE AUDIT POLICY pol_user_CDB ACTION ALL;
    • 对所有应用程序PDBs (连接到应用程序根目录)

      CREATE AUDIT POLICY pol_user_APP ACTION ALL;
    • 对特定PDB或应用程序PDB (连接到PDB)

      CREATE AUDIT POLICY pol_user_PDBC ACTION ALL;
  3. 启用/禁用审计策略

    • 解释:定义需要审计的用户或角色,并使用AUDIT POLICY和NOAUDIT POLICY命令启用或禁用审计策略。

修改统一审计策略

已启用或禁用的统一审计策略可以被修改。例如:

ALTER AUDIT POLICY select_emp_pol
ADD ACTIONS select on hr.job_history;

将select on hr.job_history操作添加到select_emp_pol审计策略中。

仅审计顶级语句

顶级语句统一审计可以帮助减少审计记录。例如:

  1. 创建顶级语句审计策略

    CREATE AUDIT POLICY actions_all_pol ACTION ALL ONLY TOPLEVEL;
    AUDIT POLICY actions_all_pol BY SYS;

    创建一个仅审计顶级语句的策略actions_all_pol,并应用于SYS用户。

  2. 减少审计记录

    CREATE AUDIT POLICY update_emp_pol ACTIONS UPDATE ON HR.EMPLOYEES ONLY TOPLEVEL;
    AUDIT POLICY update_emp_pol;

    创建一个仅审计顶级UPDATE操作的策略update_emp_pol,并应用于HR.EMPLOYEES表。

查看审计策略信息

查询审计策略的信息,例如:

SELECT policy_name, audit_option, condition_eval_opt
FROM audit_unified_policies;

查询已定义的审计策略及其条件评估选项。

基于值的审计

基于值的审计通过触发器实现。例如:

  1. 用户进行修改
  2. 触发器触发
  3. 创建审计记录
  4. 将审计记录插入审计表

细粒度审计

细粒度审计基于内容监控数据访问。例如:

  1. 审计SELECT操作

    BEGIN
      DBMS_FGA.add_policy(
        object_schema   => 'HR',
        object_name     => 'EMPLOYEES',
        policy_name     => 'audit_emps_salary',
        audit_condition => 'department_id=10',
        audit_column    => 'SALARY,COMMISSION_PCT'
      );
    END;

    创建细粒度审计策略audit_emps_salary,条件为department_id=10,并审计SALARY和COMMISSION_PCT列的操作。

FGA策略

  1. 定义审计标准和操作
  2. 使用DBMS_FGA.ADD_POLICY创建

例如:

BEGIN
  DBMS_FGA.add_policy(
    object_schema   => 'HR',
    object_name     => 'EMPLOYEES',
    policy_name     => 'audit_emps_salary',
    audit_condition => 'department_id=10',
    audit_column    => 'SALARY,COMMISSION_PCT',
    handler_schema  => 'secure',
    handler_module  => 'log_emps_salary',
    enable          => TRUE,
    statement_types => 'SELECT,UPDATE'
  );
END;

创建一个FGA策略来审计HR.EMPLOYEES表中department_id=10的记录,审计的列为SALARY和COMMISSION_PCT。

FGA指南

策略名称必须唯一

在创建审计策略时,每个策略名称必须唯一。如果试图创建具有重复名称的策略,数据库将抛出错误。

举例说明:

  1. 创建第一个审计策略

    CREATE AUDIT POLICY unique_policy_1
    ACTIONS SELECT ON hr.employees;
  2. 尝试使用相同名称创建第二个审计策略

    CREATE AUDIT POLICY unique_policy_1
    ACTIONS UPDATE ON hr.employees;
    • 结果:数据库将抛出错误,提示策略名称已存在。例如:

      ORA-00955: name is already used by an existing object

被审计的表或视图必须存在

创建审计策略时,指定的表或视图必须已经存在。如果表或视图不存在,数据库将抛出错误。

举例说明:

  1. 确保表存在

    CREATE TABLE hr.departments (
      department_id NUMBER PRIMARY KEY,
      department_name VARCHAR2(50)
    );
  2. 创建审计策略

    CREATE AUDIT POLICY dept_audit_policy
    ACTIONS INSERT, UPDATE, DELETE ON hr.departments;
  3. 尝试对不存在的表创建审计策略

    CREATE AUDIT POLICY non_existent_table_policy
    ACTIONS SELECT ON hr.non_existent_table;
    • 结果:数据库将抛出错误,提示表或视图不存在。例如:

      ORA-00942: table or view does not exist

无效的审计条件会抛出ORA-28112错误

如果审计策略中包含无效的条件语法,数据库将抛出ORA-28112错误。

举例说明:

  1. 创建一个无效条件的审计策略

    CREATE AUDIT POLICY invalid_condition_policy
    ACTIONS SELECT ON hr.employees
    WHEN 'INVALID_SYNTAX'
    • 结果:数据库将抛出ORA-28112错误,提示无效的审计条件。例如:

      ORA-28112: failed to execute policy function

如果审计的列不存在,则不审计任何行

如果审计策略指定了一个不存在的列,那么该策略将不会审计任何行。

举例说明:

  1. 创建一个审计策略,指定一个不存在的列

    CREATE AUDIT POLICY invalid_column_policy
    ACTIONS SELECT ON hr.employees
    COLUMNS non_existent_column;
    • 结果:该策略不会审计任何行,因为指定的列不存在。
  2. 验证审计策略

    SELECT * FROM audit_trail
    WHERE policy_name = 'invalid_column_policy';
    • 结果:查询将返回零行,因为没有记录被审计。

如果事件处理程序不存在,则不会返回错误,但仍会创建审计记录

如果在创建审计策略时指定的事件处理程序不存在,数据库将不会返回错误,但审计记录仍会被创建。

举例说明:

  1. 创建一个审计策略,指定一个不存在的事件处理程序

    CREATE AUDIT POLICY non_existent_handler_policy
    ACTIONS SELECT ON hr.employees
    HANDLER non_existent_handler;
    • 结果:策略将被创建,但指定的事件处理程序不存在。
  2. 执行被审计的操作

    SELECT * FROM hr.employees;
  3. 验证审计记录

    SELECT * FROM audit_trail
    WHERE policy_name = 'non_existent_handler_policy';
    • 结果:审计记录将被创建,尽管事件处理程序不存在。

通过上述举例,可以更清晰地理解如何在Oracle数据库中创建和管理审计策略,确保策略名称唯一、表或视图存在、条件语法正确,以及处理不存在的列和事件处理程序的情况。

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。




像0-1的学习,提供全面的学习资源和社群,多种副业选择,总有一个适合你。


本文由mdnice多平台发布


逼格高的汤圆
7 声望2 粉丝