Controllo dell'accesso granulare per le code

Questa pagina spiega come funziona il controllo dell'accesso granulare con le code Spanner per i database con dialetto GoogleSQL e PostgreSQL.

In Spanner, una coda è definita come oggetto schema. L'accesso per inviare messaggi, riceverli, estendere i lease dei messaggi, confermare ed eliminare messaggi o eseguire query direttamente sulle code è conforme ai ruoli e ai privilegi standard del database Spanner.

Concessioni per l'invio di messaggi (producer)

Per inviare messaggi a una coda utilizzando DML (INSERT INTO) o l'API Mutation (vedi Istruzione Insert), concedi il privilegio INSERT sulla coda al ruolo del database:

GoogleSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;

Per revocare il privilegio:

GoogleSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

Concessioni per la ricezione di messaggi (consumatori)

Per trasmettere in streaming i messaggi da una coda, i consumer eseguono la funzione con valori di tabella (TVF) RECEIVE_QUEUE_NAME() con ExecuteStreamingSQL.

Per consentire a un ruolo del database di trasmettere in streaming i messaggi dalla coda, concedi EXECUTE alla funzione RECEIVE_QUEUE_NAME creata automaticamente:

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;

Per revocare il privilegio:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;

La chiamata RECEIVE_QUEUE_NAME() richiede solo EXECUTE sul TVF; non richiede SELECT nella coda.

Estendere i lease dei messaggi

Quando un consumatore riceve un messaggio, Spanner assegna un lease iniziale di 10 secondi. Se l'elaborazione del messaggio richiede più tempo del lease iniziale, il consumatore deve estendere il lease utilizzando RENEWLEASE_QUEUE_NAME() TVF.

Per estendere i lease, il ruolo deve disporre di EXECUTE sulla funzione RENEWLEASE_QUEUE_NAME:

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;

Per revocare il privilegio:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;

La chiamata RENEWLEASE_QUEUE_NAME() richiede solo EXECUTE sul TVF, non SELECT nella coda.

Per saperne di più sulla ricezione dei messaggi e sull'estensione dei lease, consulta la sezione Utilizzare le code.

Sovvenzioni per l'esecuzione di query dirette sulle code

Per leggere o esaminare i messaggi direttamente da una coda utilizzando SQL standard (SELECT * FROM QUEUE_NAME) o l'API Read, concedi il privilegio SELECT sulla coda:

GoogleSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;

Per revocare il privilegio:

GoogleSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

La concessione di SELECT sulla coda consente di eseguire query sulla coda come tabella, ma non concede EXECUTE su RECEIVE_QUEUE_NAME() o RENEWLEASE_QUEUE_NAME().

Concessioni per la conferma e l'eliminazione dei messaggi

Per confermare la ricezione o eliminare i messaggi da una coda utilizzando DML (DELETE FROM) o l'API Mutation (Ack o Delete), concedi il privilegio DELETE sulla coda:

GoogleSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;

Per revocare il privilegio:

GoogleSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;

Privilegi richiesti per le operazioni sulle code

La seguente tabella riepiloga i privilegi richiesti per le operazioni comuni della coda:

Operazione Privilegi obbligatori
Inviare messaggi (DML INSERT o API Mutation Send) INSERT in coda
Ricevere messaggi (RECEIVE_QUEUE_NAME() TVF) EXECUTE sulla funzione RECEIVE_QUEUE_NAME
Estendi il lease del messaggio (RENEWLEASE_QUEUE_NAME() TVF) EXECUTE sulla funzione RENEWLEASE_QUEUE_NAME
Riconoscere o eliminare i messaggi (DML DELETE o API Mutation Ack o Delete) DELETE in coda
Leggere direttamente i dati della coda (SQL SELECT o API Read) SELECT in coda

Esempio: configura i ruoli di produttore e consumatore

L'esempio seguente configura ruoli di database separati per un produttore, un consumer e un revisore in una coda denominata OrdersQueue:

GoogleSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;

PostgreSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;

INFORMATION_SCHEMA visualizzazioni per le code

Le seguenti visualizzazioni mostrano informazioni sui ruoli e sui privilegi del database per le code:

Poiché Spanner modella le code come oggetti schema a livello di tabella, i privilegi concessi alle code vengono visualizzati in TABLE_PRIVILEGES. I privilegi concessi sulle funzioni con valori di tabella della coda vengono visualizzati in ROUTINE_PRIVILEGES.

Le righe di queste viste vengono filtrate in base ai privilegi del ruolo del database corrente. In questo modo, le entità possono visualizzare solo i ruoli, i privilegi e le code a cui hanno accesso.

Il filtro delle righe si applica anche alle seguenti visualizzazioni dei metadati della coda:

GoogleSQL

  • INFORMATION_SCHEMA.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_schema.columns

Il filtro delle righe si applica anche alle visualizzazioni dei metadati per le funzioni con valori di tabella della coda (RECEIVE_QUEUE_NAME e RENEWLEASE_QUEUE_NAME):

Il ruolo di sistema spanner_info_reader e i suoi membri vedono sempre un INFORMATION_SCHEMA non filtrato.

Avvertenze e considerazioni

  • Privilegi distinti per l'esecuzione di TVF e le query dirette sulle code: la concessione di SELECT sulla coda non concede EXECUTE sulle funzioni con valori di tabella (RECEIVE_QUEUE_NAME o RENEWLEASE_QUEUE_NAME) associate. Analogamente, la concessione di EXECUTE sulla TVF non concede SELECT sulla coda.

    • Se un ruolo con solo SELECT nella coda tenta di eseguire RECEIVE_QUEUE_NAME(), Spanner restituisce un errore che indica che il ruolo non dispone dei privilegi richiesti nella funzione della tabella RECEIVE_QUEUE_NAME.
    • Se un ruolo con solo EXECUTE sul TVF tenta di eseguire SELECT * FROM QUEUE_NAME, Spanner restituisce un errore che indica che il ruolo non dispone dei privilegi richiesti nella coda QUEUE_NAME.
  • Differenza rispetto agli stream di modifiche: a differenza degli stream di modifiche (che richiedono sia SELECT sullo stream sia EXECUTE sulla funzione di lettura), i consumer di messaggi in coda richiedono solo EXECUTE sulla TVF RECEIVE. Non richiedono SELECT nella coda stessa.

  • Privilegi a livello di colonna non supportati: a differenza delle tabelle, Spanner non supporta i privilegi a livello di colonna nelle code (ad esempio GRANT SELECT (COLUMN_NAME) ON QUEUE). I privilegi devono essere concessi all'oggetto coda nel suo complesso perché le code includono colonne di metadati di sistema interni.

  • Separazione dei ruoli di produttore e consumatore: consigliamo di definire ruoli di database separati per i produttori e i consumatori di messaggi. Ad esempio:

    • Un ruolo di produttore con solo INSERT in coda.
    • Un ruolo di consumatore con EXECUTE sulle funzioni RECEIVE_QUEUE_NAME e RENEWLEASE_QUEUE_NAME, oltre a DELETE sulla coda se si confermano i messaggi con DELETE o la mutazione Ack.
  • DML diretta e TVF in coda: le istruzioni DELETE o UPDATE ignorano la macchina a stati di leasing e distribuzione della coda. Ti consigliamo di limitare questi privilegi ai ruoli amministrativi o di manutenzione.

Passaggi successivi