Controllo di PostgreSQL tramite pgAudit

Questa pagina descrive il controllo del database utilizzando l' pgAudit, che ti aiuta a configurare molti dei log spesso richiesti per rispettare le certificazioni governative, finanziarie e ISO.

Per informazioni generali sulle estensioni PostgreSQL in Cloud SQL, consulta Estensioni PostgreSQL.

Panoramica

Il controllo del database in Cloud SQL per PostgreSQL è disponibile tramite l'estensione open source pgAudit.

Utilizzando questa estensione, puoi registrare e monitorare in modo selettivo le operazioni SQL eseguite su una determinata istanza del database. L'estensione fornisce funzionalità di controllo per monitorare e registrare un sottoinsieme selezionato di operazioni.

L'estensione pgAudit si applica ai comandi e alle query SQL eseguiti. Al contrario, gli audit log di Cloud devono essere utilizzati per controllare le operazioni amministrative e di manutenzione eseguite su un'istanza Cloud SQL.

Per ulteriori informazioni sul controllo degli audit log in Cloud SQL, consulta la pagina Audit log.

Configurare il controllo del database in Cloud SQL

I passaggi per il controllo degli audit log utilizzando l'estensione pgAudit includono:

  1. Abilitare il flag cloudsql.enable_pgaudit in Cloud SQL.
  2. Eseguire un comando per creare l'estensione pgAudit.
  3. Impostare i valori per il flag pgaudit.log.

Dopo aver configurato il controllo del database, puoi visualizzare i log e, se necessario, disattivare la registrazione.

Configurare il controllo

Questa sezione descrive le nozioni di base per la configurazione delle operazioni di controllo del database.

Flag iniziale per abilitare il controllo

In Cloud SQL, utilizzi i flag di database per molte operazioni, tra cui la modifica dei parametri PostgreSQL e la configurazione di un'istanza. Il flag cloudsql.enable_pgaudit abilita il controllo per una determinata istanza del database. Puoi modificare il valore del cloudsql.enable_pgaudit flag tramite la Google Cloud console o tramite il gcloud comando.

Utilizza le istruzioni standard per i flag per abilitare il flag cloudsql.enable_pgaudit, impostando il valore su on. Ad esempio, per utilizzare il comando gcloud, specifica quanto segue, sostituendo il nome dell'istanza con [INSTANCE_NAME]:

gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on

Il flag cloudsql.enable_pgaudit è elencato con gli altri flag supportati ed è specifico di Cloud SQL.

Eseguire il comando per creare l'estensione pgAudit

Dopo aver abilitato il flag di database, esegui il comando CREATE EXTENSION utilizzando un client psql compatibile. Il seguente comando crea l'estensione pgAudit per tutti i database in un'istanza Cloud SQL:

CREATE EXTENSION pgaudit;

Impostare i valori per il flag pgaudit.log

Utilizza le istruzioni standard per i flag per impostare i valori per il pgaudit.log flag.

Ad esempio, per attivare il controllo per tutte le operazioni del database su un'istanza, puoi utilizzare il seguente comando gcloud:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

Configurare altre impostazioni per il database

Per configurare le impostazioni di controllo per il database, segui le procedure descritte nella sezione Personalizzare il controllo degli audit log del database.

Visualizzare gli audit log del database

Per visualizzare gli audit log, abilita gli audit log di accesso ai dati per il tuo progetto. I log pgAudit generati per una determinata istanza vengono inviati a Cloud Logging come audit log di accesso ai dati. Gli utenti possono visualizzare i log pgAudit generati tramite l'applicazione Esplora log.

Nell'applicazione Esplora log, i log pgAudit possono essere visualizzati selezionando il filtro di log cloudaudit.googleapis.com/data_access.

In alternativa, puoi utilizzare la seguente query per mostrare tutti i log pgAudit per un determinato progetto Cloud SQL:

resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"

Formato dei log per pgAudit

Ogni voce di log pgAudit negli audit log di accesso ai dati ha campi che rappresentano le informazioni raccolte per una query.

Ecco un esempio:

{
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    methodName: "cloudsql.instances.query"
    request: {
      @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
      auditClass: "READ"
      auditType: "SESSION"
      chunkCount: "1"
      chunkIndex: "1"
      command: "SELECT"
      database: "finance"
      databaseSessionId: 2209692
      parameter: "[not logged]"
      statement: "SELECT * FROM revenue"
      statementId: 2
      substatementId: 1
      user: "alice"
    }
  }
}

