Cette page explique comment le contrôle des accès précis fonctionne avec les files d'attente Spanner pour les bases de données utilisant le dialecte GoogleSQL et celles utilisant le dialecte PostgreSQL.
Dans Spanner, une file d'attente est définie comme un objet de schéma. L'accès à l'envoi et à la réception de messages, à l'extension de baux de messages, à l'accusé de réception et à la suppression de messages, ou à l'interrogation directe de files d'attente est conforme aux rôles et privilèges standards des bases de données Spanner.
Autorisations pour l'envoi de messages (producteurs)
Pour envoyer des messages à une file d'attente à l'aide du langage LMD (INSERT INTO) ou de l'API Mutation (voir Instruction INSERT), accordez le privilège INSERT sur la file d'attente au rôle de base de données :
GoogleSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Pour révoquer le privilège :
GoogleSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Autorisations pour la réception de messages (consommateurs)
Pour diffuser des messages depuis une file d'attente, les nœuds de calcul des consommateurs exécutent la fonction de valeur de table (TVF) RECEIVE_QUEUE_NAME() avec ExecuteStreamingSQL.
Pour autoriser un rôle de base de données à diffuser des messages depuis la file d'attente, accordez EXECUTE sur la fonction RECEIVE_QUEUE_NAME créée automatiquement :
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;
Pour révoquer le privilège :
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;
L'appel de RECEIVE_QUEUE_NAME() ne nécessite que EXECUTE sur le TVF. Il ne nécessite pas SELECT sur la file d'attente.
Prolonger les baux de messages
Lorsqu'un consommateur reçoit un message, Spanner attribue un bail initial de 10 secondes. Si le traitement des messages prend plus de temps que le bail initial, le consommateur doit prolonger le bail à l'aide du TVF RENEWLEASE_QUEUE_NAME().
Pour prolonger les baux, le rôle doit disposer de EXECUTE sur la fonction 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;
Pour révoquer le privilège :
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;
L'appel de RENEWLEASE_QUEUE_NAME() ne nécessite que EXECUTE sur le TVF, et non SELECT sur la file d'attente.
Pour en savoir plus sur la réception de messages et l'extension des baux, consultez Utiliser des files d'attente.
Accorder des droits pour interroger directement les files d'attente
Pour lire ou inspecter des messages directement à partir d'une file d'attente à l'aide du dialecte SQL standard (SELECT * FROM QUEUE_NAME) ou de l'API Read, accordez le privilège SELECT sur la file d'attente :
GoogleSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Pour révoquer le privilège :
GoogleSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
L'octroi de SELECT sur la file d'attente permet d'interroger la file d'attente en tant que table, mais n'accorde pas EXECUTE sur RECEIVE_QUEUE_NAME() ni sur RENEWLEASE_QUEUE_NAME().
Autorisations pour accuser réception et supprimer des messages
Pour accuser réception ou supprimer des messages d'une file d'attente à l'aide de LMD (DELETE FROM) ou de l'API Mutation (Ack ou Delete), accordez le droit DELETE sur la file d'attente :
GoogleSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;
Pour révoquer le privilège :
GoogleSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Droits requis pour les opérations sur les files d'attente
Le tableau suivant récapitule les droits d'accès requis pour les opérations de file d'attente courantes :
| Opération | Droits requis |
|---|---|
Envoyer des messages (LMD INSERT ou API Mutation Send) |
INSERT dans la file d'attente |
Recevoir des messages (RECEIVE_QUEUE_NAME() TVF) |
EXECUTE sur la fonction RECEIVE_QUEUE_NAME |
Prolonger la durée de validité du message (TVF RENEWLEASE_QUEUE_NAME()) |
EXECUTE sur la fonction RENEWLEASE_QUEUE_NAME |
Accuser réception ou supprimer des messages (LMD DELETE ou API Mutation Ack ou Delete) |
DELETE dans la file d'attente |
Lire directement les données de la file d'attente (SQL SELECT ou API Read) |
SELECT dans la file d'attente |
Exemple : Configurer les rôles de producteur et de consommateur
L'exemple suivant configure des rôles de base de données distincts pour un producteur, un consommateur et un auditeur sur une file d'attente nommée 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 vues pour les files d'attente
Les vues suivantes affichent des informations sur les rôles et les privilèges de base de données pour les files d'attente :
- Bases de données de dialecte GoogleSQL :
INFORMATION_SCHEMA.TABLE_PRIVILEGES - Bases de données utilisant le dialecte PostgreSQL :
information_schema.table_privileges
Étant donné que Spanner modélise les files d'attente en tant qu'objets de schéma au niveau de la table, les droits accordés sur les files d'attente apparaissent dans TABLE_PRIVILEGES. Les droits accordés sur les fonctions table de file d'attente apparaissent dans ROUTINE_PRIVILEGES.
Les lignes de ces vues sont filtrées en fonction des droits d'accès du rôle de base de données actuel. Cela permet aux principaux de ne voir que les rôles, les privilèges et les files d'attente auxquels ils ont accès.
Le filtrage des lignes s'applique également aux vues de métadonnées de file d'attente suivantes :
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
Le filtrage des lignes s'applique également aux vues de métadonnées pour les fonctions de table de file d'attente (RECEIVE_QUEUE_NAME et RENEWLEASE_QUEUE_NAME) :
GoogleSQL
PostgreSQL
Le rôle système spanner_info_reader et ses membres voient toujours un INFORMATION_SCHEMA non filtré.
Mises en garde et points à prendre en compte
Privilèges distincts pour l'exécution de TVF et les requêtes de file d'attente directes : accorder
SELECTsur la file d'attente n'accorde pasEXECUTEsur les fonctions de valeur de table associées (RECEIVE_QUEUE_NAMEouRENEWLEASE_QUEUE_NAME). De même, accorderEXECUTEsur la TVF n'accorde pasSELECTsur la file d'attente.- Si un rôle avec uniquement
SELECTdans la file d'attente tente d'exécuterRECEIVE_QUEUE_NAME(), Spanner renvoie une erreur indiquant que le rôle ne dispose pas des droits d'accès requis sur la fonction de tableRECEIVE_QUEUE_NAME. - Si un rôle avec uniquement
EXECUTEsur la TVF tente d'exécuterSELECT * FROM QUEUE_NAME, Spanner renvoie une erreur indiquant que le rôle ne dispose pas des droits d'accès requis sur la file d'attenteQUEUE_NAME.
- Si un rôle avec uniquement
Différence par rapport aux flux de modifications : contrairement aux consommateurs de flux de modifications (qui nécessitent à la fois
SELECTsur le flux etEXECUTEsur la fonction de lecture), les consommateurs de messages de file d'attente ne nécessitent queEXECUTEsur la TVFRECEIVE. Ils ne nécessitent pas deSELECTsur la file d'attente elle-même.Droits au niveau des colonnes non acceptés : contrairement aux tables, Spanner n'accepte pas les droits au niveau des colonnes sur les files d'attente (comme
GRANT SELECT (COLUMN_NAME) ON QUEUE). Les droits doivent être accordés sur l'objet de file d'attente dans son ensemble, car les files d'attente incluent des colonnes de métadonnées système internes.Séparation des rôles de producteur et de consommateur : nous vous recommandons de définir des rôles de base de données distincts pour les producteurs et les consommateurs de messages. Exemple :
- Un rôle de producteur avec uniquement
INSERTdans la file d'attente. - Un rôle de consommateur avec
EXECUTEsur les fonctionsRECEIVE_QUEUE_NAMEetRENEWLEASE_QUEUE_NAME, ainsi queDELETEsur la file d'attente si les messages sont acquittés avecDELETEou la mutationAck.
- Un rôle de producteur avec uniquement
LMD direct vs diffusion de TVF dans la file d'attente : les instructions
DELETEouUPDATEdirectes contournent la machine à états de location et de diffusion de la file d'attente. Nous vous recommandons de limiter ces droits aux rôles d'administrateur ou de maintenance.
Étapes suivantes
- Présentation des files d'attente
- Utiliser des files d'attente
- Scénarios et exemples de files d'attente
- Présentation du contrôle des accès précis des accès
- Droits d'contrôle des accès ultraprécis