Here’s a comprehensive guide to resolve your audit coverage gaps:
Understanding the Issue:
Unified Auditing uses a completely different architecture from traditional auditing. Default policies focus on security events (failed logins, privilege grants, system configuration changes) but don’t capture application-level activity. You must explicitly create and enable custom policies for application auditing.
Step 1: Unified Auditing Policy Setup for DDL
Create a policy to capture DDL operations:
CREATE AUDIT POLICY app_ddl_audit
ACTIONS CREATE TABLE, ALTER TABLE, DROP TABLE,
CREATE INDEX, DROP INDEX, CREATE VIEW
WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') NOT IN (''SYS'',''SYSTEM'')'
EVALUATE PER SESSION;
Enable it:
AUDIT POLICY app_ddl_audit;
Step 2: Custom Audit Policy for Sensitive Data Access
Create policy for SELECT on specific tables:
CREATE AUDIT POLICY sensitive_data_access
ACTIONS SELECT ON hr.employees,
SELECT ON finance.salary_data,
SELECT ON customers.credit_cards;
Enable it:
AUDIT POLICY sensitive_data_access;
Step 3: Failed Login Auditing
Create policy for authentication failures:
CREATE AUDIT POLICY failed_login_audit
ACTIONS LOGON
WHEN 'SYS_CONTEXT(''USERENV'',''SESSIONID'') = 0'
EVALUATE PER SESSION;
Enable it:
AUDIT POLICY failed_login_audit;
Step 4: DBMS_AUDIT_MGMT Usage for Retention
Initialize audit trail management:
BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
default_cleanup_interval => 168);
END;
/
Set retention period (365 days for 1-year compliance):
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
last_archive_time => SYSTIMESTAMP - INTERVAL '365' DAY);
END;
/
Create purge job:
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
audit_trail_purge_interval => 168,
audit_trail_purge_name => 'UNIFIED_AUDIT_PURGE_JOB',
use_last_arch_timestamp => TRUE);
END;
/
Step 5: Verify Policy Coverage
Check enabled policies:
SELECT policy_name, enabled_option, user_name
FROM audit_unified_enabled_policies
ORDER BY policy_name;
Test audit capture:
-- Perform test DDL
CREATE TABLE test_audit_table (id NUMBER);
-- Query audit trail
SELECT event_timestamp, dbusername, action_name,
object_schema, object_name, sql_text
FROM unified_audit_trail
WHERE object_name = 'TEST_AUDIT_TABLE'
ORDER BY event_timestamp DESC;
Step 6: Custom Audit Policy Creation Best Practices
- Use WHEN clauses to filter by user, IP, or time to reduce volume
- Use EVALUATE PER SESSION instead of PER STATEMENT for frequent operations
- Combine related actions in single policies rather than creating many small policies
- Exclude system users (SYS, SYSTEM) from application auditing
- Use object-specific policies rather than schema-wide when possible
Additional Policies for Complete Coverage:
Privilege usage auditing:
CREATE AUDIT POLICY privilege_usage_audit
ACTIONS EXECUTE ON DBMS_RLS, EXECUTE ON DBMS_CRYPTO
WHEN 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') NOT IN (''SYS'')';
AUDIT POLICY privilege_usage_audit;
Data modification auditing:
CREATE AUDIT POLICY data_modification_audit
ACTIONS INSERT ON sensitive_schema.*,
UPDATE ON sensitive_schema.*,
DELETE ON sensitive_schema.*;
AUDIT POLICY data_modification_audit;
Monitoring and Maintenance:
- Review audit trail size weekly: `SELECT * FROM dba_audit_mgmt_config_params;
- Monitor purge job execution: `SELECT * FROM dba_scheduler_job_run_details WHERE job_name = ‘UNIFIED_AUDIT_PURGE_JOB’;
- Export audit data before purging for long-term archive if needed
- Review and adjust policies quarterly based on actual compliance needs
Performance Considerations:
- Unified Auditing has less overhead than traditional auditing
- Expect 2-5% performance impact with comprehensive auditing
- Use EVALUATE PER SESSION for high-frequency operations
- Regularly purge old records to prevent AUDSYS tablespace growth
This solution comprehensively addresses all three focus areas: proper Unified Auditing policy setup with custom policies for application-specific requirements, effective use of DBMS_AUDIT_MGMT for retention and purge management, and custom audit policy creation following best practices for granular, efficient auditing. Your compliance risk should be fully mitigated once these policies are in place and actively capturing the required user activity.