Contrôle des accès avec Identity and Access Management

Ce document décrit les options de contrôle des accès à votre disposition dans Pub/Sub.

Présentation

Pub/Sub utilise Identity and Access Management (IAM) pour le contrôle des accès.

IAM vous permet d'attribuer des rôles spécifiques à des utilisateurs, des groupes et des comptes de service, en leur accordant les autorisations nécessaires pour effectuer leurs tâches. Vous pouvez attribuer ces rôles IAM à l'aide de la consoleGoogle Cloud ou de l'API IAM.

Dans Pub/Sub, vous pouvez configurer le contrôle des accès au niveau du projet et au niveau de ressources individuelles. Voici quelques exemples d'utilisation du contrôle des accès Pub/Sub :

  • Accordez l'accès par ressource plutôt qu'à l'intégralité d'un projet Cloud.

  • Accordez un accès avec des fonctionnalités restreintes, par exemple en autorisant uniquement la publication de messages dans un sujet ou uniquement la consultation de messages d'un abonnement, mais pas la suppression du sujet ou de l'abonnement.

  • Accordez à un groupe de développeurs l'accès à toutes les ressources Pub/Sub au sein d'un projet.

Si vous disposez d'un accès en lecture seule à une seule ressource, telle qu'un thème ou un abonnement, vous ne pouvez pas afficher la ressource à l'aide de la console Google Cloud . Vous pouvez utiliser Google Cloud CLI pour afficher la ressource.

Pour une description détaillée d'IAM et de ses fonctionnalités, consultez la documentation IAM. et en particulier la page Accorder, modifier et révoquer les accès à des ressources.

Types de rôles dans Pub/Sub

Comme les autres produits Google Cloud , Pub/Sub accepte trois types de rôles :

  • Rôles de base : il s'agit de rôles très permissifs qui existaient avant la mise en place d'IAM. Pour en savoir plus sur les rôles de base, consultez Rôles de base.

  • Rôles prédéfinis : les rôles prédéfinis offrent un accès précis à des ressourcesGoogle Cloud spécifiques. Pour en savoir plus sur les rôles prédéfinis, consultez Rôles prédéfinis. Les rôles prédéfinis Pub/Sub sont inclus dans une partie ultérieure de cette section.

  • Rôles personnalisés : ils vous aident à appliquer le principe du moindre privilège. Pour en savoir plus sur les rôles personnalisés, consultez Rôles personnalisés.

Autorisations Pub/Sub requises

Les sections suivantes listent les autorisations Pub/Sub requises pour accéder aux différentes ressources Pub/Sub.

Autorisations requises pour les thèmes

Le tableau suivant présente les autorisations requises pour chaque méthode de l'API Pub/Sub liée aux thèmes. Il indique l'autorisation IAM requise pour appeler chaque méthode, ainsi qu'une description de ce que fait la méthode.

Méthode Description Autorisation requise
projects.topics.create Crée le sujet donné avec le nom donné. pubsub.topics.create sur le projet Cloud hôte
projects.topics.delete Supprime le sujet portant le nom spécifié. pubsub.topics.delete sur le sujet demandé
projects.topics.get Obtient la configuration d'un sujet. pubsub.topics.get sur le sujet demandé
projects.topics.getIamPolicy Récupère la stratégie IAM de contrôle des accès pour un sujet. pubsub.topics.getIamPolicy sur le sujet demandé
projects.topics.list Liste tous les thèmes. pubsub.topics.list sur le projet Cloud demandé
projects.topics.patch Met à jour un sujet existant. pubsub.topics.update sur le sujet demandé
projects.topics.publish Ajoute un ou plusieurs messages au sujet. pubsub.topics.publish sur le sujet demandé
projects.topics.setIamPolicy Définit la stratégie IAM de contrôle des accès pour un sujet. pubsub.topics.setIamPolicy sur le sujet demandé
projects.topics.testIamPermissions Renvoie les autorisations qu'un appelant a sur la ressource spécifiée. Aucun

Autorisations requises pour les abonnements

Le tableau suivant présente les autorisations requises pour chaque méthode de l'API Pub/Sub liée aux abonnements. Il indique l'autorisation IAM requise pour appeler chaque méthode, ainsi qu'une description de ce que fait la méthode.

