Skip to content

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 包配置