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.
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.
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.
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.
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;
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.
# Auditing database Oracle 0 2 * * 0 /usr/oracle/amm/audit_db.sh > /dev/null 2>&1
# 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
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
In realta' lo script originale in italiano e' stato poi aggiornato... ma la sostanza non cambia!
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
Data:
7 Febbraio 1997
Versione: 1.0.3 - 14 Febbraio 2017
Autore: mail [AT] meo.bogliolo.name