Méthode Description Autorisation requise
projects.subscriptions.acknowledge Confirme les messages associés aux ack_ids dans AcknowledgeRequest. pubsub.subscriptions.consume sur l'abonnement demandé.
projects.subscriptions.create Crée un abonnement à un sujet donné. pubsub.subscriptions.create sur le projet Cloud hôte et pubsub.topics.attachSubscription sur le sujet demandé. Pour créer un abonnement S dans le projet A qui est associé à un sujet T dans le projet B, les autorisations appropriées doivent être accordées sur le projet A et sur le sujet T. Dans ce cas, les informations sur l'identité de l'utilisateur peuvent être capturées dans les journaux d'audit du projet B.
projects.subscriptions.delete Supprime un abonnement existant. pubsub.subscriptions.delete sur l'abonnement demandé.
projects.subscriptions.detach Dissocie un abonnement d'un sujet. pubsub.topics.detachSubscription sur le sujet auquel l'abonnement est associé.
projects.subscriptions.get Récupère les détails de configuration d'un abonnement. pubsub.subscriptions.get sur l'abonnement demandé.
projects.subscriptions.getIamPolicy Récupère la stratégie de contrôle des accès IAM pour un abonnement. pubsub.subscriptions.getIamPolicy sur l'abonnement demandé.
projects.subscriptions.list Liste les abonnements correspondants. pubsub.subscriptions.list sur le projet Cloud demandé
projects.subscriptions.modifyAckDeadline Modifie le délai de confirmation pour un message spécifique. pubsub.subscriptions.consume sur l'abonnement demandé.
projects.subscriptions.modifyPushConfig Modifie la configuration push pour un abonnement spécifié. pubsub.subscriptions.update sur l'abonnement demandé.
projects.subscriptions.patch Met à jour un abonnement existant. pubsub.subscriptions.update sur l'abonnement demandé.
projects.subscriptions.pull Récupère les messages du serveur. pubsub.subscriptions.consume sur l'abonnement demandé.
projects.subscriptions.seek Recherche un abonnement existant à un moment précis ou à un instantané. pubsub.subscriptions.consume sur l'abonnement demandé et pubsub.snapshots.seek sur l'instantané demandé, le cas échéant.
projects.subscriptions.setIamPolicy Définit la stratégie IAM de contrôle des accès pour un abonnement. pubsub.subscriptions.setIamPolicy sur l'abonnement demandé.
projects.subscriptions.testIamPermissions Renvoie les autorisations qu'un appelant a sur la ressource spécifiée. Aucun

Autorisations requises pour les schémas

Le tableau suivant présente les autorisations requises pour chaque méthode de l'API Pub/Sub liée aux schémas. Il indique l'autorisation IAM requise pour appeler chaque méthode, ainsi qu'une description de ce que fait la méthode.

Méthode Description Autorisation requise
projects.schemas.commit Valide une nouvelle révision du schéma. pubsub.schemas.commit sur le schéma demandé
projects.schemas.create Crée un schéma. pubsub.schemas.create sur le projet Cloud hôte
projects.schemas.delete Supprime un schéma. pubsub.schemas.delete sur le schéma demandé
projects.schemas.deleteRevision Supprime une révision de schéma spécifique. pubsub.schemas.delete sur le schéma demandé
projects.schemas.get Permet d'obtenir un schéma. pubsub.schemas.get sur le schéma demandé
projects.schemas.getIamPolicy Récupère la stratégie IAM de contrôle des accès pour un schéma. pubsub.schemas.getIamPolicy sur le schéma demandé
projects.schemas.list Répertorie les schémas d'un projet. pubsub.schemas.list sur le projet Cloud demandé
projects.schemas.listRevisions Liste toutes les révisions de schéma pour le schéma nommé. pubsub.schemas.listRevisions sur le schéma demandé
projects.schemas.rollback Crée une révision de schéma à partir d'une révision précédente. pubsub.schemas.rollback sur le schéma demandé
projects.schemas.validate Valide une définition de schéma. pubsub.schemas.validate sur le projet Cloud hôte
projects.schemas.validateMessage Valide un message par rapport à un schéma. pubsub.schemas.validate sur le projet Cloud hôte

Autorisations requises pour les instantanés

Le tableau suivant présente les autorisations requises pour chaque méthode de l'API Pub/Sub liée aux instantanés. Il indique l'autorisation IAM requise pour appeler chaque méthode, ainsi qu'une description de ce que fait la méthode.

