创建审计策略:指定条件
每会话条件和评估 (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角色的所有操作。
启用和禁用审计策略
启用审计策略
应用于所有用户
AUDIT POLICY audit_syspriv_pol1;
对所有用户应用audit_syspriv_pol1审计策略。
仅应用于某些用户
AUDIT POLICY audit_pol2 BY scott, oe; AUDIT POLICY audit_pol3 BY sys;
仅对scott和oe用户应用audit_pol2审计策略,对sys用户应用audit_pol3审计策略。
排除某些用户
AUDIT POLICY audit_pol4 EXCEPT jim, george;
对所有用户应用audit_pol4审计策略,但排除jim和george用户。
根据操作成功或失败进行审计
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中审计操作
连接到CDB根目录或PDB
连接到CDB根目录、应用程序根目录或常规PDB。
创建全局或本地统一审计策略
对所有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;
启用/禁用审计策略
- 解释:定义需要审计的用户或角色,并使用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审计策略中。
仅审计顶级语句
顶级语句统一审计可以帮助减少审计记录。例如:
创建顶级语句审计策略
CREATE AUDIT POLICY actions_all_pol ACTION ALL ONLY TOPLEVEL; AUDIT POLICY actions_all_pol BY SYS;
创建一个仅审计顶级语句的策略actions_all_pol,并应用于SYS用户。
减少审计记录
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;
查询已定义的审计策略及其条件评估选项。
基于值的审计
基于值的审计通过触发器实现。例如:
- 用户进行修改
- 触发器触发
- 创建审计记录
- 将审计记录插入审计表
细粒度审计
细粒度审计基于内容监控数据访问。例如:
审计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策略
- 定义审计标准和操作
- 使用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指南
策略名称必须唯一
在创建审计策略时,每个策略名称必须唯一。如果试图创建具有重复名称的策略,数据库将抛出错误。
举例说明:
创建第一个审计策略
CREATE AUDIT POLICY unique_policy_1 ACTIONS SELECT ON hr.employees;
尝试使用相同名称创建第二个审计策略
CREATE AUDIT POLICY unique_policy_1 ACTIONS UPDATE ON hr.employees;
结果:数据库将抛出错误,提示策略名称已存在。例如:
ORA-00955: name is already used by an existing object
被审计的表或视图必须存在
创建审计策略时,指定的表或视图必须已经存在。如果表或视图不存在,数据库将抛出错误。
举例说明:
确保表存在
CREATE TABLE hr.departments ( department_id NUMBER PRIMARY KEY, department_name VARCHAR2(50) );
创建审计策略
CREATE AUDIT POLICY dept_audit_policy ACTIONS INSERT, UPDATE, DELETE ON hr.departments;
尝试对不存在的表创建审计策略
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错误。
举例说明:
创建一个无效条件的审计策略
CREATE AUDIT POLICY invalid_condition_policy ACTIONS SELECT ON hr.employees WHEN 'INVALID_SYNTAX'
结果:数据库将抛出ORA-28112错误,提示无效的审计条件。例如:
ORA-28112: failed to execute policy function
如果审计的列不存在,则不审计任何行
如果审计策略指定了一个不存在的列,那么该策略将不会审计任何行。
举例说明:
创建一个审计策略,指定一个不存在的列
CREATE AUDIT POLICY invalid_column_policy ACTIONS SELECT ON hr.employees COLUMNS non_existent_column;
- 结果:该策略不会审计任何行,因为指定的列不存在。
验证审计策略
SELECT * FROM audit_trail WHERE policy_name = 'invalid_column_policy';
- 结果:查询将返回零行,因为没有记录被审计。
如果事件处理程序不存在,则不会返回错误,但仍会创建审计记录
如果在创建审计策略时指定的事件处理程序不存在,数据库将不会返回错误,但审计记录仍会被创建。
举例说明:
创建一个审计策略,指定一个不存在的事件处理程序
CREATE AUDIT POLICY non_existent_handler_policy ACTIONS SELECT ON hr.employees HANDLER non_existent_handler;
- 结果:策略将被创建,但指定的事件处理程序不存在。
执行被审计的操作
SELECT * FROM hr.employees;
验证审计记录
SELECT * FROM audit_trail WHERE policy_name = 'non_existent_handler_policy';
- 结果:审计记录将被创建,尽管事件处理程序不存在。
通过上述举例,可以更清晰地理解如何在Oracle数据库中创建和管理审计策略,确保策略名称唯一、表或视图存在、条件语法正确,以及处理不存在的列和事件处理程序的情况。
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
像0-1的学习,提供全面的学习资源和社群,多种副业选择,总有一个适合你。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。