Contrôle précis des accès pour les files d'attente

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 :

É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.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_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) :

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 SELECT sur la file d'attente n'accorde pas EXECUTE sur les fonctions de valeur de table associées (RECEIVE_QUEUE_NAME ou RENEWLEASE_QUEUE_NAME). De même, accorder EXECUTE sur la TVF n'accorde pas SELECT sur la file d'attente.

    • Si un rôle avec uniquement SELECT dans la file d'attente tente d'exécuter RECEIVE_QUEUE_NAME(), Spanner renvoie une erreur indiquant que le rôle ne dispose pas des droits d'accès requis sur la fonction de table RECEIVE_QUEUE_NAME.
    • Si un rôle avec uniquement EXECUTE sur la TVF tente d'exécuter SELECT * 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'attente QUEUE_NAME.
  • Différence par rapport aux flux de modifications : contrairement aux consommateurs de flux de modifications (qui nécessitent à la fois SELECT sur le flux et EXECUTE sur la fonction de lecture), les consommateurs de messages de file d'attente ne nécessitent que EXECUTE sur la TVF RECEIVE. Ils ne nécessitent pas de SELECT sur 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 INSERT dans la file d'attente.
    • Un rôle de consommateur avec EXECUTE sur les fonctions RECEIVE_QUEUE_NAME et RENEWLEASE_QUEUE_NAME, ainsi que DELETE sur la file d'attente si les messages sont acquittés avec DELETE ou la mutation Ack.
  • LMD direct vs diffusion de TVF dans la file d'attente : les instructions DELETE ou UPDATE directes 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