PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Controllo di PostgreSQL usando pgAudit

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 Tweet

Come 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>

Interessato a una soluzione PostgreSQL completamente gestita?

Per saperne di più su come un provider DBaaS come ScaleGrid può aiutarti a gestire i tuoi database PostgreSQL, controlla la nostra pagina PostgreSQL. Scopri come ScaleGrid ti consente di concentrarti maggiormente sullo sviluppo del tuo prodotto e meno sulla gestione dei database.

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.