Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database

- Πώς μπορούμε να αυξήσουμε την απόδοση στο target Replicat του Oracle GoldenGate με παραλληλία - 19 Μάρτιος 2025
- Πώς φτιάχνουμε χρήστες σε βάσεις δεδομένων που ανήκουν σε Always On Availability Group του SQL Server - 10 Φεβρουάριος 2025
- Πώς φτιάχνουμε Logon Trigger για να ελέγχουμε τους χρήστες που επιτρέπουμε να συνδεθούν σε Oracle Database - 13 Ιανουάριος 2025
Σε προηγούμενο άρθρο είχαμε δει πως ενεργοποιούμε το Auditing σε Oracle Database, σε αυτό το άρθρο θα δούμε πως ενεργοποιούμε το Unified Auditing που μας επιτρέπει να βάζουμε φίλτρα και να ώστε να μπορούμε καταγράφουμε.
Σε αντίθεση με το κλασικό Auditing μπορούμε αν θέλουμε να εξαιρέσουμε μηχανήματα που δεν θέλουμε να καταγράφονται είτε άνα SESSION
είτε άνα STATEMENT
και ενεργοποιώντας το να επιλέξουμε αν θα μόνο όσα έχουν επιτύχει στην εκτέλεση τους ή όχι (WHENEVER SUCCESSFUL
). Αντίστοιχα μπορούμε να επιλέξουμε να καταγράφουμε μόνο συγκεκριμένους χρήστες ή συγκεκριμένα μόνο μηχανήματα για το policy αυτό. Επίσης μπορούμε να επιλέξουμε αν καταγράφει όλα τα statements ή ONLY TOPLEVEL
όπως μια procedure.
Πώς ενεργοποιείται
Πρώτα θα χρειαστεί να σταματήσει η βάση δεδομένων και με την παρακάτω εντολή να ενεργοποιηθεί το Unified Auditing:
sqlplus / as sysdba; shutdown immediate; exit; cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle sqlplus / as sysdba; startup;
Στην περίπτωση που θέλουμε να καταγράφουμε και τις ενέργειες με τον administrator χρήστη SYS
θα πρέπει να αλλάξουμε την παρακάτω παράμετρο και να κάνουμε restart:
sqlplus / as sysdba; ALTER SYSTEM SET AUDIT_SYS_OPERATIONS=TRUE SCOPE=SPFILE; shutdown immediate; startup;
Στη συνέχεια καθαρίζουμε to Unified Audit Trail με την παρακάτω εντολή:
begin dbms_audit_mgmt.flush_unified_audit_trail( flush_type => dbms_audit_mgmt.flush_current_instance, container => dbms_audit_mgmt.container_all); end; /
Πώς αποθηκεύουμαι τα audit trail files σε ξεχωριστό tablespace
Αν θέλουμε να κάνουμε χρήση διαφορετικού tablespace με άλλα datafiles τρέχουμε την παρακάτω εντολή:
create tablespace AUDIT_TS datafile '/oracle/oradata/orcl/audit_ts_001.dbf' size 10m autoextend on next 64m maxsize 32767m; BEGIN DBMS_AUDIT_MGMT.set_audit_trail_location(audit_trail_type=>DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, audit_trail_location_value => 'AUDIT_TS'); END; /
Πώς συντηρούμε το Unified Auditing
Αν θέλουμε να φτιαχτεί ένα job που θα σβήνει τις εγγραφές άνω των 30 ημερών αυτόματα, τρέχουμε το παρακάτω:
BEGIN DBMS_SCHEDULER.create_job ( job_name => 'JOB_PURGE_AUDIT_RECORDS', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, TRUNC(SYSTIMESTAMP)-30); 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=0; byminute=0; bysecond=0;', end_date => NULL, enabled => TRUE, comments => 'Update last_archive_timestamp'); END; /
Πώς φτιάχνουμε Unified Audit Policies
Δημιουργία Select Policy
Με το παρακάτω κώδικα μπορούμε να φτιάξουμε ένα policy που θα καταγράφει τα πετυχημένα select statements σε δύο πίνακες που δεν προέρχονται από δύο συγκεκριμένα μηχανήματα:
CREATE AUDIT POLICY stratos_selects ACTIONS SELECT ON stratos.customers, SELECT ON stratos.products WHEN 'SYS_CONTEXT(''USERENV'', ''HOST'') NOT IN (''oracledev1'', ''oracledev2'')' EVALUATE PER SESSION; audit policy stratos_selects WHENEVER SUCCESSFUL; --noaudit policy stratos_selects ; --drop audit policy stratos_selects ;
Δημιουργία Login Monitoring Policy
Με τον παρακάτω κώδικα μπορούμε να φτιάξουμε ένα policy που θα καταγράφει τα πετυχημένα connections με δύο χρήστες που δεν προέρχονται από δύο συγκεκριμένα μηχανήματα:
CREATE AUDIT POLICY monitor_connects ACTIONS LOGON WHEN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') IN (''STRATOS'', ''HR'') and SYS_CONTEXT(''USERENV'', ''HOST'') NOT IN (''oracledev1'', ''oracledev2'')' EVALUATE PER SESSION; audit policy monitor_connects WHENEVER SUCCESSFUL; --noaudit policy monitor_connects; --drop audit policy monitor_connects;
Δημιουργία DDL / DML Policy
Με τον παρακάτω κώδικα μπορούμε να φτιάξουμε ένα policy που θα καταγράφει τα πετυχημένα DDL και DML actions που δεν προέρχονται από δύο συγκεκριμένα μηχανήματα:
CREATE AUDIT POLICY stratos_changes ACTIONS TRUNCATE TABLE, DROP TABLE, ALTER TABLE, DROP VIEW, ALTER VIEW, INSERT ON stratos.customers, UPDATE ON stratos.customers, DELETE ON stratos.customers, INSERT ON stratos.products, UPDATE ON stratos.products, DELETE ON stratos.products WHEN 'SYS_CONTEXT(''USERENV'', ''HOST'') NOT IN (''oracledev1'', ''oracledev2'')' WHENEVER SUCCESSFUL; EVALUATE PER SESSION; audit policy stratos_changes WHENEVER SUCCESSFUL; --noaudit policy stratos_changes; --drop audit policy stratos_changes;
Αν θέλουμε να προστέσουμε ή να αφαιρέσουμε μια επιλογή από την καταγραφή μπορούμε με το παρακάτω:
ALTER AUDIT POLICY stratos_changes ADD ACTIONS DELETE ON stratos.logging DROP ACTIONS DELETE ON stratos.housekeeping;
Πώς βλέπουμε τα Unified Audit Policies που υπάρχουν
Με το παρακάτω query μπορούμε να δούμε τα Unified Audit Policies που έχουμε φτιάξει με τις παραμέτρους που έχουμε βάλει:
SELECT * FROM AUDIT_UNIFIED_POLICIES --where policy_name='STRATOS_CHANGES' ;

