Controllo di PostgreSQL tramite pgAudit

Questa pagina descrive il controllo del database utilizzando l'estensione pgAudit, che consente di 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.

Con 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 sui log di controllo in Cloud SQL, consulta la pagina Log di controllo.

Configurare il controllo dei database in Cloud SQL

I passaggi per la registrazione degli audit utilizzando l'estensione pgAudit includono:

  1. Attivare il flag cloudsql.enable_pgaudit in Cloud SQL.
  2. Esegui un comando per creare l'estensione pgAudit.
  3. Impostazione dei valori per il flag pgaudit.log.

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

Configurare il controllo

Questa sezione descrive le nozioni di base per configurare le operazioni di controllo del database.

Indicatore 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 cloudsql.enable_pgaudit consente di attivare il controllo per una determinata istanza di database. Puoi modificare il valore del flag cloudsql.enable_pgaudit tramite la console Google Cloud o il comando gcloud.

Utilizza le istruzioni standard per i flag per attivare il flag cloudsql.enable_pgaudit impostando il valore su on. Per example, 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.

Esegui il comando per creare l'estensione pgAudit

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

CREATE EXTENSION pgaudit;

Imposta i valori per il flag pgaudit.log

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

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

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

Configura altre impostazioni per il database

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

Visualizzare i log di controllo del database

Per visualizzare i log di controllo, abilita gli audit log di accesso ai dati per il tuo progetto. Gli audit 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 Logs Explorer.

Nell'applicazione Logs Explorer, i log pgAudit possono essere visualizzati selezionando il filtro 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. Il chunking può verificarsi nei dati forniti nei campi parameter e statement. Il campo chunkCount indica il numero totale di chunk. 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.
  • comando. 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 campo parameter 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 nel backend. Il campo chunkIndex può determinare i contenuti del campo statement; consulta la descrizione del campo chunkIndex.
  • statementId. ID univoco dell'istruzione per questa sessione. Ogni ID istruzione rappresenta una chiamata di backend. Gli ID dichiarazione sono sequenziali, anche se alcune dichiarazioni 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 i controlli

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

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

DROP EXTENSION pgaudit;

Personalizzare la registrazione degli audit del database in Cloud SQL

Questa sezione descrive i modi per personalizzare il comportamento di controllo di un'istanza di 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 ruolocloudsqlsuperuser. Quando crei una nuova istanza PostgreSQL, viene creato automaticamente 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.

Configura il controllo per tutte le operazioni del database nell'istanza

Per configurare il controllo per tutti i database di un'istanza, devi applicare le impostazioni di pgAudit a livello di sistema. I parametri di controllo a livello di sistema possono essere impostati solo come flag del database tramite la console Google Cloud o il comando gcloud. Ad esempio, per attivare il controllo per tutte le operazioni del database in 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 delle istanze

Per il controllo su tutti i database delle istanze, puoi utilizzare la console Google Cloud o il comando gcloud. Ad esempio, per attivare il controllo solo per le operazioni di lettura e scrittura nell'istanza, puoi utilizzare il seguente comando gcloud. Questo esempio utilizza una sintassi basata su elenco 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 del 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 la verifica di lettura/scrittura per un database denominato finance:

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

Configurare il controllo per una relazione

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

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

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 eseguire il controllo di un sottoinsieme di colonne per una determinata relazione.

Ad esempio, il seguente comando configura la generazione di log di controllo 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 di 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 sul database eseguite dall'utente Alice:

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

Suggerimenti per la gestione dei controlli in Cloud SQL

Quando personalizzi il comportamento dei controlli, tieni presente quanto segue:

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

Limiti dell'estensione pgAudit in Cloud SQL per PostgreSQL

Gli audit log vengono scritti temporaneamente sul disco dell'istanza, occupando spazio prima di essere inviati a Cloud Logging. Pertanto, prima di utilizzare questa funzionalità, esamina tutte le seguenti informazioni:

  • La frequenza di importazione dei log è di 4 MB al secondo. Quando il carico generato dalla generazione dei log supera la frequenza di importazione, possono verificarsi i seguenti problemi:
    • Potrebbe verificarsi un aumento indesiderato dell'utilizzo del disco.
    • Lo spazio su disco può esaurirsi.
  • Se hai attivato questa funzionalità ed esegui molte query che soddisfano i tuoi criteri di controllo, l'utilizzo del disco può aumentare troppo rapidamente.
  • Prima di utilizzare questa funzionalità, pianifica di:
  • Se lo spazio su disco disponibile è esaurito, i log di controllo per alcune query potrebbero essere persi.