Torna agli aggiornamenti
New releaseJul 30, 2026

pgaudit v19beta3

Estensione di audit per PostgreSQL

Condividi

pgAudit
Registrazione di Audit Open Source per PostgreSQL

Introduzione

L'estensione di audit PostgreSQL (pgAudit) fornisce una registrazione dettagliata degli audit di sessione e/o di oggetto tramite il meccanismo di logging standard di PostgreSQL.

L'obiettivo di pgAudit è fornire agli utenti PostgreSQL la capacità di produrre log di audit spesso richiesti per conformarsi a certificazioni governative, finanziarie o ISO.

Un audit è un'ispezione ufficiale dei conti di un individuo o di un'organizzazione, tipicamente condotta da un organismo indipendente. Le informazioni raccolte da pgAudit sono propriamente chiamate trail di audit o log di audit. In questa documentazione viene utilizzato il termine log di audit.

Perché pgAudit?

La registrazione di base delle istruzioni può essere fornita dal meccanismo di logging standard con log_statement = all. Questo è accettabile per il monitoraggio e altri usi, ma non fornisce il livello di dettaglio generalmente richiesto per un audit. Non basta avere un elenco di tutte le operazioni eseguite sul database. Deve anche essere possibile trovare istruzioni specifiche che interessano a un revisore. Il meccanismo di logging standard mostra cosa ha richiesto l'utente, mentre pgAudit si concentra sui dettagli di ciò che è accaduto mentre il database soddisfava la richiesta.

Ad esempio, un revisore potrebbe voler verificare che una particolare tabella sia stata creata all'interno di una finestra di manutenzione documentata. Potrebbe sembrare un semplice compito per grep, ma cosa succederebbe se venisse presentato un esempio come questo (volutamente offuscato):

DO $$
BEGIN
    EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

La registrazione standard ti darà questo:

LOG:  statement: DO $$
BEGIN
    EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

Sembra che trovare la tabella di interesse possa richiedere una certa conoscenza del codice nei casi in cui le tabelle vengono create dinamicamente. Questo non è ideale poiché sarebbe preferibile cercare semplicemente per nome della tabella. È qui che entra in gioco pgAudit. Per lo stesso input, produrrà questo output nel log:

AUDIT: SESSION,33,1,FUNCTION,DO,,,"DO $$
BEGIN
    EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;"
AUDIT: SESSION,33,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT)

Non solo il blocco DO viene registrato, ma la sotto-istruzione 2 contiene il testo completo della CREATE TABLE con il tipo di istruzione, il tipo di oggetto e il nome completo per rendere facili le ricerche.

Quando si registrano istruzioni SELECT e DML, pgAudit può essere configurato per registrare una voce separata per ogni relazione referenziata in un'istruzione. Non è necessario alcun parsing per trovare tutte le istruzioni che toccano una particolare tabella. In effetti, l'obiettivo è che il testo dell'istruzione sia fornito principalmente per analisi forensi approfondite e non dovrebbe essere richiesto per un audit.

Considerazioni sull'uso

A seconda delle impostazioni, è possibile che pgAudit generi un volume enorme di registrazioni. Fare attenzione a determinare esattamente cosa deve essere registrato per l'audit nel proprio ambiente per evitare di registrare troppo.

Ad esempio, quando si lavora in un ambiente OLAP probabilmente non sarebbe saggio registrare gli insert in una grande tabella dei fatti. La dimensione del file di log sarà probabilmente molte volte la dimensione effettiva dei dati degli insert perché il file di log è espresso come testo. Poiché i log sono generalmente memorizzati con il sistema operativo, questo può portare a esaurire molto rapidamente lo spazio su disco. Nei casi in cui non è possibile limitare la registrazione dell'audit a determinate tabelle, assicurarsi di valutare l'impatto sulle prestazioni durante i test e allocare molto spazio sul volume dei log. Questo può essere vero anche per ambienti OLTP. Anche se il volume degli insert non è così elevato, l'impatto sulle prestazioni della registrazione dell'audit può comunque influire notevolmente sulla latenza.

