Skip to content

Oracle 审计与合规最佳实践

审计与合规是Oracle数据库安全管理的重要组成部分,通过记录数据库活动,帮助DBA监控和审计数据库的使用情况,确保数据库操作符合安全策略和合规要求。合理配置审计可以有效防止未授权访问和恶意操作,提供数据库活动的可追溯性,满足PCI DSS、GDPR、SOX等合规要求。

审计基础

审计的核心作用

  • 记录数据库活动,提供可追溯性
  • 监控和检测未授权访问和恶意操作
  • 确保数据库操作符合安全策略
  • 满足合规要求,如PCI DSS、GDPR、SOX等
  • 帮助调查安全事件和数据泄露

审计方式对比

审计方式适用版本优势劣势适用场景
统一审计12c+整合所有审计功能,配置灵活,性能较好需要Oracle Enterprise Edition生产环境,需要全面审计
精细审计10g+细粒度控制,可基于条件审计配置复杂,性能开销较大敏感数据审计,如信用卡号、个人信息
传统审计11g-配置简单,支持所有版本功能有限,性能开销较大旧版本数据库,简单审计需求

统一审计配置

统一审计是Oracle 12c及以上版本提供的统一审计框架,整合了所有审计功能,提供了更灵活、更高效的审计解决方案。

检查统一审计状态

sql
-- 查看统一审计是否启用
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

-- 查看统一审计记录
SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM <= 5;

启用统一审计

Oracle 19c及以下版本

bash
# 停止数据库
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;

# 以升级模式启动数据库
STARTUP UPGRADE;

# 启用统一审计
ALTER SYSTEM SET AUDIT_TRAIL = NONE SCOPE=SPFILE;

# 编译统一审计组件
@$ORACLE_HOME/rdbms/admin/catcon.pl -u SYS/password -d $ORACLE_HOME/rdbms/admin -b enable_unified_audit enable_unified_audit.sql

# 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;

Oracle 21c版本

Oracle 21c默认启用统一审计,无需额外配置。

预定义审计策略

Oracle提供了多种预定义的审计策略,可以直接启用:

sql
-- 查看所有预定义审计策略
SELECT POLICY_NAME, DESCRIPTION FROM AUDIT_UNIFIED_POLICIES WHERE PREDEFINED_OPTION = 'YES';

-- 启用常用预定义策略
-- 审计所有权限使用
AUDIT POLICY ORA_PRIVILEGES;

-- 审计数据库参数变更
AUDIT POLICY ORA_DATABASE_PARAMETER;

-- 审计登录失败
AUDIT POLICY ORA_LOGON_FAILURES;

-- 审计登录成功
AUDIT POLICY ORA_LOGON_SUCCESS;

-- 审计数据库管理操作
AUDIT POLICY ORA_DATABASE_ADMIN;

自定义审计策略

基于操作的审计

sql
-- 创建自定义审计策略,审计HR用户的敏感操作
CREATE AUDIT POLICY hr_audit_policy
PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE,
ACTIONS SELECT, INSERT, UPDATE, DELETE ON hr.employees,
ACTIONS EXECUTE ON hr.get_employee_details;

-- 启用自定义审计策略
AUDIT POLICY hr_audit_policy;

-- 对特定用户启用审计策略
AUDIT POLICY hr_audit_policy BY scott;

基于条件的审计

sql
-- 创建基于条件的审计策略,审计薪资高于10000的操作
CREATE AUDIT POLICY salary_audit_policy
ACTIONS SELECT, UPDATE ON hr.employees
WHEN 'salary > 10000' EVALUATE PER STATEMENT;

-- 启用审计策略
AUDIT POLICY salary_audit_policy;

管理审计策略

sql
-- 修改审计策略,添加新的操作
ALTER AUDIT POLICY hr_audit_policy ADD ACTIONS SELECT ON hr.departments;

-- 禁用审计策略
NOAUDIT POLICY hr_audit_policy;

-- 删除审计策略
DROP AUDIT POLICY hr_audit_policy;

精细审计配置

精细审计(FGA)允许对特定表、列或条件进行审计,提供更细粒度的审计控制。

创建精细审计策略

