L'auditing nella tecnologia dell'informazione (IT) è un processo di esame dell'infrastruttura IT di un'organizzazione per garantire la conformità ai requisiti imposti da standard riconosciuti o da politiche stabilite. Le regole di protezione dei dati, come le nuove normative GDPR, stanno diventando sempre più rigorose per proteggere i dati degli utenti, quindi è importante che gli audit del database siano impostati correttamente per garantire che sia l'applicazione che i dati dell'utente siano protetti dalle vulnerabilità. In questo post del blog parleremo di pgAudit, uno strumento che genera i log di controllo necessari per facilitare il controllo di PostgreSQL.
Cos'è pgAudit?
L'estensione di controllo PostgreSQL, pgAudit, è un'estensione open source che registra gli eventi in un database PostgreSQL in un registro di controllo dettagliato. Utilizza la funzione di registrazione nativa di PostgreSQL, quindi i log di controllo faranno parte dei log di PostgreSQL. L'estensione si basa sul progetto 2ndQuadrant pgAudit scritto da Simon Riggs, Abhijit Menon-Sen e Ian Barwick e include miglioramenti di David Steele di Crunchy Data.
Perché pgAudit su log_statement=all?
Possiamo registrare tutte le istruzioni in PostgreSQL semplicemente impostando log_statement=all
. Allora perché usare pgAudit? La registrazione dell'istruzione di base (usando log_statement
) elencherà solo le operazioni eseguite sul database. Non fornirà la possibilità di filtrare le operazioni e i registri non avranno la formattazione corretta richiesta per il controllo. pgAudit fornisce inoltre granularità per la registrazione di classi specifiche di istruzioni come READ
(SELECT
e COPY
), WRITE
(INSERT
, UPDATE
, DELETE
, ecc.), DDL
ecc. Inoltre, fornisce un controllo a livello di oggetto in cui verranno registrate solo le operazioni su relazioni specifiche.
Un altro vantaggio di pgAudit rispetto alla registrazione delle istruzioni di base è che fornisce i dettagli dell'operazione eseguita invece di registrare semplicemente l'operazione richiesta. Ad esempio, considera l'esecuzione del blocco di codice anonimo utilizzando un'istruzione DO.
DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;
La registrazione dell'istruzione di base risulterà in:
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: statement: DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;
pgAudit registrerà la stessa operazione di:
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: AUDIT: SESSION,4,1,FUNCTION,DO,,,"DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;",<not logged> 2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: AUDIT: SESSION,4,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT),<not logged>
Quanto sopra indica chiaramente la funzionalità pgAudit che registra l'operazione e le sue parti interne con output strutturato che facilita la ricerca.
Come controllare PostgreSQL usando pgAuditClick To TweetCome installare pgAudit?
pgAudit è un'estensione disponibile per il download dal repository PostgreSQL, oppure può essere compilata e compilata dal sorgente. Come primo passo, il pacchetto deve essere scaricato e installato sulla macchina che esegue PostgreSQL (questo pacchetto di estensione è preinstallato su tutte le distribuzioni ScaleGrid PostgreSQL).
Una volta installato, deve essere caricato in PostgreSQL. Ciò si ottiene aggiungendo pgaudit
alle shared_preload_libraries
parametro di configurazione. Affinché questa modifica della configurazione sia effettiva, è necessario riavviare PostgreSQL. Il passaggio successivo consiste nell'abilitare l'estensione sul database eseguendo CREATE EXTENSION pgaudit
.
Ora che l'estensione è pronta, dobbiamo assicurarci di impostare i parametri di configurazione affinché l'estensione inizi la registrazione. Questo può essere semplice come impostare il parametro pgaudit.log
per valutare all
e pgAudit inizierà ad accedere a session
modalità.
Ora che sappiamo come installare e abilitare pgAudit, discutiamo delle due modalità di registrazione degli audit che offre, sessione e oggetto.
Registrazione dell'audit della sessione
In modalità sessione, pgAudit registrerà tutte le operazioni eseguite da un utente. Impostazione di pgaudit.log
parametro a uno qualsiasi dei valori definiti, diverso da NONE
, abiliterà la registrazione del controllo della sessione. Il pgaudit.log
il parametro specifica le classi di istruzioni che verranno registrate nella modalità sessione. I valori possibili sono:READ
, WRITE
, FUNCTION
, ROLE
, DDL
, MISC
, MISC_SET
, ALL
e NONE
.
Impostazione di pgaudit.log
parametro su ALL
registrerà tutte le dichiarazioni. Il parametro può accettare più classi utilizzando un elenco separato da virgole e classi specifiche possono essere escluse con un segno –. Ad esempio, se desideri registrare tutte le istruzioni tranne MISC
class, il valore di pgaudit.log
sarà ALL, -MISC, -MISC_SET
. Puoi anche abilitare pgAudit per creare una voce di registro separata per ogni riferimento di relazione in un'istruzione impostando pgaudit.log_relation
ad acceso.
Considera un esempio di creazione di una tabella. L'istruzione SQL sarebbe:
CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));
Le voci del registro di controllo corrispondenti sono:
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE TABLE,TABLE,public.persons,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE INDEX,INDEX,public.persons_pkey,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,ALTER SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
Registrazione controllo oggetto
In casi particolari, potrebbe essere richiesto di controllare solo un insieme specifico di relazioni. In tali casi, l'utilizzo della modalità sessione comporterà solo un numero inutilmente elevato di registri di controllo non corrispondenti alle relazioni richieste. La modalità oggetto è particolarmente adatta a questo scopo e può controllare solo un insieme specifico di relazioni.
La registrazione dell'audit degli oggetti viene ottenuta utilizzando i ruoli PostgreSQL. È possibile creare un ruolo e assegnare le autorizzazioni per accedere solo a un insieme specifico di relazioni. Questo ruolo deve essere specificato nel parametro di configurazione pgaudit.role
. La modalità oggetto supporta solo SELECT
, INSERT
, UPDATE
e DELETE
dichiarazioni. Le classi di istruzioni registrate dipendono dalle autorizzazioni concesse al ruolo. Ad esempio, se il ruolo dispone delle autorizzazioni per eseguire solo SELECT
, quindi solo SELECT
le dichiarazioni verranno registrate.
Di seguito è riportato un esempio di registrazione di controllo degli oggetti:
Crea un ruolo e concedi solo SELECT
permessi. Imposta il pgaudit.role
a quel ruolo ed eseguire SELECT
Istruzione SQL:
CREATE ROLE audit_person; GRANT SELECT ON persons TO audit_person; SET pgaudit.role = 'audit_person'; SELECT * FROM persons WHERE ID=404;
L'istruzione select sopra verrà registrata come:
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG: AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>
|
Come interpretare la voce del registro di controllo?
Finora abbiamo fornito dettagli sull'aspetto della voce del registro di controllo, ora diamo un'occhiata al formato della voce del registro di controllo. Ogni voce inizia con il log_line_prefix menzionato per la registrazione di PostgreSQL, quindi il resto dell'output sarà in formato CSV. Considera la seguente semplice voce del registro di controllo:
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG: AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>
Nella voce precedente, il valore
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]:
proviene dal formato log_line_prefix %t:%r:%u@%d:[%p]:
. Il contenuto della voce di controllo inizia da LOG: AUDIT:
valore e segue il formato CSV. Il formato del valore è della forma:
AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER
Diamo un'occhiata a ciascuno dei campi uno per uno:
Campo | Descrizione | Valore dalla voce di audit di esempio |
---|---|---|
AUDIT_TYPE | Indica la modalità di controllo:SESSION o OBJECT | OGGETTO |
STATEMENT_ID | Identificatore di istruzione univoco per ogni sessione | 10 |
SUBSTATEMENT_ID | Un identificatore per ogni sottoistruzione all'interno dell'istruzione principale | 1 |
CLASS | Indica la classe di istruzioni come READ, WRITE ecc. che sono valori definiti per il parametro pgaudit.log. | LEGGI |
COMANDO | Il comando utilizzato nell'istruzione SQL | SELECT |
OBJECT_TYPE | Può essere TABLE, INDEX, VIEW, ecc. | TABELLA |
OBJECT_NAME | Il nome dell'oggetto completo | public.persons |
DICHIARAZIONE | L'istruzione vera e propria eseguita | seleziona * dalle persone in cui ID=404; |
PARAMETER | Quando pgaudit.log_parameter è impostato su true, il CSV dei parametri tra virgolette è elencato se presente, o "none" se non ci sono parametri. Quando pgaudit.log_parameter non è impostato, il valore sarà " |
Inferenza
pgAudit, con tutte le sue capacità, semplifica il processo di auditing generando il log dell'audit trail. Sebbene ci siano alcuni avvertimenti, come la registrazione di oggetti rinominati con lo stesso nome, è comunque uno strumento robusto che fornisce le funzionalità richieste. Tuttavia, le informazioni di controllo scritte nei log potrebbero non essere solo l'ideale per il processo di controllo:il processo di controllo è ancora migliore quando quei registri possono essere convertiti in uno schema di database e i dati di controllo possono essere caricati nel database in modo da poter interrogare facilmente il informazione. È qui che è utile PostgreSQL Audit Log Analyzer (pgAudit Analyze). Per ulteriori informazioni, fare riferimento alle pagine github di pgAudit e pgAudit Analyze.