Méthode REST Description Autorisation requise
projects.snapshots.create Crée un instantané à partir de l'abonnement demandé. pubsub.snapshots.create sur le projet Cloud hôte et pubsub.subscriptions.consume sur l'abonnement source.
projects.snapshots.delete Supprime un instantané existant. pubsub.snapshots.delete sur l'instantané demandé
projects.snapshots.getIamPolicy Récupère la stratégie IAM de contrôle des accès pour un instantané. pubsub.snapshots.getIamPolicy sur l'instantané demandé
projects.snapshots.list Liste les instantanés existants. pubsub.snapshots.list sur le projet Cloud demandé
projects.snapshots.patch Met à jour un instantané existant. pubsub.snapshots.update sur l'instantané demandé
projects.snapshots.setIamPolicy Définit la stratégie de contrôle des accès IAM pour un instantané. pubsub.snapshots.setIamPolicy sur l'instantané demandé
projects.snapshots.testIamPermissions Renvoie les autorisations qu'un appelant a sur la ressource spécifiée. Aucun

Rôles Pub/Sub disponibles

Le tableau suivant répertorie tous les rôles Pub/Sub et les autorisations associées à chacun d'eux :

Role Permissions

(roles/pubsub.admin)

Provides full access to topics and subscriptions.

Lowest-level resources where you can grant this role:

  • Schema
  • Snapshot
  • Subscription
  • Topic

cloudkms.keyHandles.*

  • cloudkms.keyHandles.create
  • cloudkms.keyHandles.get
  • cloudkms.keyHandles.list

cloudkms.operations.get

cloudkms.projects.showEffectiveAutokeyConfig

pubsub.*

  • pubsub.messageTransforms.validate
  • pubsub.schemas.attach
  • pubsub.schemas.commit
  • pubsub.schemas.create
  • pubsub.schemas.delete
  • pubsub.schemas.get
  • pubsub.schemas.getIamPolicy
  • pubsub.schemas.list
  • pubsub.schemas.listRevisions
  • pubsub.schemas.rollback
  • pubsub.schemas.setIamPolicy
  • pubsub.schemas.validate
  • pubsub.snapshots.create
  • pubsub.snapshots.createTagBinding
  • pubsub.snapshots.delete
  • pubsub.snapshots.deleteTagBinding
  • pubsub.snapshots.get
  • pubsub.snapshots.getIamPolicy
  • pubsub.snapshots.list
  • pubsub.snapshots.listEffectiveTags
  • pubsub.snapshots.listTagBindings
  • pubsub.snapshots.seek
  • pubsub.snapshots.setIamPolicy
  • pubsub.snapshots.update
  • pubsub.subscriptions.consume
  • pubsub.subscriptions.create
  • pubsub.subscriptions.createTagBinding
  • pubsub.subscriptions.delete
  • pubsub.subscriptions.deleteTagBinding
  • pubsub.subscriptions.get
  • pubsub.subscriptions.getIamPolicy
  • pubsub.subscriptions.list
  • pubsub.subscriptions.listEffectiveTags
  • pubsub.subscriptions.listTagBindings
  • pubsub.subscriptions.setIamPolicy
  • pubsub.subscriptions.update
  • pubsub.topics.attachSubscription
  • pubsub.topics.create
  • pubsub.topics.createTagBinding
  • pubsub.topics.delete
  • pubsub.topics.deleteTagBinding
  • pubsub.topics.detachSubscription
  • pubsub.topics.get
  • pubsub.topics.getIamPolicy
  • pubsub.topics.list
  • pubsub.topics.listEffectiveTags
  • pubsub.topics.listTagBindings
  • pubsub.topics.publish
  • pubsub.topics.setIamPolicy
  • pubsub.topics.update
  • pubsub.topics.updateTag

resourcemanager.projects.get

serviceusage.consumerpolicy.analyze

serviceusage.consumerpolicy.get

serviceusage.effectivepolicy.get

serviceusage.groups.*

  • serviceusage.groups.list
  • serviceusage.groups.listExpandedMembers
  • serviceusage.groups.listMembers

serviceusage.quotas.get

serviceusage.services.get

serviceusage.services.list

serviceusage.values.test

(roles/pubsub.editor)

Provides access to modify topics and subscriptions, and access to publish and consume messages.

Lowest-level resources where you can grant this role:

  • Schema
  • Snapshot
  • Subscription
  • Topic