Di seguito sono riportate le descrizioni dei campi negli audit log di accesso ai dati:

  • auditClass. Il tipo di istruzione registrata. I valori possibili sono READ, WRITE, FUNCTION, ROLE, DDL, MISC, e MISC_SET.
  • auditType. SESSION o OBJECT.
  • chunkCount. La suddivisione in blocchi può verificarsi sui dati forniti nei campi parameter e statement. Il campo chunkCount indica il numero totale di blocchi. Consulta anche la descrizione del campo chunkIndex.
  • chunkIndex. Specifica il numero di indice dei blocchi di dati nei campi parameter e statement (nel contenitore request corrente). Il numero iniziale è 1. Consulta anche la descrizione del campo chunkCount.
  • command. Ad esempio, ALTER TABLE o SELECT.
  • parameter. Il campo chunkIndex può determinare i contenuti di questo campo; consulta la descrizione del campo chunkIndex. Se il valore di pgaudit.log_parameter è impostato, il parameter campo può contenere i parametri dell'istruzione come dati CSV tra virgolette. Se non sono presenti parametri, questo campo contiene [none]. In caso contrario, questo campo contiene [not logged].
  • statement. Istruzione eseguita sul backend. Il campo chunkIndex può determinare i contenuti del campo statement; consulta la descrizione del campo chunkIndex.
  • statementId. ID istruzione univoco per questa sessione. Ogni ID istruzione rappresenta una chiamata backend. Gli ID istruzione sono sequenziali, anche se alcune istruzioni non vengono registrate.
  • substatementId. ID sequenziale per ogni sottoistruzione all'interno dell'istruzione principale.

Alcuni di questi campi sono descritti anche nella documentazione di pgAudit.

Disattivare il controllo

Per disattivare il controllo del database, imposta il valore del flag cloudsql.enable_pgaudit su off. Il valore può essere modificato tramite la Google Cloud console o tramite il gcloud comando. Utilizza le istruzioni standard per i flag per disattivare il cloudsql.enable_pgaudit flag.

Inoltre, esegui il comando DROP EXTENSION utilizzando un client psql compatibile per rimuovere lo stato dell'estensione:

DROP EXTENSION pgaudit;

Personalizzare il controllo degli audit log del database in Cloud SQL

Questa sezione descrive i modi per personalizzare il comportamento di controllo di un'istanza del database.

Per ulteriori funzionalità dell'estensione, consulta la documentazione di pgAudit.

Requisito per i privilegi di super user

In Cloud SQL, le estensioni possono essere create solo dagli utenti che fanno parte del ruolo cloudsqlsuperuser. Quando crei una nuova istanza PostgreSQL, viene creato l'utente PostgreSQL predefinito (anche se devi impostare la password dell'utente). L'utente PostgreSQL predefinito fa parte del ruolo cloudsqlsuperuser. Per ulteriori informazioni, consulta Utenti PostgreSQL.

Configurare il controllo per tutte le operazioni del database sull'istanza

Per configurare il controllo per tutti i database in un'istanza, devi applicare le impostazioni pgAudit a livello di sistema. I parametri di controllo a livello di sistema possono essere impostati solo come flag di database tramite la Google Cloud console o il gcloud comando. Ad esempio, per attivare il controllo per tutte le operazioni del database su un'istanza, puoi utilizzare il seguente comando gcloud:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

Configurare operazioni specifiche su tutti i database dell'istanza

Per il controllo su tutti i database dell'istanza, puoi utilizzare la Google Cloud console o il gcloud comando. Ad esempio, per attivare il controllo solo per le operazioni di lettura e scrittura sull'istanza, puoi utilizzare il seguente comando gcloud. Questo esempio utilizza una sintassi basata su elenchi per specificare più valori:

  gcloud sql instances patch [INSTANCE_NAME] \
  --database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write

Il comando sovrascrive i flag di database esistenti.

Configurare il controllo per un database specifico

Per configurare il controllo per un database specifico, imposta i parametri pgAudit a livello di database. Ad esempio, il seguente comando SQL può essere utilizzato per attivare il controllo di lettura e scrittura per un database denominato finance:

finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';

Configurare il controllo per una relazione

Il controllo per una relazione è più limitato rispetto al controllo per un database specifico.

Quando esegui il controllo per una relazione, al parametro pgaudit.role viene assegnato un ruolo di controllo univoco. Viene registrato qualsiasi oggetto o relazione a cui viene concesso questo ruolo.

Ad esempio, per configurare il controllo per tutte le query SELECT sulla relazione salary all'interno del database employee, puoi utilizzare questi comandi:

employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;

Puoi anche controllare un sottoinsieme di colonne per una determinata relazione.

Ad esempio, il seguente comando configura la registrazione degli audit log in modo che si verifichi solo quando si accede alle colonne income e tax_status dalla relazione salary:

employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;

Configurare il controllo per un utente del database

Puoi attivare il controllo per un utente specifico impostando il parametro pgaudit.log a livello di ROLE.

Ad esempio, il seguente comando SQL imposta il controllo per tutte le operazioni del database eseguite dall'utente Alice:

