Auditing in Oracle

L'RDBMS Oracle fornisce diverse funzioni di controllo della sicurezza del sistema. Tra queste e' anche presente una funzione di AUDIT TRAIL che consente di registrare ogni attivita' di interesse svolta sul database. Questo documento ne descrive le diverse modalita'.

Le possibilita' di controllo sono molto sofisticate e flessibili, ma e' necessario evitare un controllo eccessivo per non rendere inutilmente pesante gli accessi ed impossibili le verifiche.

Le funzionalita' di auditing sono presenti in modo molto completo fino dalle prime releases di Oracle e sono state sempre aggiornate mantenendole in linea alle piu' stringenti normative e standard.

I primi capitoli riportano la configurazione generale ed un esempio di report sugli accessi. Nell'ultimo capitolo sono riportate le funzionalita' piu' recenti.

Controlli effettuabili

E' possibile attivare controlli rivolti a:

Possono essere controllate le azioni che hanno restituito errore e/o quelle eseguite con successo.

I record di audit possono riferirsi ad ogni singola azione o essere raggruppate in un solo record per sessione.

L'attivazione del servizio deve essere effettuata dall'amministratore del sistema.

Risultato dell'auditing

Ogni azione sotto controllo, quando viene eseguita, genera uno o piu' record nella tabella del dizionario dati SYS.AUD$. Interrogando questa tabella, direttamente o tramite apposite viste, si ottiene un report con diverse informazioni sulle azioni sotto controllo eseguite nell'RDBMS, in particolare:

La tabella in realta' contiene un numero molto elevato di colonne con un elevato grado di dettaglio.

Attivazione del servizio di auditing

Per attivare i servizi di auditing:

