Skip to content

Oracle 审计日志配置与分析

概述

Oracle审计日志是数据库安全管理的重要组成部分,用于记录数据库的安全相关事件,包括用户登录、权限变更、数据访问和敏感操作等。通过配置和分析审计日志,可以实现:

  • 安全审计:监控数据库的访问情况,确保合规要求
  • 故障诊断:追踪问题根源,分析异常操作
  • 权限管理:监控权限使用情况,防止权限滥用
  • 数据保护:跟踪敏感数据的访问和修改

Oracle数据库提供了多种审计机制,包括:

  • 标准审计(Standard Auditing)
  • 统一审计(Unified Auditing)
  • 细粒度审计(Fine-Grained Auditing,FGA)

审计日志配置

1. 标准审计配置

标准审计是Oracle数据库的传统审计机制,通过初始化参数和审计语句进行配置。

1.1 配置审计参数

参数名称描述默认值19c/21c差异
AUDIT_TRAIL审计轨迹类型DB21c默认值为NONE,建议启用统一审计
AUDIT_FILE_DEST审计文件存放目录$ORACLE_BASE/admin/$DB_UNIQUE_NAME/adump无明显差异
AUDIT_SYS_OPERATIONS是否审计SYS用户操作FALSE无明显差异
AUDIT_SYSLOG_LEVEL审计日志发送到syslog的级别NONE无明显差异

1.2 启用标准审计

sql
-- 启用标准审计
ALTER SYSTEM SET audit_trail = 'DB,EXTENDED' SCOPE = SPFILE;
ALTER SYSTEM SET audit_sys_operations = TRUE SCOPE = SPFILE;
ALTER SYSTEM SET audit_file_dest = '/u01/app/oracle/admin/ORCL/adump' SCOPE = SPFILE;

-- 重启数据库使配置生效
SHUTDOWN IMMEDIATE;
STARTUP;

1.3 配置审计策略

sql
-- 审计特定用户的所有操作
AUDIT ALL BY scott BY ACCESS;

-- 审计特定操作
AUDIT SELECT, INSERT, UPDATE, DELETE ON scott.emp BY ACCESS;
AUDIT CREATE TABLE, DROP TABLE BY ACCESS;
AUDIT ALTER USER, CREATE USER, DROP USER BY ACCESS;

-- 审计登录和登出
AUDIT SESSION BY ACCESS;

-- 查看审计配置
SELECT * FROM DBA_STMT_AUDIT_OPTS;
SELECT * FROM DBA_PRIV_AUDIT_OPTS;
SELECT * FROM DBA_OBJ_AUDIT_OPTS;

2. 统一审计配置

统一审计是Oracle 12c及以后版本引入的新审计机制,提供了更灵活、更全面的审计功能。

2.1 启用统一审计

在Oracle 12c及以后版本中,统一审计默认启用。可以通过以下方式确认:

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

-- 查看统一审计策略
SELECT * FROM AUDIT_UNIFIED_POLICIES;
SELECT * FROM AUDIT_UNIFIED_ENABLED_POLICIES;

2.2 创建和启用统一审计策略

sql
-- 创建统一审计策略
CREATE AUDIT POLICY oracle_db_access_pol
  PRIVILEGES CREATE SESSION, ALTER SESSION,
  ACTIONS SELECT, INSERT, UPDATE, DELETE ON HR.EMPLOYEES,
  ROLES 'DBA', 'CONNECT',
  WHEN 'SYS_CONTEXT(''USERENV'', ''IP_ADDRESS'') <> ''192.168.1.100''' 
  EVALUATE PER SESSION;

-- 启用统一审计策略
AUDIT POLICY oracle_db_access_pol;

-- 为特定用户启用审计策略
AUDIT POLICY oracle_db_access_pol BY scott, hr;

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

2.3 使用预定义的统一审计策略

Oracle提供了多个预定义的统一审计策略:

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

-- 启用预定义审计策略
AUDIT POLICY ORA_SECURECONFIG;
AUDIT POLICY ORA_LOGON_FAILURES;

3. 细粒度审计配置

细粒度审计(FGA)用于监控特定表的特定列的访问和修改,提供更细粒度的审计控制。