finance=> ALTER ROLE alice SET pgaudit.log = 'all';

Mascherare i dati sensibili negli audit log

Per migliorare la privacy e la sicurezza dei dati, puoi configurare pgAudit in modo da mascherare i valori letterali all'interno delle istruzioni SQL registrate utilizzando il flag cloudsql.pgaudit_mask_literals. Quando questa funzionalità è abilitata, le costanti stringa, i numeri e altri valori letterali vengono sostituiti con segnaposto posizionali negli audit log. In questo modo puoi controllare la struttura delle query e le operazioni eseguite senza registrare valori di dati potenzialmente sensibili.

Vantaggi

  • Impedisce che i dati sensibili che potrebbero essere incorporati nelle query vengano visualizzati negli audit log, inclusi i seguenti esempi:
    • Password
    • Informazioni personali
    • Secret
  • Aiuta a soddisfare i requisiti di conformità e normativi in materia di privacy dei dati.

Come funziona

Quando il flag cloudsql.pgaudit_mask_literals è impostato su on, l'estensione pgAudit elabora l'istruzione SQL prima di scriverla nell'audit log. Se l'estensione identifica valori letterali nella query, li sostituisce prima di registrarla:

  • Istruzione originale:

    INSERT INTO users (id, email) VALUES (123, 'sensitive@example.com');
    
  • Istruzione nell'audit log, con la mascheratura abilitata:

    INSERT INTO users (id, email) VALUES ($1, $2);
    

Tieni presente che i valori letterali per l'ID e l'indirizzo email vengono sostituiti nell'audit log restituito.

Requisiti

  • Il flag cloudsql.pgaudit_mask_literals è supportato in Cloud SQL per PostgreSQL versioni 14 e successive.
  • Il flag cloudsql.enable_pgaudit è disabilitato per impostazione predefinita e deve essere impostato su on per essere utilizzato.

Abilitare la mascheratura

Per abilitare la mascheratura letterale, imposta il flag di database cloudsql.pgaudit_mask_literals su on. Puoi impostare i flag di database utilizzando la Google Cloud console, gcloud CLI, o l'API Cloud SQL Admin.

Per ulteriori informazioni, consulta Configurare i flag di database.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags cloudsql.enable_pgaudit=on,cloudsql.pgaudit_mask_literals=on

Sostituisci INSTANCE_NAME con il nome dell'istanza.

Disabilitare la mascheratura

Per disabilitare la mascheratura letterale, imposta il flag cloudsql.pgaudit_mask_literals su off.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags cloudsql.enable_pgaudit=on,cloudsql.pgaudit_mask_literals=off

Sostituisci INSTANCE_NAME con il nome dell'istanza.

Suggerimenti per la gestione degli audit log in Cloud SQL

Quando personalizzi il comportamento di controllo, tieni presente quanto segue:

  • Quando il flag di database cloudsql.enable_pgaudit è disattivato, il controllo degli audit log viene interrotto immediatamente. Tuttavia, le impostazioni pgAudit applicate (ad esempio, le impostazioni del parametro pgaudit.log) vengono mantenute, a meno che non vengano rimosse esplicitamente.
  • L'istanza del database viene riavviata ogni volta che viene modificato il valore del flag di database per cloudsql.enable_pgaudit.
  • Gli utenti del database creati tramite comandi CREATE ROLE espliciti non hanno il privilegio di modificare le impostazioni di controllo. Solo gli utenti del database creati tramite la Google Cloud console e il gcloud comando possono modificare le impostazioni di controllo.
  • Quando abiliti sia il controllo degli audit log della sessione sia il controllo degli audit log degli oggetti, le istruzioni relative a entrambi vengono aggiunte ai log. La registrazione delle sessioni e la registrazione degli oggetti non si annullano o modificano a vicenda.

Limitazioni dell'estensione pgAudit in Cloud SQL per PostgreSQL

Gli audit log vengono scritti temporaneamente sul disco della relativa istanza, occupando spazio su disco prima che i log vengano inviati a Cloud Logging. Pertanto, esamina tutte le seguenti informazioni prima di utilizzare questa funzionalità:

  • La velocità di importazione dei log è di 4 MB al secondo. Quando il carico generato dalla generazione dei log supera la velocità di importazione, possono verificarsi le seguenti situazioni:
    • Può verificarsi una crescita indesiderata dell'utilizzo del disco.
    • Lo spazio su disco può esaurirsi.
  • Se hai abilitato questa funzionalità ed esegui molte query che soddisfano i criteri di controllo, l'utilizzo del disco può aumentare troppo rapidamente.
  • Prima di utilizzare questa funzionalità, pianifica di:
  • Se lo spazio su disco disponibile si esaurisce, gli audit log per alcune query potrebbero andare persi.

Passaggi successivi