Unified Auditing

Questa feature è stata introdotta nella versione 12c in aggiunta al classico audit che memorizza le informazioni nelle tabelle SYS.AUD$. 
Fornisce una interfaccia standard e una singola location per gli audit trail.
Di default non è abilitata:

SQL> select * from V$OPTION 
     where parameter='Unified Auditing';

PARAMETER      VALUE CON_ID
-------------------------------------------------
Unified Auditing      FALSE 0

Abilitare Unified Auditing
Effettuare lo stop del db e del listener ed eseguire il comando:

SQL> shutdown immdiate;
# lsnrctl stop
# cd $ORACLE_HOME/rdbms/lib
# make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
# lsnrctl start
SQL> startup;

Il comando make è usato per collegare l'eseguibile oracle con un nuovo set di librerie necessarie

Quando Unified Auditing è abilitato i seguenti parametri di inizializzazione sono ignorati:
AUDIT_TRAIL
AUDIT_FILE_DEST
AUDIT_SYS_OPERATIONS
AUDIT_SYSLOG_LEVEL.

Invece l'audit Fine-grained può utilizzare ancora il package DBMS_FGA.

I record unified audit-trail sono visibili nella vista UNIFIED_AUDIT_TRAIL e sono raccolti in tabelle dello schema AUDSYS nel tablespace Sysaux.

I privilegi di sistema sono estratti dalla seguente query:

SQL> select * from system_privilege_map
     where name like '%SESSION%';


Vediamo qualche esempio:
Accediamo ad un Pluggable database.

--> Creare un audit di privilegi di "alter session" e "select any table"

SQL> CREATE AUDIT POLICY syspriv_001
           PRIVILEGES select any table, alter session;
SQL> AUDIT POLICY audit_tower;

La policy ORA_SECURECONFIG è abilitata di default e contiene gli stessi audit della versione 11g.

---> Creare una policy che monitora le azioni, ad esempio l' istruzione insert in una tabella.

SQL> CREATE AUDIT POLICY audit_tower_1
           ACTIONS  select ,insert ON robin.tower;
SQL> AUDIT POLICY  syspriv_001;

La seguente tabella contiene le istruzioni che si possono monitorare.
select * from AUDITABLE_SYSTEM_ACTIONS;

Per visualizzare le policy create.

SQL> SELECT policy_name, audit_option, audit_option_type,                 audit_condition , condition_eval_opt
    FROM audit_unified_policies
    WHERE policy_name ='AUDIT_TOWER';



Per visualizzare le policy abilitate.

SQL> SELECT user_name, policy_name, enabled_opt, success, failure
     FROM audit_unified_enabled_policies;


Per visualizzare il risultato dell' audit.
Accedere ad sqlplus ad esempio come utente robin
SQL>select * from tower;

SQL> select unified_audit_policies, dbusername,event_timestamp,sql_text,action_name, object_name, client_program_name
from unified_audit_trail
where upper(sql_text) like '%SELECT%'
order by event_timestamp desc;



Cancellare una policy

SQL> noaudit policy audit_tower;
SQL> drop audit policy audit_tower;


Flush audit 

Le prestazioni del db peggiorano quando è abilitata l'audit tradizionale perché il database scrive sulle tabelle di AUD$ e FGA_LOG$.
Invece se si abilita "unified auditing" i record sono salvati in memoria nelle SGA queues e poi riscritte sulle tabelle AUDSYS dal processo di background GEN0 quando le queue sono piene.
Lavorando in memoria c'è il problema che i record di audit si potrebbero perdere se c'è un crash del db.
Se si vuole effettuare il flush della sga e scrivere sul disco usare la procedura seguente.

SQL> EXEC SYS.DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL;
Se si volesse scrivere direttamente sul disco senza passare per la sga, usare la procedura
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY.....


Disabilitare Unified Auditing

SQL> shutdown immdiate;
# lsnrctl stop
# cd $ORACLE_HOME/rdbms/lib
# make -f ins_rdbms.mk uniaud_off ioracle ORACLE_HOME=$ORACLE_HOME
SQL> startup;
# lsnrctl start


Cancellare record audit