Per limitare il numero di relazioni registrate per le istruzioni SELECT e DML, considerare l'uso della registrazione dell'audit sugli oggetti (vedere Registrazione dell'audit sugli oggetti). La registrazione dell'audit sugli oggetti consente di selezionare le relazioni da registrare, permettendo di ridurre il volume complessivo dei log. Tuttavia, quando vengono aggiunte nuove relazioni, queste devono essere esplicitamente aggiunte alla registrazione dell'audit sugli oggetti. In questo caso può essere una buona opzione una soluzione programmatica in cui le tabelle specificate sono escluse dalla registrazione e tutte le altre sono incluse.

Compatibilità con le versioni di PostgreSQL

pgAudit supporta PostgreSQL 14 o successivo.

Per supportare le nuove funzionalità introdotte in ogni release di PostgreSQL, pgAudit mantiene un ramo separato per ogni versione major di PostgreSQL (attualmente PostgreSQL 14 - 19) che sarà mantenuto in modo simile al progetto PostgreSQL.

Oltre alle correzioni di bug, non è consentito alcun ulteriore sviluppo per i rami stabili. Il nuovo sviluppo, se presente, sarà strettamente per la prossima versione major non rilasciata di PostgreSQL.

Le versioni di pgAudit sono correlate alle versioni major di PostgreSQL come segue:

  • pgAudit v19.X è pensato per supportare PostgreSQL 19.

  • pgAudit v18.X è pensato per supportare PostgreSQL 18.

  • pgAudit v17.X è pensato per supportare PostgreSQL 17.

  • pgAudit v16.X è pensato per supportare PostgreSQL 16.

  • pgAudit v1.7.X è pensato per supportare PostgreSQL 15.

  • pgAudit v1.6.X è pensato per supportare PostgreSQL 14.

Compilazione e installazione

pgAudit può essere compilato contro una copia installata di PostgreSQL con i pacchetti di sviluppo usando PGXS. Le seguenti istruzioni dovrebbero funzionare sulla maggior parte dei sistemi operativi simili a Unix.

Clonare l'estensione pgAudit:

git clone https://github.com/pgaudit/pgaudit.git

Spostarsi nella directory pgAudit:

cd pgaudit

Eseguire il checkout del ramo REL_19_STABLE (notare che il ramo stabile potrebbe non esistere per versioni non rilasciate di PostgreSQL):

git checkout REL_19_STABLE

Compilare e installare pgAudit:

make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-19/bin/pg_config

Le istruzioni per test e sviluppo possono essere trovate in test.

Impostazioni

Le impostazioni possono essere modificate solo da un superuser. Consentire agli utenti normali di modificare le proprie impostazioni vanificherebbe lo scopo di un log di audit.

Le impostazioni possono essere specificate a livello globale (in postgresql.conf o usando ALTER SYSTEM ... SET), a livello di database (usando ALTER DATABASE ... SET) o a livello di ruolo (usando ALTER ROLE ... SET). Notare che le impostazioni non vengono ereditate tramite la normale ereditarietà dei ruoli e SET ROLE non modifica le impostazioni pgAudit di un utente. Questa è una limitazione del sistema dei ruoli e non intrinseca a pgAudit.

L'estensione pgAudit deve essere caricata in shared_preload_libraries. In caso contrario, verrà generato un errore al momento del caricamento e non si verificherà alcuna registrazione di audit.

Inoltre, CREATE EXTENSION pgaudit deve essere chiamato prima che pgaudit.log venga impostato per garantire la corretta funzionalità di pgaudit. L'estensione installa trigger di evento che aggiungono un audit aggiuntivo per DDL. pgAudit funzionerà senza l'estensione installata, ma le istruzioni DDL non avranno informazioni sul tipo e sul nome dell'oggetto.

Categorie