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
Di default non è abilitata:
SQL> select * from V$OPTION
where parameter='Unified Auditing';
Il comando make è usato per collegare l'eseguibile oracle con un nuovo set di librerie necessarie
I record unified audit-trail sono visibili nella vista UNIFIED_AUDIT_TRAIL e sono raccolti in tabelle dello schema AUDSYS nel tablespace Sysaux.
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 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';
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
# lsnrctl start
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)
----------------------------------------
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
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;
# 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.
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;
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;
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;
Accedere ad sqlplus ad esempio come utente robin
SQL>select * from tower;
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
# lsnrctl stop
# cd $ORACLE_HOME/rdbms/lib
# make -f ins_rdbms.mk uniaud_off ioracle ORACLE_HOME=$ORACLE_HOME
SQL> startup;
SQL> startup;
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;
/
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;
/
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)
----------------------------------------