外观
Oracle 审计机制
审计的基本概念
审计的作用
- 安全监控:跟踪和记录用户对数据库的操作
- 合规性要求:满足行业法规和内部审计要求
- 问题追溯:在安全事件发生后进行调查和分析
- 权限滥用检测:发现异常的权限使用情况
- 操作追踪:记录关键业务操作的执行情况
审计的类型
- 语句审计:审计特定类型的 SQL 语句
- 权限审计:审计系统权限和对象权限的使用
- 模式对象审计:审计对特定模式对象的操作
- 细粒度审计:基于条件的审计,更灵活精确
- 管理员审计:审计管理员的操作
审计的配置
审计参数配置
AUDIT_TRAIL
- 审计轨迹存储方式
- 值:NONE、OS、DB、DB_EXTENDED、XML、XML_EXTENDED
- 推荐值:DB 或 DB_EXTENDED
- 注意事项:启用审计会增加系统开销
AUDIT_SYS_OPERATIONS
- 是否审计 sys 用户操作
- 值:TRUE/FALSE
- 推荐值:TRUE
- 安全建议:生产环境必须启用
AUDIT_SYSLOG_LEVEL
- 当 AUDIT_TRAIL=OS 时,指定 syslog 级别
- 值:LOCAL0 到 LOCAL7
- 推荐值:根据系统配置调整
启用审计
sql
-- 启用数据库审计
ALTER SYSTEM SET audit_trail = 'DB, EXTENDED' SCOPE=SPFILE;
-- 启用 sys 操作审计
ALTER SYSTEM SET audit_sys_operations = TRUE SCOPE=SPFILE;
-- 重启实例使配置生效
SHUTDOWN IMMEDIATE;
STARTUP;审计的实施
语句审计
sql
-- 审计所有 CREATE TABLE 语句
AUDIT CREATE TABLE;
-- 审计特定用户的 ALTER TABLE 语句
AUDIT ALTER TABLE BY scott;
-- 审计所有 DDL 语句
AUDIT DDL;权限审计
sql
-- 审计系统权限的使用
AUDIT CREATE ANY TABLE;
-- 审计对象权限的使用
AUDIT SELECT ON scott.emp;
-- 审计所有系统权限
AUDIT ALL PRIVILEGES;模式对象审计
sql
-- 审计对表的所有操作
AUDIT ALL ON scott.emp;
-- 审计对视图的查询操作
AUDIT SELECT ON scott.emp_view;
-- 审计对存储过程的执行
AUDIT EXECUTE ON scott.get_emp;细粒度审计 (FGA)
sql
-- 创建细粒度审计策略
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'scott',
object_name => 'emp',
policy_name => 'audit_salary',
audit_condition => 'salary > 5000',
audit_column => 'salary',
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => 'SELECT',
audit_trail => DBMS_FGA.DB_EXTENDED
);
END;
/审计数据的管理
审计数据的查询
查询标准审计数据
sql-- 查看审计记录 SELECT username, timestamp, action_name, obj_name, sql_text FROM dba_audit_trail ORDER BY timestamp DESC;查询细粒度审计数据
sql-- 查看细粒度审计记录 SELECT db_user, event_timestamp, object_schema, object_name, sql_text FROM dba_fga_audit_trail ORDER BY event_timestamp DESC;
审计数据的清理
sql
-- 清理审计表
-- 方法 1:使用 TRUNCATE
TRUNCATE TABLE aud$;
-- 方法 2:使用 DELETE(带条件)
DELETE FROM aud$ WHERE timestamp < SYSDATE - 30;
COMMIT;
-- 方法 3:使用 DBMS_AUDIT_MGMT 包(11g 及以上)
BEGIN
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
use_default_cleanup => TRUE
);
END;
/审计数据的归档
sql
-- 创建审计归档表
CREATE TABLE audit_archive AS
SELECT * FROM dba_audit_trail WHERE 1=0;
-- 归档审计数据
INSERT INTO audit_archive
SELECT * FROM dba_audit_trail WHERE timestamp < SYSDATE - 30;
-- 清理已归档的数据
DELETE FROM aud$ WHERE timestamp < SYSDATE - 30;
COMMIT;审计的监控和分析
审计监控
监控审计表大小
sql-- 查看审计表大小 SELECT segment_name, bytes/1024/1024 AS size_mb FROM dba_segments WHERE segment_name IN ('AUD$', 'FGA_LOG$');监控审计相关等待事件
sql-- 查看审计相关等待事件 SELECT event, count(*) FROM v$session_wait WHERE event LIKE '%audit%' GROUP BY event;
审计分析
分析用户活动
sql-- 分析用户操作频率 SELECT username, action_name, count(*) FROM dba_audit_trail WHERE timestamp > SYSDATE - 1 GROUP BY username, action_name ORDER BY count(*) DESC;分析异常操作
sql-- 查找非工作时间的操作 SELECT username, timestamp, action_name, obj_name FROM dba_audit_trail WHERE TO_CHAR(timestamp, 'HH24') NOT BETWEEN '08' AND '18' ORDER BY timestamp DESC;
审计的最佳实践
配置最佳实践
- 合理选择审计级别:根据安全需求和系统性能平衡
- 启用必要的审计:重点审计关键操作和权限
- 使用细粒度审计:对敏感数据使用条件审计
- 定期备份审计数据:防止审计数据丢失
- 设置审计表空间:将审计数据存储在独立表空间
管理最佳实践
- 定期清理审计数据:避免审计表过大影响性能
- 监控审计表大小:设置告警阈值
- 审计数据归档:建立归档策略
- 审计数据分析:定期分析审计数据,发现异常
- 审计策略审查:定期审查和调整审计策略
性能优化
- 使用批量清理:避免频繁小批量删除
- 合理设置审计范围:只审计必要的操作
- 使用分区表:对审计表使用分区,按时间分区
- 定期收集统计信息:保持审计表的统计信息最新
- 考虑使用外部表:将审计数据存储在外部表
版本差异
11g vs 12c
- 统一审计:12c 引入了统一审计功能
- 审计策略:12c 使用审计策略而非单独的审计语句
- 细粒度审计增强:12c 增强了细粒度审计的能力
- 审计数据管理:12c 提供了更完善的审计数据管理功能
12c vs 19c
- 审计性能优化:19c 优化了审计的性能
- 审计策略模板:19c 提供了预定义的审计策略模板
- 增强的审计分析:19c 提供了更多审计分析工具
- 云环境审计:19c 增强了云环境下的审计能力
常见问题(FAQ)
Q1: 审计会对系统性能产生什么影响?
A1: 审计对系统性能的影响:
- 开销:启用审计会增加系统开销,特别是详细审计
- 影响因素:
- 审计的范围和粒度
- 审计数据的存储方式
- 系统的硬件配置
- 数据库的活动水平
- 优化建议:
- 只审计必要的操作
- 使用细粒度审计而非全面审计
- 定期清理审计数据
- 考虑使用外部表存储审计数据
Q2: 如何确定需要审计哪些操作?
A2: 确定审计范围的方法:
- 合规要求:根据行业法规和内部政策
- 安全风险:识别高风险操作和权限
- 业务重要性:审计关键业务操作
- 最佳实践:
- 审计所有 DDL 操作
- 审计系统权限的使用
- 审计敏感数据的访问
- 审计管理员操作
Q3: 审计数据过多怎么办?
A3: 处理大量审计数据的方法:
- 定期清理:建立审计数据清理策略
- 数据归档:将旧审计数据归档到其他存储
- 分区表:对审计表使用时间分区
- 外部表:考虑使用外部表存储审计数据
- 审计范围调整:减少不必要的审计
Q4: 如何查看审计配置是否正确?
A4: 验证审计配置的方法:
- 检查审计参数:sql
SHOW PARAMETER audit; - 测试审计:执行一些操作,然后检查审计记录
- 查看审计策略:sql
SELECT * FROM dba_audit_policies; - 检查审计状态:sql
SELECT * FROM dba_audit_config_params;
Q5: 如何保护审计数据不被篡改?
A5: 保护审计数据的方法:
- 使用 DB 或 XML 审计:存储在数据库中
- 限制审计表的访问:只允许授权用户访问
- 定期备份审计数据:防止审计数据丢失
- 使用只读表空间:将审计表存储在只读表空间
- 启用审计日志加密:12c 及以上版本支持
Q6: 细粒度审计与标准审计有什么区别?
A6: 细粒度审计与标准审计的区别:
- 粒度:细粒度审计更精细,可以基于条件
- 灵活性:细粒度审计可以针对特定列和条件
- 性能:细粒度审计开销通常小于标准审计
- 适用场景:细粒度审计适用于敏感数据的保护
- 配置方式:细粒度审计使用 DBMS_FGA 包配置