sql
-- 创建细粒度审计策略
BEGIN
  DBMS_FGA.ADD_POLICY(
    OBJECT_SCHEMA => 'HR',
    OBJECT_NAME => 'EMPLOYEES',
    POLICY_NAME => 'hr_emp_salary_audit',
    AUDIT_CONDITION => 'SALARY > 10000',
    AUDIT_COLUMN => 'SALARY',
    HANDLER_SCHEMA => NULL,
    HANDLER_MODULE => NULL,
    ENABLE => TRUE,
    STATEMENT_TYPES => 'SELECT',
    AUDIT_TRAIL => DBMS_FGA.DB + DBMS_FGA.EXTENDED
  );
END;
/

-- 查看细粒度审计策略
SELECT * FROM DBA_AUDIT_POLICIES;
SELECT * FROM DBA_FGA_AUDIT_TRAIL;

-- 删除细粒度审计策略
BEGIN
  DBMS_FGA.DROP_POLICY(
    OBJECT_SCHEMA => 'HR',
    OBJECT_NAME => 'EMPLOYEES',
    POLICY_NAME => 'hr_emp_salary_audit'
  );
END;
/

审计日志分析

1. 标准审计日志分析

1.1 查询标准审计日志

sql
-- 查询标准审计日志
SELECT * FROM DBA_AUDIT_TRAIL WHERE USERNAME = 'SCOTT' ORDER BY TIMESTAMP DESC;

-- 查询登录和登出审计
SELECT USERNAME, ACTION_NAME, TIMESTAMP, RETURNCODE, OS_USERNAME, USERHOST 
FROM DBA_AUDIT_TRAIL 
WHERE ACTION_NAME IN ('LOGON', 'LOGOFF') 
ORDER BY TIMESTAMP DESC;

-- 查询权限变更审计
SELECT USERNAME, ACTION_NAME, OBJECT_NAME, TIMESTAMP, OS_USERNAME 
FROM DBA_AUDIT_TRAIL 
WHERE ACTION_NAME LIKE '%USER%' OR ACTION_NAME LIKE '%ROLE%' OR ACTION_NAME LIKE '%PRIVILEGE%'
ORDER BY TIMESTAMP DESC;

-- 查询表操作审计
SELECT USERNAME, ACTION_NAME, OWNER, OBJECT_NAME, TIMESTAMP, SQL_TEXT 
FROM DBA_AUDIT_TRAIL 
WHERE ACTION_NAME IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE') 
AND OWNER = 'HR' 
ORDER BY TIMESTAMP DESC;

2. 统一审计日志分析

2.1 查询统一审计日志

sql
-- 查询统一审计日志
SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE DBUSERNAME = 'SCOTT' ORDER BY EVENT_TIMESTAMP DESC;

-- 查询登录失败审计
SELECT DBUSERNAME, EVENT_TIMESTAMP, ACTION_NAME, RETURN_CODE, OS_USERNAME, USERHOST 
FROM UNIFIED_AUDIT_TRAIL 
WHERE ACTION_NAME = 'LOGON' AND RETURN_CODE != 0 
ORDER BY EVENT_TIMESTAMP DESC;

-- 查询权限使用审计
SELECT DBUSERNAME, EVENT_TIMESTAMP, ACTION_NAME, PRIVILEGE_NAME, OBJECT_NAME 
FROM UNIFIED_AUDIT_TRAIL 
WHERE PRIVILEGE_NAME IS NOT NULL 
ORDER BY EVENT_TIMESTAMP DESC;

-- 查询特定表的访问审计
SELECT DBUSERNAME, EVENT_TIMESTAMP, ACTION_NAME, OBJECT_OWNER, OBJECT_NAME, SQL_TEXT 
FROM UNIFIED_AUDIT_TRAIL 
WHERE OBJECT_OWNER = 'HR' AND OBJECT_NAME = 'EMPLOYEES' 
ORDER BY EVENT_TIMESTAMP DESC;

3. 细粒度审计日志分析

sql
-- 查询细粒度审计日志
SELECT TIMESTAMP, DB_USER, OS_USER, USERHOST, OBJECT_OWNER, OBJECT_NAME, SQL_TEXT 
FROM DBA_FGA_AUDIT_TRAIL 
WHERE OBJECT_OWNER = 'HR' AND OBJECT_NAME = 'EMPLOYEES' 
ORDER BY TIMESTAMP DESC;