sql
-- 创建FGA策略,审计对employees表salary列的访问
BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema => 'HR',
    object_name => 'EMPLOYEES',
    policy_name => 'EMPLOYEES_SALARY_AUDIT',
    audit_condition => 'DEPARTMENT_ID = 10',
    audit_column => 'SALARY',
    handler_schema => NULL,
    handler_module => NULL,
    enable => TRUE,
    statement_types => 'SELECT',
    audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED
  );
END;
/

管理精细审计策略

sql
-- 禁用FGA策略
BEGIN
  DBMS_FGA.DISABLE_POLICY(
    object_schema => 'HR',
    object_name => 'EMPLOYEES',
    policy_name => 'EMPLOYEES_SALARY_AUDIT'
  );
END;
/

-- 修改FGA策略
BEGIN
  DBMS_FGA.ALTER_POLICY(
    object_schema => 'HR',
    object_name => 'EMPLOYEES',
    policy_name => 'EMPLOYEES_SALARY_AUDIT',
    audit_condition => 'DEPARTMENT_ID IN (10, 20)',
    enable => TRUE
  );
END;
/

-- 删除FGA策略
BEGIN
  DBMS_FGA.DROP_POLICY(
    object_schema => 'HR',
    object_name => 'EMPLOYEES',
    policy_name => 'EMPLOYEES_SALARY_AUDIT'
  );
END;
/

审计日志管理

审计日志存储

统一审计日志

  • 默认存储在SYSTEM表空间的AUDSYS模式中
  • 可以配置为存储在操作系统文件中
  • 支持将日志发送到外部系统,如SIEM

配置审计日志存储位置

sql
-- 查看当前审计日志存储位置
SELECT * FROM DBA_AUDIT_MGMT_CONFIG_PARAMS;

-- 配置审计日志存储在操作系统文件中
BEGIN
  DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY(
    audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
    audit_trail_property => DBMS_AUDIT_MGMT.AUDIT_TRAIL_LOCATION,
    audit_trail_property_value => '/u01/app/oracle/admin/orcl/audit'
  );
END;
/

审计日志清理

自动清理配置

sql
-- 启用审计日志自动清理
EXEC DBMS_AUDIT_MGMT.INIT_CLEANUP(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  default_cleanup_interval => 1440 -- 清理间隔(分钟)
);

-- 设置审计日志保留时间(30天)
EXEC DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  audit_trail_property => DBMS_AUDIT_MGMT.AUDIT_TRAIL_RETENTION_WINDOW,
  audit_trail_property_value => 30
);

-- 启用自动清理作业
EXEC DBMS_AUDIT_MGMT.ENABLE_AUDIT_TRAIL_CLEANUP(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  use_default_cleanup_interval => TRUE
);

手动清理示例

sql
-- 手动清理7天前的统一审计日志
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  use_last_arch_timestamp => TRUE,
  last_arch_timestamp => SYSTIMESTAMP - INTERVAL '7' DAY
);

审计日志分析

基本查询示例

sql
-- 查看最近10条审计记录
SELECT * FROM UNIFIED_AUDIT_TRAIL 
ORDER BY EVENT_TIMESTAMP DESC 
FETCH FIRST 10 ROWS ONLY;

-- 查看登录失败记录
SELECT DBUSERNAME, EVENT_TIMESTAMP, CLIENT_IP_ADDRESS, OS_USERNAME 
FROM UNIFIED_AUDIT_TRAIL 
WHERE ACTION_NAME = 'LOGON' AND SUCCESS = 0;

-- 查看特定用户的敏感操作
SELECT EVENT_TIMESTAMP, ACTION_NAME, OBJECT_NAME, SQL_TEXT 
FROM UNIFIED_AUDIT_TRAIL 
WHERE DBUSERNAME = 'HR' 
AND ACTION_NAME IN ('INSERT', 'UPDATE', 'DELETE') 
ORDER BY EVENT_TIMESTAMP DESC;

-- 查看权限使用情况
SELECT DBUSERNAME, PRIVILEGE_USED, COUNT(*) 
FROM UNIFIED_AUDIT_TRAIL 
WHERE PRIVILEGE_USED IS NOT NULL 
GROUP BY DBUSERNAME, PRIVILEGE_USED 
ORDER BY COUNT(*) DESC;