cloudkms.keyHandles.*

  • cloudkms.keyHandles.create
  • cloudkms.keyHandles.get
  • cloudkms.keyHandles.list

cloudkms.operations.get

cloudkms.projects.showEffectiveAutokeyConfig

pubsub.messageTransforms.validate

pubsub.schemas.attach

pubsub.schemas.commit

pubsub.schemas.create

pubsub.schemas.delete

pubsub.schemas.get

pubsub.schemas.list

pubsub.schemas.listRevisions

pubsub.schemas.rollback

pubsub.schemas.validate

pubsub.snapshots.create

pubsub.snapshots.createTagBinding

pubsub.snapshots.delete

pubsub.snapshots.deleteTagBinding

pubsub.snapshots.get

pubsub.snapshots.list

pubsub.snapshots.listEffectiveTags

pubsub.snapshots.listTagBindings

pubsub.snapshots.seek

pubsub.snapshots.update

pubsub.subscriptions.consume

pubsub.subscriptions.create

pubsub.subscriptions.createTagBinding

pubsub.subscriptions.delete

pubsub.subscriptions.deleteTagBinding

pubsub.subscriptions.get

pubsub.subscriptions.list

pubsub.subscriptions.listEffectiveTags

pubsub.subscriptions.listTagBindings

pubsub.subscriptions.update

pubsub.topics.attachSubscription

pubsub.topics.create

pubsub.topics.createTagBinding

pubsub.topics.delete

pubsub.topics.deleteTagBinding

pubsub.topics.detachSubscription

pubsub.topics.get

pubsub.topics.list

pubsub.topics.listEffectiveTags

pubsub.topics.listTagBindings

pubsub.topics.publish

pubsub.topics.update

pubsub.topics.updateTag

resourcemanager.projects.get

serviceusage.consumerpolicy.analyze

serviceusage.consumerpolicy.get

serviceusage.effectivepolicy.get

serviceusage.groups.*

  • serviceusage.groups.list
  • serviceusage.groups.listExpandedMembers
  • serviceusage.groups.listMembers

serviceusage.quotas.get

serviceusage.services.get

serviceusage.services.list

serviceusage.values.test

(roles/pubsub.publisher)

Provides access to publish messages to a topic.

Lowest-level resources where you can grant this role:

  • Topic

pubsub.topics.publish

(roles/pubsub.subscriber)

Provides access to consume messages from a subscription and to attach subscriptions to a topic.

Lowest-level resources where you can grant this role:

  • Snapshot
  • Subscription
  • Topic

pubsub.snapshots.seek

pubsub.subscriptions.consume

pubsub.topics.attachSubscription

(roles/pubsub.viewer)

Provides access to view topics and subscriptions.

Lowest-level resources where you can grant this role:

  • Schema
  • Snapshot
  • Subscription
  • Topic

pubsub.messageTransforms.validate

pubsub.schemas.get

pubsub.schemas.list

pubsub.schemas.listRevisions

pubsub.schemas.validate

pubsub.snapshots.get

pubsub.snapshots.list

pubsub.snapshots.listEffectiveTags

pubsub.snapshots.listTagBindings

pubsub.subscriptions.get

pubsub.subscriptions.list

pubsub.subscriptions.listEffectiveTags

pubsub.subscriptions.listTagBindings

pubsub.topics.get

pubsub.topics.list

pubsub.topics.listEffectiveTags

pubsub.topics.listTagBindings

resourcemanager.projects.get

serviceusage.consumerpolicy.analyze

serviceusage.consumerpolicy.get

serviceusage.effectivepolicy.get

serviceusage.groups.*

  • serviceusage.groups.list
  • serviceusage.groups.listExpandedMembers
  • serviceusage.groups.listMembers

serviceusage.quotas.get

serviceusage.services.get

serviceusage.services.list

serviceusage.values.test

Service agent roles

Service agent roles should only be granted to service agents.

Role Permissions

(roles/pubsub.serviceAgent)

Grants Cloud Pub/Sub Service Account access to manage resources.

iam.serviceAccounts.get

iam.serviceAccounts.getAccessToken

iam.serviceAccounts.getOpenIdToken

iam.serviceAccounts.implicitDelegation

iam.serviceAccounts.list

iam.serviceAccounts.signBlob

iam.serviceAccounts.signJwt