-- 查询特定列的访问审计
SELECT TIMESTAMP, DB_USER, OS_USER, USERHOST, POLICY_NAME, SQL_TEXT 
FROM DBA_FGA_AUDIT_TRAIL 
WHERE POLICY_NAME = 'hr_emp_salary_audit' 
ORDER BY TIMESTAMP DESC;

4. 审计日志自动化分析

4.1 使用Shell脚本分析

创建一个自动分析审计日志的Shell脚本:

bash
#!/bin/bash

# Oracle审计日志分析脚本

# 环境变量设置
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH

echo "=== Oracle审计日志分析报告 ==="
echo "分析时间: $(date)"
echo ""

# 查询登录失败情况
echo "=== 登录失败统计 ==="
sqlplus -S / as sysdba << EOF
SET HEAD OFF FEEDBACK OFF
SELECT '登录失败次数: ' || COUNT(*) FROM UNIFIED_AUDIT_TRAIL WHERE ACTION_NAME = 'LOGON' AND RETURN_CODE != 0;
SELECT '失败用户: ' || DBUSERNAME || ', 次数: ' || COUNT(*) 
FROM UNIFIED_AUDIT_TRAIL 
WHERE ACTION_NAME = 'LOGON' AND RETURN_CODE != 0 
GROUP BY DBUSERNAME 
ORDER BY COUNT(*) DESC;
EOF

echo ""

# 查询特权用户活动
echo "=== 特权用户活动 ==="
sqlplus -S / as sysdba << EOF
SET HEAD OFF FEEDBACK OFF
SELECT 'SYS用户操作次数: ' || COUNT(*) FROM UNIFIED_AUDIT_TRAIL WHERE DBUSERNAME = 'SYS';
SELECT 'DBA角色使用次数: ' || COUNT(*) FROM UNIFIED_AUDIT_TRAIL WHERE ROLE_NAME = 'DBA';
EOF

echo ""

# 查询敏感表访问
echo "=== 敏感表访问 ==="
sqlplus -S / as sysdba << EOF
SET HEAD OFF FEEDBACK OFF
SELECT 'EMPLOYEES表访问次数: ' || COUNT(*) FROM UNIFIED_AUDIT_TRAIL WHERE OBJECT_NAME = 'EMPLOYEES';
SELECT 'SALARY列访问次数: ' || COUNT(*) FROM DBA_FGA_AUDIT_TRAIL WHERE POLICY_NAME = 'hr_emp_salary_audit';
EOF

echo ""

# 查询最近的10个审计事件
echo "=== 最近10个审计事件 ==="
sqlplus -S / as sysdba << EOF
SET LINESIZE 1000 PAGESIZE 10
COL EVENT_TIMESTAMP FORMAT A20
COL DBUSERNAME FORMAT A15
COL ACTION_NAME FORMAT A20
COL OBJECT_NAME FORMAT A20
SELECT EVENT_TIMESTAMP, DBUSERNAME, ACTION_NAME, OBJECT_NAME 
FROM UNIFIED_AUDIT_TRAIL 
ORDER BY EVENT_TIMESTAMP DESC 
FETCH FIRST 10 ROWS ONLY;
EOF

设置脚本执行权限并运行:

bash
chmod +x audit_log_analyzer.sh
./audit_log_analyzer.sh

4.2 使用ELK Stack分析

使用ELK Stack(Elasticsearch + Logstash + Kibana)实现审计日志的集中管理和分析:

  1. 配置Filebeat:收集审计日志文件
  2. 配置Logstash:解析审计日志内容,提取关键字段
  3. 配置Elasticsearch:存储解析后的日志数据
  4. 配置Kibana:创建可视化仪表盘,展示审计日志统计信息

审计日志管理

1. 审计日志存储管理

1.1 审计日志清理

sql
-- 清理标准审计日志
DELETE FROM AUD$ WHERE TIMESTAMP < SYSDATE - 30;
COMMIT;

-- 清理细粒度审计日志
DELETE FROM FGA_LOG$ WHERE TIMESTAMP < SYSDATE - 30;
COMMIT;

-- 清理统一审计日志
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
  AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  USE_LAST_ARCH_TIMESTAMP => TRUE
);