Για να δούμε ποια policies είναι ενεργά τρέχουμε το παρακάτω query:
SELECT * FROM AUDIT_UNIFIED_ENABLED_POLICIES;

Από default είναι ενεργοποιημένα τα δύο standard policies που μπορούμε να τα απενεργοποιήσουμε με τα παρακάτω:
noaudit policy ORA_SECURECONFIG; noaudit policy ORA_LOGON_FAILURES;
Πώς βλέπουμε τις πληροφορίες από τα Unified Audit Policies
Για να δούμε τις πληροφορίες που έχει καταγράψει το Auditing με το όνομα του μηχανήματος, του OS χρήστη, του χρήστη της βάσης δεδομένων, του προγράμματος και το statement ακριβώς που έτρεξε τρέχουμε το παρακάτω:
SELECT event_timestamp ,OS_USERNAME ,USERHOST ,DBUSERNAME ,client_program_name ,action_name ,object_schema ,object_name ,sql_text ,sql_binds ,unified_audit_policies FROM UNIFIED_AUDIT_TRAIL WHERE unified_audit_policies is not null and UNIFIED_AUDIT_POLICIES not in ('ORA_SECURECONFIG','ORA_LOGON_FAILURES') ORDER BY EVENT_TIMESTAMP DESC;

Τρέχοντας το παρακάτω query μπορούμε να δούμε άνα policy και άνα action πόσες εγγραφές έχουν καταγραφεί:
select audit_type,unified_audit_policies,action_name,return_code,count(*) from unified_audit_trail where event_timestamp>sysdate-1 group by audit_type,unified_audit_policies,action_name,return_code order by count(*);

Για να δούμε το configuration του Unified Audit Trail τρέχουμε το παρακάτω:
select * from DBA_AUDIT_MGMT_CONFIG_PARAMS where AUDIT_TRAIL='UNIFIED AUDIT TRAIL';

Τέλος με το παρακάτω query μπορούμε να δούμε τον χώρο που καταλαμβάνει το Auditing:
select occupant_name,schema_name,occupant_desc,space_usage_kbytes from v$sysaux_occupants where occupant_name like 'AUD%';
