Crea sessioni di sola lettura Cloud SQL per PostgreSQL

Puoi creare una sessione Cloud SQL per PostgreSQL di sola lettura utilizzando il parametro di sessione cloudsql_session_read_only. Questo approccio è un modo più efficace per impedire la modifica dei dati durante una sessione rispetto alle opzioni di sola lettura standard di PostgreSQL. Utilizzando il parametro cloudsql_session_read_only, puoi rendere la sessione di sola lettura temporaneamente o in modo permanente per la durata della sessione. Puoi utilizzare sessioni di sola lettura di questo tipo per proteggere l'integrità dei dati in vari contesti, incluse le sessioni in cui utilizzi strumenti Model Context Protocol (MCP), strumenti di reporting e strumenti di audit.

Per impostazione predefinita, cloudsql_session_read_only è impostato su off, il che consente la modifica dei dati.

Cosa impedisce la modalità di sola lettura

In una sessione di sola lettura, il database non può modificare alcun dato. Nello specifico, la modalità di sola lettura impedisce quanto segue:

  • La modalità di sola lettura impedisce la generazione di nuovi ID transazione. Non è possibile avviare transazioni scrivibili e, di conseguenza, non è possibile eseguire istruzioni DML (Data Manipulation Language) o DDL (Data Definition Language). Tuttavia, se il flag viene impostato nel mezzo di una transazione scrivibile attiva, è possibile eseguire istruzioni DML e DDL di base fino al termine della transazione.

  • La modalità di sola lettura impedisce i seguenti tipi di istruzioni e chiamate:

    • Istruzioni come VACUUM e NOTIFY.
    • Funzioni con effetti collaterali. Ciò significa che non puoi chiamare una FUNCTION o eseguire una PROCEDURE definita come VOLATILE e LANGUAGE C o LANGUAGE internal, perché alcuni dei suoi effetti collaterali non richiedono un ID transazione. Esempi sono pg_promote(), pg_cancel_backend() e pg_terminate_backend().
    • Wrapper di dati esterni.
    • Qualsiasi funzione o procedura creata in un linguaggio procedurale SQL (PL).

Configurare lo stato di sola lettura

Durante una sessione Cloud SQL per PostgreSQL, puoi utilizzare l'istruzione SET per modificare il valore del flag cloudsql_session_read_only come segue:

  • SET cloudsql_session_read_only = 'on'

    Questa istruzione rende la sessione di sola lettura, impedendo a chiunque di modificare i dati finché il flag rimane impostato su on. Per riprendere la modifica dei dati in un secondo momento nella sessione, riporta il valore su off:

  • SET cloudsql_session_read_only = 'off'

    Se imposti di nuovo il flag su off, l'accesso in scrittura viene ripristinato nella sessione, tranne quando il flag è impostato su locked.

  • SET cloudsql_session_read_only = 'locked'

    Se imposti il flag su locked, la sessione diventa di sola lettura in modo permanente. Dopo aver impostato il flag su locked, non puoi modificarlo in nessun altro valore per la durata della sessione.

Per rendere una sessione di sola lettura in modo permanente non appena ti connetti al database, incorpora il flag cloudsql_session_read_only nella stringa di connessione della sessione:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?options=-ccloudsql_session_read_only=locked

Sostituisci quanto segue:

  • USER: il nome utente dell'utente che crea la sessione.
  • PASSWORD: la password dell'utente.
  • HOST: l'URL host.
  • PORT: il numero di porta.
  • DATABASE: il nome del database.

Questo approccio ha il vantaggio aggiuntivo che, se stai tentando di connetterti a una versione precedente di Cloud SQL che non supporta le sessioni di sola lettura, la connessione non riesce.

Puoi anche negare l'accesso in scrittura a un utente del database specifico per tutte le connessioni future, come segue:

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

Sostituisci USERNAME con il nome utente dell'utente di cui vuoi limitare l'accesso alla sola lettura.

Abilitare funzioni specifiche nelle sessioni di sola lettura

  • Puoi abilitare l'utilizzo di una FUNCTION o PROCEDURE specifica definita come VOLATILE e LANGUAGE C o LANGUAGE internal. Per farlo, collega un SECURITY LABEL alla funzione o alla procedura impostata su allow.
  • Per non consentire una funzione specifica nella sessione, imposta un'istruzione SECURITY LABEL su deny.
  • Per consentire le funzioni che non influiscono sullo stato globale, crea un gruppo predefinito di etichette di sicurezza:

    CREATE EXTENSION "google_read_only_session"
    

    L'estensione google_read_only_session abilita quanto segue:

    • Tutte le funzioni C volatili integrate consentite per la modalità di sola lettura.
    • Tutte le funzioni consentite per la modalità di sola lettura che provengono dalle estensioni caricate nel database, incluse le funzioni di gestione per i linguaggi pl/pgsql e pl/v8

    Se in un secondo momento installi una o più nuove estensioni, per applicare le etichette di gruppo, elimina e ricrea l'estensione google_read_only_session:

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    Il comando DROP non rimuove le etichette esistenti. Il secondo comando CREATE aggiunge solo le etichette per le funzioni C volatili nella nuova estensione.

Passaggi successivi