resourcemanager.projects.get

resourcemanager.projects.list

serviceusage.services.use

Contrôler les accès via la console Google Cloud

Vous pouvez utiliser la console Google Cloud pour gérer le contrôle des accès à vos thèmes et vos projets.

Pour définir les contrôles d'accès au niveau du projet, procédez comme suit :

  1. Dans la console Google Cloud , accédez à la page IAM.

    Accéder à IAM

  2. Sélectionnez votre projet.

  3. Cliquez sur Ajouter.

  4. Saisissez un ou plusieurs noms de comptes principaux.

  5. Dans la liste Sélectionner un rôle, sélectionnez le rôle que vous souhaitez attribuer.

  6. Cliquez sur Enregistrer.

  7. Vérifiez que le compte principal est bien répertorié avec le rôle que vous lui avez accordé.

Pour définir le contrôle des accès aux sujets et aux abonnements, procédez comme suit :

  1. Dans la console Google Cloud , accédez à la liste Sujets de Pub/Sub.

    Accéder aux sujets

  2. Si nécessaire, sélectionnez le projet que vous avez activé pour Pub/Sub.

  3. Effectuez l'une des opérations suivantes :

    • Pour définir des rôles pour un ou plusieurs thèmes, sélectionnez-les.

    • Pour définir des rôles pour un abonnement associé à un sujet, cliquez sur l'ID du sujet. Sur la page Détails du sujet, cliquez sur l'ID de l'abonnement. La page Détails de l'abonnement s'affiche.

  4. Si le panneau d'informations est masqué, cliquez sur Afficher le panneau d'informations.

  5. Dans l'onglet Autorisations, cliquez sur Ajouter un compte principal.

  6. Saisissez un ou plusieurs noms de comptes principaux.

  7. Dans la liste Sélectionner un rôle, sélectionnez le rôle que vous souhaitez attribuer.

  8. Cliquez sur Enregistrer.

Contrôler les accès via l'API IAM

L'API Cloud IAM pour Pub/Sub vous permet de définir et d'obtenir des stratégies sur des sujets et des abonnements individuels au sein d'un projet, ainsi que de tester les autorisations d'un utilisateur pour une ressource donnée. Comme avec les méthodes Pub/Sub classiques, vous pouvez appeler les méthodes de l'API Cloud IAM via les bibliothèques clientes, l'explorateur d'API ou directement via HTTP.

Notez que l'API Cloud IAM pour Pub/Sub ne permet pas de gérer les stratégies au niveau du projet Google Cloud .

Dans les sections suivantes, vous trouverez des exemples illustrant la procédure à suivre pour définir et obtenir une stratégie, ainsi que pour tester les autorisations dont dispose un appelant pour une ressource donnée.

Obtenir une politique

La méthode getIamPolicy() vous permet d'obtenir une stratégie existante. Cette méthode renvoie un objet JSON contenant la stratégie associée à la ressource.

Voici un exemple de code permettant d'obtenir la stratégie applicable à un abonnement :

C#

Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C# qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub pour C#.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class GetSubscriptionIamPolicySample
{
    public Policy GetSubscriptionIamPolicy(string projectId, string subscriptionId)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);
        Policy policy = publisher.IAMPolicyClient.GetIamPolicy(new GetIamPolicyRequest
        {
            ResourceAsResourceName = subscriptionName
        });
        return policy;
    }
}

gcloud

Pour obtenir la stratégie d'abonnement, procédez comme suit :

gcloud pubsub subscriptions get-iam-policy \
   projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \
   --format json

Sortie :

   {
     "etag": "BwUjMhCsNvY=",
     "bindings": [
       {
         "role": "roles/pubsub.admin",
         "members": [
           "user:user-1@gmail.com"
         ]
       },
       {
         "role": "roles/pubsub.editor",
         "members": [
           "serviceAccount:service-account-2@appspot.gserviceaccount.com",
           "user:user-3@gmail.com"
         ]
       }
     ]
   }

Go

L'exemple suivant utilise la version majeure de la bibliothèque cliente Go Pub/Sub (v2). Si vous utilisez encore la bibliothèque v1, consultez le guide de migration vers la v2. Pour consulter la liste des exemples de code de la version 1, consultez les exemples de code obsolètes.

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub pour Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func getIAMPolicy(w io.Writer, projectID, subscription string) error {
	// projectID := "my-project-id"