1.2 配置自动审计日志清理

sql
-- 配置审计日志清理作业
BEGIN
  -- 创建审计日志清理作业
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'AUDIT_LOG_CLEANUP_JOB',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN
                         DELETE FROM AUD$ WHERE TIMESTAMP < SYSDATE - 30;
                         DELETE FROM FGA_LOG$ WHERE TIMESTAMP < SYSDATE - 30;
                         COMMIT;
                         EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
                           AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
                           USE_LAST_ARCH_TIMESTAMP => TRUE
                         );
                       END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
    enabled         => TRUE,
    comments        => 'Daily audit log cleanup job'
  );
END;
/

2. 审计日志安全管理

  • 限制审计日志访问权限

    sql
    -- 授予审计日志查询权限
    GRANT SELECT ON DBA_AUDIT_TRAIL TO audit_admin;
    GRANT SELECT ON UNIFIED_AUDIT_TRAIL TO audit_admin;
    GRANT SELECT ON DBA_FGA_AUDIT_TRAIL TO audit_admin;
  • 加密审计日志

    sql
    -- 启用审计日志加密
    ALTER SYSTEM SET audit_trail = 'DB_ENCRYPT,EXTENDED' SCOPE = SPFILE;
  • 审计日志完整性保护

    sql
    -- 启用审计日志完整性检查
    EXEC DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY(
      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
      PROPERTY_NAME => DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE,
      PROPERTY_VALUE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE_SYNC
    );

19c与21c审计日志差异

特性19c21c
默认审计机制标准审计(AUDIT_TRAIL=DB)统一审计(默认启用)
审计性能一般优化,性能更好
审计粒度较粗更细,支持更灵活的审计策略
审计日志存储分散存储集中存储在UNIFIED_AUDIT_TRAIL视图
审计策略管理复杂简化,支持统一审计策略
安全特性基本安全审计增强的安全审计,支持更多安全事件
合规支持基本合规支持增强的合规支持,满足更多监管要求

差异处理策略

  1. 迁移到统一审计

    • 在21c中,建议迁移到统一审计,利用其更好的性能和更灵活的配置
    • 使用DBMS_AUDIT_MGMT.MIGRATE_TO_UNIFIED_AUDIT过程迁移现有审计配置
  2. 调整审计策略

    • 重新评估审计需求,调整审计策略以适应21c的新特性
    • 利用21c提供的预定义审计策略,简化审计配置
  3. 更新审计分析工具

    • 更新审计日志分析脚本,支持UNIFIED_AUDIT_TRAIL视图
    • 调整Logstash解析规则,适应统一审计日志格式
  4. 优化审计性能

    • 利用21c优化的审计性能,考虑增加审计覆盖范围
    • 配置合理的审计日志清理策略,避免性能影响

审计日志最佳实践

1. 审计策略设计

  • 基于风险评估:根据业务风险评估结果,确定需要审计的事件和对象
  • 分层审计
    • 基础审计:登录/登出、权限变更、系统级操作
    • 业务审计:敏感数据访问、核心业务操作
    • 合规审计:满足监管要求的特定审计
  • 最小权限原则:只审计必要的事件,避免过度审计影响性能
  • 定期回顾:定期回顾审计策略,根据业务变化调整审计范围

2. 性能优化

  • 合理配置审计级别:根据性能需求调整审计级别,避免过度审计
  • 使用统一审计:在12c及以后版本,优先使用统一审计,性能更好
  • 优化审计日志存储:将审计日志存放在高性能存储上,减少I/O瓶颈
  • 定期清理审计日志:配置自动清理策略,避免审计日志过大影响性能
  • 使用异步审计:在21c中,考虑使用异步审计功能,减少对业务的影响

3. 安全管理

  • 限制审计管理员权限:只授予必要的审计管理权限,避免权限滥用
  • 加密审计日志:对包含敏感信息的审计日志进行加密存储
  • 保护审计日志完整性:启用审计日志完整性检查,防止日志被篡改
  • 审计管理员操作:审计审计管理员的操作,确保审计系统本身的安全
  • 定期备份审计日志:定期备份审计日志,防止日志丢失