Ora l'auditing e' attivo. I record di audit verranno posti nella tabella SYS.AUD$ (che contiene un enormita' di colonne). E' opportuno monitorare solo i dati di interesse. In caso contrario l'auditing si trasforma in un DOS (Denial Of Service)! E' inoltre necessario generare i report di sicurezza e pulire periodicamente la tabella.

Per ripulire completamente la tabella e' necessario utilizzare il comando di truncate. E' una dei pochissimi casi in cui si puo' agire sulle tabelle di SYS.

L'utilizzo dell'auditing non e' riservato all'amministratore, anche se questo e' la condizione piu' diffusa. Anche gli utenti proprietari di tabelle possono attivare controlli sui propri oggetti.

Attivazione dei controlli

Un insieme minimale di controlli puo' essere attivato con le istruzioni SQL (da utente DBA):

AUDIT SESSION WHENEVER NOT SUCCESSFUL;
rem AUDIT SESSION BY ACCESS;
AUDIT DBA;
AUDIT INSERT, UPDATE, DELETE ON sys.aud$ BY ACCESS;

Con tali definizioni si controllano gli accessi al DB (negativi o entrambe scommentando il comando) e la tabella di auditing stessa.

Per attivare controlli su tabelle utente specifiche l'attivazione e' la seguente:

 
AUDIT INSERT, UPDATE, DELETE ON utente.tabella BY ACCESS;

Esempio di utilizzo

Nel seguito e' riportato uno script di esempio. Lo script e' utilizzabile da cron Unix. Lo script genera come risultato una stampa.

La prima parte del report specifica quali privilegi, statement e oggetti sono sotto controllo dalla funzione di AUDIT TRAIL. Specifica se il controllo e' attivo su un particolare utente o su tutti, sulle azioni che hanno successo o su quelle che restituiscono errore.

La seconda parte del report evidenzia i risultati del controllo effettuato sul database nell'ultima settimana: i tentativi di connessione che non sono andati a buon fine, le azioni che per essere compiute richiedono il ruolo DBA, le azioni svolte su tabelle di importanza particolare, tra cui la tabella SYS.AUD$ stessa.

File di cron

# Auditing database Oracle
0 2 * * 0 /usr/oracle/amm/audit_db.sh > /dev/null 2>&1

Shell script

# File: audit_db.sh
# Data: 21 novembre 1996
#
# Descrizione:
# Report di auditing DB di esempio

ORACLE_HOME=/usr/oracle
ORACLE_SID=sample
PATH=$PATH:$ORACLE_HOME/bin
LOGFILE=$ORACLE_HOME/amm/audit_db.lst

export ORACLE_HOME ORACLE_SID

echo "MACCHINA : \c" > $LOGFILE
uname -n >> $LOGFILE

echo "ISTANZA : " $ORACLE_SID >>  $LOGFILE
sqlplus -s / @$ORACLE_HOME/amm/audit >>  $LOGFILE

lp $LOGFILE

SQL script

REM File: audit.sql
REM Data: 17 novembre 1996
REM
REM Descrizione:
REM SQL script di auditing DB

set tab off
set space 1
set linesize 80
set pagesize 9999
set feedback off
ttitle off
set newpage 2
set heading off
spool audit
 
select to_char(sysdate,'DD-MON-YYYY HH24:MI') ||
  '   Oracle RDBMS SECURITY AUDITING'
from dual;

select 'Oracle Instance: ', substr(value,1,20)
from sys.v$parameter     
where name ='db_name';

select 'ACTIVE OPTIONS' from dual;
set newpage 1
select 'System Parameters' from dual;
set heading on
select substr(name,1,20) Param, substr(value,1,55) Val
from v$parameter
where upper(name) like '%AUDIT%';

set heading off
set newpage 2
select 'Privileges' from dual;
set newpage 1
select substr(nvl(user_name,'*'),1,10) username,
       substr(privilege,1,25) privilege,
       success,failure
from sys.dba_priv_audit_opts;

set newpage 2
set heading off
select 'Statements' from dual;
set newpage 1
set heading on

select substr(nvl(user_name,'*'),1,10) username,
       substr(audit_option,1,25) statement,
       success,failure
from sys.dba_stmt_audit_opts;

set newpage 2
set heading off
select 'Objects' from dual;
set newpage 1
set heading on
set linesize 100
column object_type format A11

select substr(owner,1,10) owner,
       substr(object_name,1,13) object,object_type,
       alt,aud,com,del,gra,ind,ins,loc,ren,sel,upd,ref,exe
  from sys.dba_obj_audit_opts 
 where alt != '-/-' 
    or aud != '-/-'
    or com != '-/-'
    or del != '-/-'
    or gra != '-/-'
    or ind != '-/-'
    or ins != '-/-'
    or loc != '-/-'
    or ren != '-/-'
    or sel != '-/-'
    or upd != '-/-'
    or ref != '-/-'
    or exe != '-/-'
order by object_name;

column time_stamp heading TIMESTAMP

set newpage 2
set heading off
select 'AUDITING LOG' from dual;
select 'Connections' from dual;
set newpage 1
set heading on
set linesize 120

select substr(username,1,10) username,
       substr(to_char(timestamp,'YYYY-MON-DD HH24:MI:SS'),1,20) login_time,
       substr(to_char(LOGOFF_TIME,'YYYY-MON-DD HH24:MI:SS'),1,20) logout_time,
       substr(action_name,1,10) statement,substr(os_username,1,13) os_username,
       sessionid,
       substr(returncode||decode(returncode,
          '1004','-Connessione errata',
          '1005','-Password nulla',
          '1017','-Password errata',
          '1045','-Privilegi insufficienti',
          ''),1,20) returncode
from   sys.dba_audit_session
where  timestamp > sysdate-7
order  by timestamp;

set newpage 2
set heading off
select 'Statements' from dual;
set newpage 1
set heading on

select substr(username,1,10) username,
       substr(to_char(timestamp,'YYYY-MON-DD HH24:MI:SS'),1,20) time_stamp,
       substr(action_name,1,10) statement,substr(obj_name,1,13) object,
       substr(grantee,1,10) grantee,
       sessionid,
       substr(returncode||decode(returncode,
          '1031','-Privilegi insufficienti',
          '1917','-Utente inesistente',
          '1951','-Ruolo non presente',
          ''),1,20) returncode
from   sys.dba_audit_statement
where  timestamp > sysdate-7
order  by timestamp;

set newpage 2
set heading off
select 'Objects' from dual;
set newpage 1
set heading on

select substr(username,1,10) username,
       substr(to_char(timestamp,'YYYY-MON-DD HH24:MI:SS'),1,20) time_stamp,
       substr(action_name,1,10) statement,
       substr(obj_name,1,13) object,substr(owner,1,10) owner,
       sessionid,
       substr(returncode||decode(returncode,
           '904','-Nome colonna non valido',
           '922','-Opzione non valida',
           '955','-Oggetto esistente',
           '988','-Password non valida',
          '1935','-Manca il nome utente',
          '2004','-Violazione sicurezza',
          '2157','-Opzione non specificata',
          '2220','-MINEXTENTS non valido',
          ''),1,20) returncode
from   sys.dba_audit_object
where  timestamp > sysdate-7
order  by timestamp;

REM delete from sys.aud$ where timestamp <= sysdate-63;
REM commit;
quit

Risultato

MACCHINA : sunset ISTANZA : sample 02-FEB-97 AUDITING DATABASE ORACLE V.1.0 OPZIONI ATTIVE Privilegi USERNAME PRIVILEGE SUCCESS FAILURE ---------- ------------------------- ---------- ---------- * AUDIT SYSTEM BY ACCESS BY ACCESS * CREATE SESSION NOT SET BY ACCESS Statement USERNAME STATEMENT SUCCESS FAILURE ---------- ------------------------- ---------- ---------- * CREATE SESSION NOT SET BY ACCESS * SYSTEM AUDIT BY ACCESS BY ACCESS * USER BY ACCESS BY ACCESS * PUBLIC SYNONYM BY ACCESS BY ACCESS * PUBLIC DATABASE LINK BY ACCESS BY ACCESS * ROLE BY ACCESS BY ACCESS * SYSTEM GRANT BY ACCESS BY ACCESS * TABLE BY ACCESS BY ACCESS Oggetti OWNER OBJECT OBJECT_TYPE ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE ---------- ----------- ----------- --- --- --- --- --- --- --- --- --- --- --- --- --- SYS AUD$ TABLE -/- -/- -/- A/A -/- -/- A/A -/- -/- -/- A/A -/- -/- AUDITING LOG Connessioni USERNAME TIMESTAMP STATEMENT OS_USERNAME RETURNCODE ---------- -------------------- ----------------- ------------- --------------------- SCOTT 1997-JAN-27 08:11:31 LOGON OraUser 1017-Password errata SCOTT 1997-JAN-27 08:26:27 LOGON OraUser 1017-Password errata Statement ... Oggetti ...

In realta' lo script originale in italiano e' stato poi aggiornato... ma la sostanza non cambia!

Aggiornamento

Questo documento era basato sulle funzionalita' dell'auditing presenti nella versione 7 di Oracle... In vent'anni c'e' stata qualche evoluzione ed era necessario un aggiornamento! In realta' i concetti e le funzionalita' di base non sono cambiati mentre sono stati aggiornati ed estesi notevolmente i tipi di output ottenibili, gli oggetti controllabili e le integrazioni con tool esterni.

Le impostazioni di default ed i controlli standard verificano in modo automatico la consistenza dell'auditing e le eventuali modifiche alla configurazione. Se una base dati viene installata manualmente e' necessario lanciare lo script da sqlplus @$ORACLE_HOME/rdbms/admin/secconf.sql
Oltre che sulle tabelle AUD$ e' possibile indirizzare l'auditing su file del sistema operativo, eventualmente in formato XML, oppure sul syslog. Quest'ultima e' la modalita' consigliata sopratutto per una gestione centralizzata dei log dei sistemi e dei database.

Dalla versione 11gR1 l'auditing e' impostato per default.
Dalla versione 11gR2 e' disponibile un package per la gestione automatica dell'auditing (eg. purge periodico):

 
BEGIN
  DBMS_AUDIT_MGMT.init_cleanup(
    audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
    default_cleanup_interval => 24 /* hours */);
END;
/

BEGIN
  DBMS_AUDIT_MGMT.create_purge_job(
    audit_trail_type           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
    audit_trail_purge_interval => 24 /* hours */,  
    audit_trail_purge_name     => 'PURGE_ALL_AUDIT_TRAILS',
    use_last_arch_timestamp    => TRUE);
END;
/

Ecco un'impostazione d'esempio dei parametri di configurazione, per renderli effettivi la base dati va riavviata:

ALTER SYSTEM SET AUDIT_TRAIL='OS' SCOPE=SPFILE;
ALTER SYSTEM SET AUDIT_SYS_OPERATIONS=TRUE SCOPE=SPFILE;
ALTER SYSTEM SET AUDIT_SYSLOG_LEVEL='SYSLOG.WARNING' SCOPE=SPFILE;

La configurazione standard del SYSLOG prevede facility e priority predefinite: [ USER | LOCAL[0 | 1 | 2 | 3 | 4 | 5 | 6 | 7] | SYSLOG | DAEMON | KERN | MAIL | AUTH | LPR | NEWS | UUCP | CRON ] . [ NOTICE | INFO | DEBUG | WARNING | ERR | CRIT | ALERT | EMERG ]
Su un sistema Linux la configurazione del syslog e' contenuta nel file /etc/syslog.conf e con /etc/rc.d/init.d/syslog restart si riattiva il demone facendogli rileggere la configurazione.

Oltre al normale auditing e' possibile abilitare il Fine-Grained Auditing [NdE disponibile dalla versione 9] che consente una selezione molto piu' selettiva degli eventi (eg. al di fuori dell'orario lavorativo, da postazioni di lavoro specifiche, update di colonne specifiche, ...) Gli eventi FGA sono memorizzati sulla tabella SYS.FGA_LOG$ e sono selezionabili con la vista DBA_FGA_AUDIT_TRAIL

Una completa gestione dell'auditing non puo' limitarsi alla registrazione degli accessi e delle attivita' ma i log di tutti i sistemi/database debbono essere raccolti in modo non modificabile su un sistema sicuro. Su tale sistema deve essere possibile mantenere tutti i log per un periodo prefissato, eseguire report e verifiche di sicurezza, impostare policy, ... Il prodotto che fornisce queste funzionalita' di Oracle Corp., ovviamente integrato con l'RDBMS Oracle e con MySQL, e' Oracle® Audit Vault.

Una corretta configurazione dell'auditing su Oracle permette di rispettare gli stringenti vincoli imposti dalla legislazione in vigore. Tra i molti provvedimenti che richiedono in modo esplicito la funzionalita' di auditing ricordiamo i piu' noti: Sarbanes-Oxley Act (SOX, 2002 USA), Health Insurance Portability and Accountability Act (HIPAA, 1996 USA), International Convergence of Capital Measurement and Capital Standards: a Revised Framework (Basilea II, 2004), Japan Privacy Law (2003), European Union Directive on Privacy and Electronic Communications (EU 2002), Codice in materia di protezione dei dati personali (dlg. 30/6/2003 n.196), GDPR, ...
 

Come sempre la documentazione ufficiale Oracle e' molto completa e di facile consultazione.


Titolo: Auditing in Oracle
Livello: Medio (2/5)
Data: 7 Febbraio 1997
Versione: 1.0.3 - 14 Febbraio 2017
Autore: mail [AT] meo.bogliolo.name