实用审计脚本

审计报告生成脚本

sql
-- 创建审计报告视图
CREATE OR REPLACE VIEW vw_audit_report AS
SELECT 
  TRUNC(EVENT_TIMESTAMP) AS audit_date,
  ACTION_NAME,
  DBUSERNAME,
  COUNT(*) AS event_count,
  SUM(CASE WHEN SUCCESS = 1 THEN 1 ELSE 0 END) AS success_count,
  SUM(CASE WHEN SUCCESS = 0 THEN 1 ELSE 0 END) AS failure_count
FROM UNIFIED_AUDIT_TRAIL
GROUP BY TRUNC(EVENT_TIMESTAMP), ACTION_NAME, DBUSERNAME
ORDER BY audit_date DESC, event_count DESC;

-- 生成审计报告
SELECT * FROM vw_audit_report WHERE audit_date >= TRUNC(SYSDATE - 7);

Oracle 19c与21c审计差异

核心差异对比

特性Oracle 19cOracle 21c
统一审计默认状态可选启用默认启用
预定义审计策略数量12个20个,新增更多合规相关策略
审计条件支持基本支持增强支持,支持更复杂的条件表达式
审计日志性能基础优化增强优化,减少审计对数据库性能的影响
合规报告功能基础支持内置多种合规报告模板,支持PCI DSS、GDPR等
审计数据加密支持增强支持,默认加密审计日志
审计策略继承不支持支持,子策略可继承父策略的配置
实时审计告警基础支持增强支持,可配置实时审计告警

Oracle 21c特有功能

  1. 增强的预定义审计策略

    • 新增了针对GDPR、PCI DSS等合规标准的预定义策略
    • 更细粒度的权限审计策略
  2. 实时审计告警

    sql
    -- 配置登录失败告警
    BEGIN
      DBMS_AUDIT_MGMT.CREATE_ALERT(
        alert_name => 'LOGON_FAILURE_ALERT',
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
        alert_condition => 'ACTION_NAME = ''LOGON'' AND SUCCESS = 0',
        alert_interval => 60,
        alert_email => 'dba@example.com'
      );
    END;
    /
  3. 合规报告生成

    • 内置多种合规报告模板
    • 支持导出为PDF、HTML等格式
    • 自动生成合规证明文档

生产环境最佳实践

审计策略设计

  1. 基于风险的审计

    • 高风险操作:完全审计(如数据修改、权限变更)
    • 中风险操作:选择性审计(如敏感数据查询)
    • 低风险操作:最小化审计(如普通查询)
  2. 分层审计策略

    • 全局审计:审计所有登录、权限变更等关键操作
    • 应用审计:针对特定应用的审计策略
    • 敏感数据审计:针对敏感数据的细粒度审计
  3. 审计数据保护

    • 限制对审计日志的访问权限
    • 加密审计日志
    • 定期备份审计日志
    • 将审计日志发送到安全的外部系统

性能优化

  1. 避免过度审计

    • 只审计必要的操作和数据
    • 避免审计高频低风险操作
    • 使用条件审计减少审计记录数量
  2. 审计日志优化

    • 定期清理过期审计日志
    • 配置适当的审计日志存储位置
    • 考虑使用分区表存储审计日志
  3. 审计策略调整

    • 定期审查审计策略,调整审计范围
    • 根据性能影响调整审计级别
    • 监控审计对数据库性能的影响

合规要求实现

  1. PCI DSS合规

    • 审计所有访问持卡人数据的操作
    • 审计权限变更和系统配置变更
    • 保留至少12个月的审计日志
    • 定期审查审计日志
  2. GDPR合规

    • 审计所有个人数据访问和处理操作
    • 实现数据访问的可追溯性
    • 支持数据主体访问请求
    • 审计数据删除操作
  3. SOX合规

    • 审计所有财务相关操作
    • 审计系统变更和权限变更
    • 实现职责分离
    • 保留至少7年的审计日志

常见问题(FAQ)

Q:如何检查统一审计是否启用?