4. 审计日志分析

  • 实时监控:实时监控审计日志,及时发现异常情况
  • 定期分析:定期分析审计日志,识别潜在的安全风险
  • 建立基线:建立正常审计日志的基线,便于识别异常变化
  • 关联分析:结合告警日志和性能数据,进行关联分析
  • 自动化分析:使用自动化工具进行审计日志分析,提高效率

5. 合规管理

  • 满足监管要求:根据行业监管要求,配置相应的审计策略
  • 保留审计日志:根据合规要求,设置合理的审计日志保留时间
  • 生成审计报告:定期生成审计报告,用于合规审计
  • 审计日志归档:将审计日志归档到长期存储,满足合规要求

常见问题(FAQ)

1. 如何选择合适的审计机制?

问题:在Oracle数据库中,有多种审计机制,如何选择合适的审计机制?

解决方案

  • 对于Oracle 12c及以后版本,建议使用统一审计,性能更好,配置更灵活
  • 对于旧版本Oracle数据库,使用标准审计
  • 对于需要细粒度控制的场景,使用细粒度审计(FGA)
  • 考虑性能需求,统一审计的性能优于标准审计

2. 审计日志过多怎么办?

问题:审计日志增长过快,占用大量磁盘空间,影响数据库性能怎么办?

解决方案

  • 重新评估审计策略,减少不必要的审计事件
  • 调整审计级别,降低审计粒度
  • 配置自动审计日志清理策略,定期清理过期日志
  • 考虑使用审计日志归档,将旧日志移至长期存储
  • 优化审计日志存储,使用高性能存储减少I/O影响

3. 如何监控审计日志中的异常情况?

问题:如何从大量审计日志中识别异常情况,如暴力破解、权限滥用等?

解决方案

  • 实时监控登录失败事件,识别暴力破解尝试
  • 监控特权用户的异常活动
  • 监控敏感数据的异常访问模式
  • 使用自动化工具进行异常检测,如ELK Stack的异常检测功能
  • 建立审计日志基线,识别偏离基线的异常事件

4. 如何确保审计日志的安全性和完整性?

问题:如何防止审计日志被篡改,确保审计日志的安全性和完整性?

解决方案

  • 启用审计日志加密,保护审计日志内容
  • 配置审计日志完整性检查,防止日志被篡改
  • 限制审计日志的访问权限,只允许授权用户访问
  • 审计审计管理员的操作,确保审计系统本身的安全
  • 定期备份审计日志,防止日志丢失
  • 使用文件完整性监控工具,监控审计日志文件的变化

5. 如何迁移到统一审计?

问题:如何从标准审计迁移到统一审计,确保审计的连续性?

解决方案

  • 使用DBMS_AUDIT_MGMT.MIGRATE_TO_UNIFIED_AUDIT过程迁移现有审计配置
  • 测试迁移后的审计功能,确保审计正常工作
  • 并行运行一段时间的标准审计和统一审计,确保审计覆盖完整
  • 逐步关闭标准审计,完全切换到统一审计
  • 更新审计日志分析工具,支持统一审计日志

6. 如何处理审计日志中的敏感信息?

问题:审计日志中包含敏感信息,如密码、个人数据等,如何处理?

解决方案

  • 配置审计日志不记录敏感信息,如使用AUDIT ... EXCEPT子句
  • 启用审计日志加密,保护敏感信息
  • 限制访问审计日志的用户,只允许授权用户访问
  • 对审计日志进行脱敏处理,去除敏感信息
  • 配置合理的审计日志保留时间,及时清理包含敏感信息的日志

总结

Oracle审计日志是数据库安全管理的重要组成部分,通过合理配置和分析审计日志,可以实现安全审计、故障诊断、权限管理和数据保护。

在实际运维中,应该:

  • 根据Oracle版本选择合适的审计机制,优先使用统一审计
  • 设计合理的审计策略,基于风险评估确定审计范围
  • 优化审计性能,避免过度审计影响数据库性能
  • 加强审计日志的安全管理,确保日志的安全性和完整性
  • 建立完善的审计日志分析机制,及时发现异常情况
  • 满足合规要求,定期生成审计报告,归档审计日志

通过遵循最佳实践,可以建立一个高效、可靠的审计日志管理体系,确保数据库的安全稳定运行,满足合规要求。