引言
数据库审计是保障数据安全和满足合规要求的核心手段。然而,在oracle数据库的实际运维中,审计的开启与关闭却常常让dba陷入两难:开启审计担心性能开销和存储膨胀,关闭审计又害怕合规风险和安全漏洞。更复杂的是,从11g的传统审计到19c、23ai的统一审计,审计机制本身也在经历深刻的架构变革。
本文将系统梳理oracle数据库审计的启停方法,涵盖传统审计和统一审计两大体系,从参数配置到策略管理,从启动关闭到数据清理,提供一份完整的操作指南。
一、审计机制概览:传统审计与统一审计
1.1 传统审计
oracle传统审计从8i时代沿用至今,其核心设计是通过audit_trail初始化参数控制审计功能的开关,通过audit语句开启特定类型的审计,通过noaudit语句取消审计。审计记录可以存储在数据库的sys.aud$表中,也可以写入操作系统的审计文件中。
传统审计分为三种类型:
语句审计:对特定类型的sql语句进行审计,例如audit create table。
权限审计:对执行系统特权的操作进行审计,例如audit create session。
对象审计:对特定数据库对象上的操作进行审计,例如audit insert on scott.emp。
在oracle 11g中,用dbca工具建库后,审计功能默认是开启的。audit_trail参数的缺省值为db,这意味着审计数据将记录在数据库中的aud$审计字典基表上。
1.2 统一审计
统一审计是oracle 12c开始引入的全新审计架构,提供了一套完整的增强审计功能。与将审计记录分散在多个视图和表中的传统审计不同,统一审计将所有审计记录整合到一个统一的位置,大大简化了审计数据的管理和分析。
oracle官方建议,在21c及更高版本中优先使用统一审计。传统审计在oracle database 21c中已被弃用。在23ai中,新创建的数据库不再包含传统审计功能。如果从旧版本升级到23ai且数据库已在使用统一审计,则升级后继续使用统一审计;如果升级的数据库仍保留传统审计设置,则升级后将继续应用传统审计设置,直到使用noaudit命令禁用这些设置。
二、传统审计的启停方法
2.1 audit_trail参数详解
传统审计的开关由audit_trail初始化参数控制。该参数是一个静态参数,修改后需要重启数据库才能生效。
audit_trail参数的可选值如下:
none:禁用标准审计。如果初始化参数文件中未设置audit_trail参数,或使用非dbca方式创建数据库,则默认为此值。
os:将所有审计记录写入操作系统文件。oracle建议在超安全数据库配置中使用此设置。审计文件的位置由audit_file_dest参数指定。
db:将审计记录导向数据库审计跟踪(sys.aud$表)。如果数据库以只读模式启动且audit_trail设置为db,oracle database内部会将audit_trail设置为os。
db, extended:执行audit_trail=db的所有操作,并在可用时填充sys.aud表的sql绑定和sql文本clob类型列[reference:31][reference:32]。当标准审计与db,extended一起使用时,vpd谓词和策略名称也会被填充到sys.aud表的sql绑定和sql文本clob类型列[reference:31][reference:32]。当标准审计与db,extended一起使用时,vpd谓词和策略名称也会被填充到sys.aud表中。此设置在分析审计细节时非常有用,因为sql文本和绑定变量对于安全分析至关重要。
xml:以xml格式将审计记录写入操作系统审计记录文件。记录auditrecord节点的所有元素,但sql_text和sql_bind除外。
xml, extended:执行audit_trail=xml的所有操作,并在审计跟踪中包含sql文本和sql绑定信息。
2.2 开启传统审计
开启传统审计需要在数据库级别和语句级别两个层面进行操作。
第一步:修改audit_trail参数
以sysdba身份登录数据库,执行以下命令:
-- 查看当前审计参数设置 show parameter audit_trail; -- 将审计记录导向数据库,并记录sql文本和绑定变量 alter system set audit_trail = db, extended scope = spfile; -- 或者将审计记录导向操作系统文件 alter system set audit_trail = os scope = spfile; alter system set audit_file_dest = '/u01/app/oracle/admin/orcl/adump' scope = spfile;
修改参数后,需要重启数据库使参数生效:
startup force
重启后再次确认参数已生效:
show parameter audit_trail;
第二步:使用audit语句开启审计
参数开启后,需要使用audit语句对特定的操作进行审计。
语句审计示例:审计所有用户的登录活动:
audit session;
用户级语句审计:审计scott用户的建表操作:
audit create table by scott by access;
查看已启用的语句审计选项:
select user_name, audit_option, success, failure from dba_stmt_audit_opts where user_name = 'scott';
权限审计示例:审计用户创建会话的权限使用情况:
audit create session by access;
设置audit_sys_operations参数,审计以sysdba或sysoper身份执行的操作:
alter system set audit_sys_operations = true scope = spfile;
对象审计示例:审计对scott.emp表的dml操作:
audit insert, update, delete on scott.emp by access;
2.3 关闭传统审计
关闭传统审计同样需要在两个层面进行操作。
第一步:取消审计策略
使用noaudit语句取消已开启的审计。noaudit是audit的逆向操作。
取消所有权限审计:
noaudit all privileges;
取消scott用户的建表审计:
noaudit create table by scott;
查看确认审计选项已被取消:
select user_name, audit_option, success, failure from dba_stmt_audit_opts where user_name = 'scott';
第二步:关闭审计跟踪
将audit_trail参数设置为none:
alter system set audit_trail = none scope = spfile;
重启数据库使参数生效:
startup force
确认审计已关闭:
show parameter audit_trail;
三、统一审计的启停方法
3.1 统一审计的启用状态
在oracle 19c中,统一审计默认是启用的。审计记录在审计sql语句执行期间或之后生成。某些安全敏感的数据库活动始终被审计,且此类审计配置无法禁用。
可以通过查询v$option视图检查统一审计的启用状态:
select value from v$option where parameter = 'unified auditing';
如果返回false,表示数据库处于混合模式,需要启用统一审计。
3.2 开启统一审计
在统一审计已启用的数据库中,通过创建和启用统一审计策略来控制审计行为。
创建审计策略:
create audit policy policy_name actions [action1, action2, ...] on [object];
例如,审计对敏感表的select操作:
create audit policy audit_sensitive_table actions select on scott.employees;
启用审计策略:
audit policy policy_name;
3.3 关闭统一审计
关闭统一审计需要从两个层面操作。
第一步:禁用已启用的统一审计策略
查找已启用的统一审计策略:
select policy_name, enabled_opt from audit_unified_enabled_policies;
使用noaudit policy语句禁用每个已启用的策略:
noaudit policy policy_name;
第二步:禁用统一审计可执行文件
如果需要完全禁用统一审计,可以从cdb根容器禁用统一审计可执行文件。请注意,此操作仅能在cdb根容器级别执行,不能针对单个pdb。
3.4 混合模式
混合模式审计功能旨在协助从传统审计向统一审计过渡。在混合模式下,传统审计和统一审计可以并存,允许用户在迁移过程中逐步切换。但oracle不推荐长期使用混合模式。
四、审计数据的查看与管理
4.1 传统审计记录的查看
审计记录存储在指定的位置后,可以通过查询相应的视图或文件来查看。
数据库审计跟踪:如果审计记录存储在sys.aud$表中,可以通过查询dba_audit_trail视图查看:
select username, to_char(timestamp, 'mm/dd/yy hh24:mi:ss') timestamp,
obj_name, action_name, sql_text
from dba_audit_trail
where username = 'scott';操作系统审计文件:如果审计记录存储在操作系统文件中,需要使用操作系统命令查看。文件位置由audit_file_dest参数指定。
4.2 统一审计记录的查看
统一审计记录可以通过查询unified_audit_trail视图查看。
4.3 审计记录的清理
随着审计记录的积累,可能会占用大量存储空间。必须使用dbms_audit_mgmt包进行清理,不能直接delete。
dbms_audit_mgmt包的核心功能:
- 设置审计管理基础设施和默认清理间隔
- 将数据库审计跟踪表移出system表空间
- 基于最后归档时间戳删除审计跟踪记录
- 配置定期删除审计跟踪记录的作业
清理前检查归档时间戳:
select * from dba_audit_mgmt_last_arch_ts;
只允许删除已归档的数据。
五、审计的迁移与升级
5.1 升级前准备
在将旧版本数据库升级到新版本时,oracle建议在升级前规划向统一审计的过渡。
如果审计记录数量庞大,建议在升级前预处理审计记录。在预处理审计记录前,检查数据库sys/system是否有无效对象。
5.2 统一审计记录的迁移
从12c release 1升级后,可以将统一审计记录转移到audsys架构下的新关系表中,以提高统一审计跟踪的读取性能。此操作是可选的,但oracle建议执行以获得更好的读取性能。这是一次性操作,升级后生成的所有新统一审计记录都会写入新表。
迁移方法:
begin dbms_audit_mgmt.transfer_unified_audit_records; end; /
5.3 从传统审计迁移到统一审计
如果升级的数据库保留了传统审计设置,升级后的数据库将继续应用传统审计设置并将其捕获在旧版本审计跟踪中,直到使用noaudit命令禁用这些审计设置。升级后将无法创建新的传统审计设置或修改现有设置。
六、最佳实践与注意事项
6.1 审计策略的规划
开启审计功能前,应仔细规划需要审计的操作类型和范围。收集不必要的审计信息会影响数据库性能、增加存储成本,并可能使识别恶意数据库活动变得更加困难。应针对具体需求精细调整审计策略,只收集目标审计数据。
6.2 性能影响评估
对于典型的特权用户审计或关键数据库操作审计场景,性能影响极低,甚至因审计量分散在整个星期而无法测量。当审计负载增加到每分钟几千条审计记录时,可能会开始看到约1%的性能影响。
内部性能测试显示,使用tpc-c混合应用工作负载时,当审计超过每分钟6000条审计记录时,cpu开销可能在2%到5%之间。即使极端审计负载达到每分钟36000条审计记录,额外开销仍保持在个位数百分比。
6.3 审计数据的生命周期管理
建立审计数据的定期清理机制是必不可少的。可以使用dbms_audit_mgmt包配置定期清理作业。清理作业的频率可由审计管理员控制。在清理前确认归档时间戳,确保只删除已归档的数据。
6.4 版本差异的注意点
各版本在审计功能上存在显著差异:
11g:用dbca建库后审计功能默认开启,audit_trail缺省值为db。
19c:已引入统一审计机制。dbca创建的数据库默认audit_trail为db。
21c:传统审计已被弃用,oracle推荐使用统一审计。
23ai:新创建的数据库不再包含传统审计功能。升级的数据库若已有传统审计设置,升级后将继续应用。
6.5 安全注意事项
在cdb环境中,audit_trail参数的作用域是cdb,虽然审计跟踪是按pdb提供的,但此初始化参数不能针对单个pdb配置。禁用统一审计只能从cdb根容器执行,不能针对单个pdb。禁用统一审计策略需要audit system系统权限或audit_admin角色。
结语
oracle数据库审计的启停并非简单的开关操作,而是一个涉及参数配置、策略管理、数据清理和版本演进的系统工程。从11g的传统审计到23ai的统一审计,审计机制本身也在不断进化。理解两种审计体系的差异,掌握各自的启停方法和注意事项,是每个oracle dba保障数据库安全与合规的基本功。
在实际运维中,建议遵循以下核心原则:提前规划审计策略,避免收集不必要的信息;在开启审计前评估性能影响;建立审计数据的定期清理机制;在版本升级前规划向统一审计的过渡。当审计被正确配置和管理时,它将成为数据库安全的坚实防线,而非运维的沉重负担。
以上就是oracle数据库审计启停的完整指南(从传统审计到统一审计)的详细内容,更多关于oracle数据库审计启停的资料请关注代码网其它相关文章!
发表评论