A:使用以下SQL查询:

sql
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

Q:审计会影响数据库性能吗?

A:审计会带来一定的性能开销,具体影响取决于:

  • 审计的范围和频率
  • 审计的复杂度
  • 数据库的硬件配置
  • 审计日志的存储方式

合理配置审计策略,只审计必要的操作,可以将性能影响降到最低。

Q:如何查看特定用户的审计记录?

A:使用以下SQL查询:

sql
SELECT * FROM UNIFIED_AUDIT_TRAIL 
WHERE DBUSERNAME = 'SCOTT' 
ORDER BY EVENT_TIMESTAMP DESC 
FETCH FIRST 100 ROWS ONLY;

Q:如何审计DBA用户的操作?

A:可以使用统一审计的预定义策略:

sql
-- 审计DBA操作
AUDIT POLICY ORA_DATABASE_ADMIN;

-- 审计所有权限使用
AUDIT POLICY ORA_PRIVILEGES;

Q:如何配置审计日志自动清理?

A:使用DBMS_AUDIT_MGMT包配置自动清理:

sql
-- 初始化清理
EXEC DBMS_AUDIT_MGMT.INIT_CLEANUP(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  default_cleanup_interval => 1440
);

-- 设置保留时间(30天)
EXEC DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  audit_trail_property => DBMS_AUDIT_MGMT.AUDIT_TRAIL_RETENTION_WINDOW,
  audit_trail_property_value => 30
);

-- 启用自动清理
EXEC DBMS_AUDIT_MGMT.ENABLE_AUDIT_TRAIL_CLEANUP(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  use_default_cleanup_interval => TRUE
);

Q:如何审计敏感数据的访问?

A:使用精细审计(FGA):

sql
-- 审计对员工表薪资列的访问
BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema => 'HR',
    object_name => 'EMPLOYEES',
    policy_name => 'EMPLOYEES_SALARY_AUDIT',
    audit_column => 'SALARY',
    statement_types => 'SELECT',
    audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED
  );
END;
/

Q:如何将审计日志发送到SIEM系统?

A:可以使用以下方法:

  1. 配置Oracle Audit Vault and Database Firewall
  2. 使用Oracle LogMiner提取审计日志
  3. 配置审计日志存储在操作系统文件中,使用SIEM agent收集
  4. 使用第三方工具,如Splunk Oracle DB Connect

Q:如何排查审计性能问题?

A:

  1. 检查审计日志生成速率:SELECT COUNT(*) FROM UNIFIED_AUDIT_TRAIL WHERE EVENT_TIMESTAMP >= SYSDATE - 1/24;
  2. 分析审计对系统资源的影响:查看AWR报告中的等待事件
  3. 审查审计策略,减少不必要的审计
  4. 考虑使用分区表存储审计日志
  5. 定期清理过期审计日志

Q:如何恢复误删除的审计记录?

A:

  1. 如果启用了审计日志备份,可以从备份恢复
  2. 如果审计日志存储在操作系统文件中,可以从文件恢复
  3. 对于统一审计,可以使用Oracle LogMiner恢复
  4. 预防措施:定期备份审计日志,限制删除审计记录的权限

Q:如何实现审计日志的不可篡改性?

A:

  1. 限制对审计日志的访问权限,只允许特定用户访问
  2. 配置审计日志的只读访问
  3. 使用数字签名保护审计日志
  4. 将审计日志实时发送到不可篡改的外部系统
  5. 定期生成审计日志的哈希值,用于完整性验证

总结

审计与合规是Oracle数据库安全管理的重要组成部分,通过合理配置审计,可以有效监控和审计数据库的使用情况,确保数据库操作符合安全策略和合规要求。DBA应该根据业务需求和合规要求,设计基于风险的审计策略,选择合适的审计方式,优化审计性能,保护审计日志的完整性和可用性。

Oracle 21c增强了审计功能,提供了更多预定义审计策略、实时审计告警和合规报告功能,DBA可以考虑升级到新版本以获得更好的审计支持。在生产环境中,建议使用统一审计框架,结合精细审计,实现全面、高效的审计管理,满足各种合规要求。