La cancellazione dei record di audit non avviene cancellando i record dalla tabella  "unified_audit_trail" con una istruzione delete ma occorre usare il package dbms_audit_mgmt.clean_audit_trail.

BEGIN
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type      =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
use_last_arch_timestamp  =>  FALSE);
END;
/

E' possibile anche creare un JOB di cancellazione degli audit che conserva un intervallo di tempo di archiviazione degli audit.
Supponiamo di avere i seguenti log:

select count(*) , trunc(event_timestamp)
from unified_audit_trail
group by trunc(event_timestamp)
order by  trunc(event_timestamp) desc;

count(*)  trunc(event_timestamp)
----------------------------------------
5              06-feb-20
1              05-feb-20
6              04-feb-20
4              03-feb-20


begin
 dbms_audit_mgmt.set_last_archive_timestamp(
 audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_UNIFIED,
 last_archive_time => systimestamp-7);
end;
/

begin
 dbms_audit_mgmt.create_purge_job(
 audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_UNIFIED,
 audit_trail_purge_interval => 24 /*ore*/,
 audit_trail_purge_name => 'PULIZIA_AUDIT1',
 use_last_arch_timestamp => true,
 CONTAINER  => DBMS_AUDIT_MGMT.CONTAINER_CURRENT);
end;
/

Di seguito un job di aggiornamento automatico dell'intervallo di archiviazione.

begin
dbms_scheduler.create_job (
job_name => 'SET_DATA_ARCHIV_AUDIT',
job_type => 'PLSQL_BLOCK',
job_action =>
'BEGIN                   
dbms_audit_mgmt.init_cleanup(                             
            AUDIT_TRAIL_TYPE         => dbms_audit_mgmt.audit_trail_aud_std,                             
            DEFAULT_CLEANUP_INTERVAL => 1);
DBMS_AUDIT_MGMT.set_last_archive_timestamp(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
last_archive_time => SYSTIMESTAMP-6);
dbms_audit_mgmt.deinit_cleanup(                            
            AUDIT_TRAIL_TYPE => dbms_audit_mgmt.audit_trail_aud_std);                      
      END;', 
start_date => systimestamp,
repeat_interval => 'FREQ=WEEKLY;BYDAY=SUN; byhour=20;byminute=0;bysecond=0', 
end_date => null,
enabled => true,
comments => 'Job per aggiornare in automatico audit trail time');
end;
/

-- Query verifica il timestamp  archiviato
select * from DBA_AUDIT_MGMT_LAST_ARCH_TS;

-- Query di verifca del purge job creato
select * from DBA_AUDIT_MGMT_CLEANUP_JOBS;

-- Query di verifica di esecuzione del job
SELECT start_Date,last_start_date, next_run_date, job_action
FROM   dba_scheduler_jobs
WHERE  job_name ='PULIZIA_AUDIT1';

-- Query esito del job
select *
from dba_scheduler_job_run_details
where job_name in ( 'PULIZIA_AUDIT1')
order by 1 desc;


-- modificare l'intervallo di tempo di esecuzione del job
BEGIN
 DBMS_AUDIT_MGMT.SET_PURGE_JOB_INTERVAL(
  AUDIT_TRAIL_PURGE_NAME       => 'PULIZIA_AUDIT1',
  AUDIT_TRAIL_INTERVAL_VALUE   => 24);
END;
/

-- cancellare il job di purge
BEGIN
 DBMS_AUDIT_MGMT.DROP_PURGE_JOB(
  AUDIT_TRAIL_PURGE_NAME  => 'PULIZIA_AUDIT1');
END;
/

Se viene imposto come  tempo di archiviazione "systimestamp-2" nell'esempio in questione essendo sysdtae=06 febbraio, dopo l'esecuzione del job vengono cancellati tutti i record dal 04 febbraio indietro.
count(*)  trunc(event_timestamp)
----------------------------------------
5              06-feb-20
1              05-feb-20

Impostando tempo di archiviazione "systimestamp-1" venogno cancellati tutti i records dal 05 febbraio indietro.
count(*)  trunc(event_timestamp)
----------------------------------------
5              06-feb-20

Impostando sysdate vengono cancellati tutti i record dal 06 febbraio.
count(*)  trunc(event_timestamp)
----------------------------------------


Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database