Contrôle des accès

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

  1. Présentation
  2. Autorisations et rôles
    1. Autorisations requises
    2. Rôles
  3. Contrôle des accès via la console GCP
  4. Contrôle des accès via l'API Cloud Pub/Sub IAM
    1. Obtenir une stratégie
    2. Définir une stratégie
    3. Tester les autorisations
  5. Exemple de cas d'utilisation : communication entre projets
  6. Comportement de disponibilité partielle

Présentation

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

Dans Cloud Pub/Sub, vous pouvez configurer le contrôle des accès au niveau du projet et au niveau de ressources individuelles. Exemple :

  • Accordez l'accès par sujet ou par abonnement 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 Cloud Pub/Sub au sein d'un projet.

Pour obtenir une description détaillée de l'IAM et de ses fonctionnalités, consultez le guide du développeur sur Cloud Identity and Access Management, en particulier la section sur la gestion des stratégies IAM.

Pour appeler une méthode Cloud Pub/Sub, l'utilisateur doit disposer des autorisations requises. Pour obtenir la liste des autorisations et des rôles gérés par IAM pour Cloud Pub/Sub, consultez la section suivante.

Autorisations et rôles

Cette section récapitule les autorisations et les rôles gérés par IAM pour Cloud Pub/Sub.

Autorisations requises

Le tableau suivant répertorie les autorisations dont l'appelant doit disposer pour appeler chaque méthode :

Méthode Autorisation(s) requise(s)
projects.subscriptions.acknowledge pubsub.subscriptions.consume sur l'abonnement demandé.
projects.subscriptions.create pubsub.subscriptions.create sur le projet Cloud hôte et pubsub.topics.attachSubscription sur le sujet demandé. Notez que pour créer un abonnement au sein du projet A sur un sujet S du projet B, les autorisations appropriées doivent être accordées sur le projet A et sur le sujet S.
projects.subscriptions.delete pubsub.subscriptions.delete sur l'abonnement demandé.
projects.subscriptions.get pubsub.subscriptions.get sur l'abonnement demandé.
projects.subscriptions.getIamPolicy pubsub.subscriptions.getIamPolicy sur l'abonnement demandé.
projects.subscriptions.list pubsub.subscriptions.list sur le projet Cloud demandé.
projects.subscriptions.modifyAckDeadline pubsub.subscriptions.consume sur l'abonnement demandé.
projects.subscriptions.modifyPushConfig pubsub.subscriptions.update sur l'abonnement demandé.
projects.subscriptions.pull pubsub.subscriptions.consume sur l'abonnement demandé.
projects.subscriptions.setIamPolicy pubsub.subscriptions.setIamPolicy sur l'abonnement demandé.
projects.subscriptions.testIamPermissions Aucune.
projects.topics.create pubsub.topics.create sur le projet Cloud hôte.
projects.topics.delete pubsub.topics.delete sur le sujet demandé.
projects.topics.get pubsub.topics.get sur le sujet demandé.
projects.topics.getIamPolicy pubsub.topics.getIamPolicy sur le sujet demandé.
projects.topics.list pubsub.topics.list sur le projet Cloud demandé.
projects.topics.publish pubsub.topics.publish sur le sujet demandé.
projects.topics.setIamPolicy pubsub.topics.setIamPolicy sur le sujet demandé.
projects.topics.testIamPermissions Aucune.
projects.topics.subscriptions.list pubsub.topics.get sur le sujet demandé.

Rôles

Le tableau suivant répertorie les rôles Cloud IAM pour Cloud Pub/Sub, ainsi que la liste de toutes les autorisations incluses dans chaque rôle. Notez que chaque autorisation est applicable à un type de ressource particulier.

Ces rôles préconfigurés répondent à de nombreux cas d'utilisation typiques. Cependant, vous pouvez avoir besoin d'un rôle comprenant un ensemble d'autorisations personnalisé. Par exemple, imaginons que vous souhaitez créer un rôle permettant à un utilisateur de créer un abonnement dans un projet, sans l'autoriser à supprimer ou mettre à jour des sujets ou des abonnements existants dans le projet. Dans ce cas, vous pouvez envisager de créer un rôle Cloud IAM personnalisé répondant à vos besoins.

Rôle Autorisation(s) associée(s) Type de ressource concerné
roles/pubsub.publisher pubsub.topics.publish Sujet
roles/pubsub.subscriber
pubsub.subscriptions.consume Abonnement
pubsub.topics.attachSubscription Sujet
roles/pubsub.viewer ou
roles/viewer
pubsub.topics.list Projet
pubsub.topics.get Sujet
pubsub.subscriptions.list Projet
pubsub.subscriptions.get Abonnement
roles/pubsub.editor ou
roles/editor
Tout ce qui précède, ainsi que :
pubsub.topics.create Projet
pubsub.topics.delete Sujet
pubsub.topics.update Sujet
pubsub.subscriptions.create Projet
pubsub.subscriptions.delete Abonnement
pubsub.subscriptions.update Abonnement
roles/pubsub.admin ou
roles/owner
Tout ce qui précède, ainsi que :
pubsub.topics.getIamPolicy Sujet
pubsub.topics.setIamPolicy Sujet
pubsub.subscriptions.getIamPolicy Abonnement
pubsub.subscriptions.setIamPolicy Abonnement
Sachez que les rôles roles/owner, roles/editor et roles/viewer incluent également des autorisations pour les autres services Google Cloud Platform.

Contrôle des accès via la console GCP

Vous pouvez utiliser la console GCP pour gérer le contrôle d'accès pour vos sujets et projets.

Pour définir les autorisations d'accès au niveau du projet :

  1. Ouvrez la page IAM dans la console Google Cloud Platform.
  2. Sélectionnez votre projet, puis cliquez sur Continuer.
  3. Cliquez sur AJOUTER UN MEMBRE.
  4. Saisissez l'adresse e-mail d'un nouveau membre à qui vous n'avez encore jamais attribué de rôle IAM.
  5. Sélectionnez le rôle souhaité dans le menu déroulant.
  6. Cliquez sur Ajouter.
  7. Vérifiez que le membre 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. Accédez à la page des sujets Pub/Sub dans la console GCP, puis cliquez sur le projet que vous avez activé pour Cloud Pub/Sub.
  2. Sélectionnez le sujet ou l'abonnement pour lequel vous souhaitez définir les autorisations.

    Vous pouvez définir des autorisations pour plusieurs sujets à la fois. Si vous souhaitez définir les autorisations pour un abonnement à un sujet, développez le sujet et cliquez sur l'abonnement pour l'ouvrir dans sa propre page.

  3. Cliquez sur Autorisations. Un volet "Autorisations" s'affiche sur le côté de l'écran.
  4. Saisissez un ou plusieurs noms de membres, sélectionnez un rôle dans le menu déroulant situé à droite, puis cliquez sur Ajouter.

Contrôle des accès via l'API Cloud Pub/Sub IAM

L'API Cloud Pub/Sub IAM 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 Cloud Pub/Sub classiques, vous pouvez appeler les méthodes IAM via les bibliothèques clientes, l'explorateur d'API ou directement via HTTP.

Notez que l'API Cloud Pub/Sub IAM ne permet pas de gérer les stratégies au niveau du projet 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 stratégie

La méthode getIamPolicy() vous permet d'obtenir une stratégie précédemment définie. 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 de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
Policy policy = publisher.GetIamPolicy(subscriptionName.ToString());
Console.WriteLine($"Subscription IAM Policy found for {subscriptionId}:");
Console.WriteLine(policy.Bindings);

COMMANDE GCLOUD

Enregistrez la stratégie relative au sujet :

gcloud beta pubsub subscriptions get-iam-policy projects/{your_project}/subscriptions/ \
{your_topic} --format json > subscription_policy.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

Avant d'essayer cet exemple, suivez les instructions de configuration de Go décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Go.

policy, err := c.Subscription(subName).IAM().Policy(ctx)
if err != nil {
	return nil, err
}
for _, role := range policy.Roles() {
	log.Printf("%q: %q", role, policy.Members(role))
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  Policy policy = subscriptionAdminClient.getIamPolicy(subscriptionName.toString());
  if (policy == null) {
    // subscription was not found
  }
  return policy;
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Node.js.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

// Retrieves the IAM policy for the subscription
const [policy] = await pubsub.subscription(subscriptionName).iam.getPolicy();
console.log(`Policy for subscription: ${JSON.stringify(policy.bindings)}.`);

PHP

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour PHP.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the policy for a PubSub subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function get_subscription_policy($projectId, $subscriptionName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $policy = $subscription->iam()->policy();
    print_r($policy);
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Python.

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

policy = client.get_iam_policy(subscription_path)

print('Policy for subscription {}:'.format(subscription_path))
for binding in policy.bindings:
    print('Role: {}, Members: {}'.format(binding.role, binding.members))

Ruby

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Ruby.

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
policy       = subscription.policy

puts "Subscription policy:"
puts policy.roles

Voici un exemple de code permettant d'obtenir une stratégie applicable à un sujet :

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

TopicName topicName = new TopicName(projectId, topicId);
Policy policy = publisher.GetIamPolicy(topicName.ToString());
Console.WriteLine($"Topic IAM Policy found for {topicId}:");
Console.WriteLine(policy.Bindings);

COMMANDE GCLOUD

Obtenir la stratégie relative au sujet

gcloud beta pubsub topics get-iam-policy projects/{your_project}/topics/{your_topic} \
--format json > topic_policy.json

Sortie :

    {
      "etag": "BwUjMhCsNvY=",
      "bindings": [
        {
          "role":" roles/pubsub.viewer",
          "members": [
            "user:user-1@gmail.com"
          ]
        }
      ]
    }

Go

Avant d'essayer cet exemple, suivez les instructions de configuration de Go décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Go.

policy, err := c.Topic(topicName).IAM().Policy(ctx)
if err != nil {
	return nil, err
}
for _, role := range policy.Roles() {
	log.Print(policy.Members(role))
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
  Policy policy = topicAdminClient.getIamPolicy(topicName.toString());
  if (policy == null) {
    // topic iam policy was not found
  }
  return policy;
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Node.js.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

// Retrieves the IAM policy for the topic
const [policy] = await pubsub.topic(topicName).iam.getPolicy();
console.log(`Policy for topic: %j.`, policy.bindings);

PHP

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour PHP.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the policy for a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function get_topic_policy($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $policy = $topic->iam()->policy();
    print_r($policy);
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Python.

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

policy = client.get_iam_policy(topic_path)

print('Policy for topic {}:'.format(topic_path))
for binding in policy.bindings:
    print('Role: {}, Members: {}'.format(binding.role, binding.members))

Ruby

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Ruby.

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic  = pubsub.topic topic_name
policy = topic.policy

puts "Topic policy:"
puts policy.roles

Définir une stratégie

La méthode setIamPolicy() vous permet d'associer une stratégie à une ressource. La méthode setIamPolicy() prend un message SetIamPolicyRequest qui contient la stratégie à appliquer et la ressource à laquelle la stratégie est associée. Il renvoie la stratégie qui en résulte.

Voici un exemple de code permettant de définir une stratégie pour un abonnement :

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

Policy policy = new Policy
{
    Bindings =
    {
        new Binding { Role = roleToBeAddedToPolicy,
            Members = { member } }
    }
};
SetIamPolicyRequest request = new SetIamPolicyRequest
{
    Resource = new SubscriptionName(projectId, subscriptionId).ToString(),
    Policy = policy
};
Policy response = publisher.SetIamPolicy(request);
Console.WriteLine($"Subscription IAM Policy updated: {response}");

COMMANDE GCLOUD

1. Obtenez la stratégie relative à l'abonnement.

gcloud beta pubsub subscriptions get-iam-policy projects/{your_project}/subscriptions/ \
{your_subscription} --format json > subscription_policy.json

2. Ouvrez subscription_policy.json et mettez à jour les liaisons en attribuant les rôles appropriés aux membres appropriés. Pour plus d'informations sur l'utilisation des fichiers subscription_policy.json, consultez le document relatif aux stratégies Cloud Identity and Access Management.

    {
      "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"
        }
      ]
    }

3. Appliquez la nouvelle stratégie d'abonnement.

gcloud beta pubsub subscriptions set-iam-policy projects/{your_project}/subscriptions/ \
{your_subscription} subscription_policy.json

Go

Avant d'essayer cet exemple, suivez les instructions de configuration de Go décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Go.

sub := c.Subscription(subName)
policy, err := sub.IAM().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
policy.Add(iam.AllUsers, iam.Viewer)
policy.Add("group:cloud-logs@google.com", iam.Editor)
if err := sub.IAM().SetPolicy(ctx, policy); err != nil {
	return err
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  Policy policy = subscriptionAdminClient.getIamPolicy(subscriptionName.toString());
  // Create a role => members binding
  Binding binding =
      Binding.newBuilder()
          .setRole(Role.viewer().toString())
          .addMembers(Identity.allAuthenticatedUsers().toString())
          .build();
  // Update policy
  Policy updatedPolicy = policy.toBuilder().addBindings(binding).build();

  updatedPolicy =
      subscriptionAdminClient.setIamPolicy(subscriptionName.toString(), updatedPolicy);
  return updatedPolicy;
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Node.js.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

// The new IAM policy
const newPolicy = {
  bindings: [
    {
      // Add a group as editors
      role: `roles/pubsub.editor`,
      members: [`group:cloud-logs@google.com`],
    },
    {
      // Add all users as viewers
      role: `roles/pubsub.viewer`,
      members: [`allUsers`],
    },
  ],
};

// Updates the IAM policy for the subscription
const [updatedPolicy] = await pubsub
  .subscription(subscriptionName)
  .iam.setPolicy(newPolicy);
console.log(`Updated policy for subscription: %j`, updatedPolicy.bindings);

PHP

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour PHP.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Adds a user to the policy for a Pub/Sub subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 * @param string $userEmail  The user email to add to the policy.
 */
function set_subscription_policy($projectId, $subscriptionName, $userEmail)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $policy = $subscription->iam()->policy();
    $policy['bindings'][] = [
        'role' => 'roles/pubsub.subscriber',
        'members' => ['user:' . $userEmail]
    ];
    $subscription->iam()->setPolicy($policy);

    printf('User %s added to policy for %s' . PHP_EOL,
        $userEmail,
        $subscriptionName);
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Python.

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

policy = client.get_iam_policy(subscription_path)

# Add all users as viewers.
policy.bindings.add(
    role='roles/pubsub.viewer',
    members=['allUsers'])

# Add a group as an editor.
policy.bindings.add(
    role='roles/editor',
    members=['group:cloud-logs@google.com'])

# Set the policy
policy = client.set_iam_policy(subscription_path, policy)

print('IAM policy for subscription {} set: {}'.format(
    subscription_name, policy))

Ruby

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Ruby.

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
subscription.policy do |policy|
  policy.add "roles/pubsub.subscriber",
             "serviceAccount:account-name@project-name.iam.gserviceaccount.com"
end

Voici un exemple de code permettant de définir une stratégie pour un sujet :

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

Policy policy = new Policy
{
    Bindings =
        {
            new Binding { Role = roleToBeAddedToPolicy,
                Members = { member } }
        }
};
SetIamPolicyRequest request = new SetIamPolicyRequest
{
    Resource = new TopicName(projectId, topicId).ToString(),
    Policy = policy
};
Policy response = publisher.SetIamPolicy(request);
Console.WriteLine($"Topic IAM Policy updated: {response}");

COMMANDE GCLOUD

1. Obtenez la stratégie relative au sujet.

gcloud beta pubsub topics get-iam-policy projects/{your_project}/topics/{your_topic} \
--format json > topic_policy.json

2. Ouvrez topic_policy.json et mettez à jour les liaisons en attribuant les rôles appropriés aux membres appropriés. Pour plus d'informations sur l'utilisation des fichiers subscription_policy.json, consultez le document relatif aux stratégies Cloud Identity and Access Management.

    {
      "etag": "BwUjMhCsNvY=",
      "bindings": [
        {
          "role": "roles/pubsub.editor",
          "members": [
            "user:user-1@gmail.com",
            "user:user-2@gmail.com"
          ]
        }
      ]
    }

3. Appliquez la nouvelle stratégie relative au sujet.

gcloud beta pubsub topics set-iam-policy projects/{your_project}/ \
topics/{your_topic} topic_policy.json

Go

Avant d'essayer cet exemple, suivez les instructions de configuration de Go décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Go.

topic := c.Topic(topicName)
policy, err := topic.IAM().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
policy.Add(iam.AllUsers, iam.Viewer)
policy.Add("group:cloud-logs@google.com", iam.Editor)
if err := topic.IAM().SetPolicy(ctx, policy); err != nil {
	log.Fatalf("SetPolicy: %v", err)
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  String topicName = ProjectTopicName.format(projectId, topicId);
  Policy policy = topicAdminClient.getIamPolicy(topicName);
  // add role -> members binding
  Binding binding =
      Binding.newBuilder()
          .setRole(Role.viewer().toString())
          .addMembers(Identity.allAuthenticatedUsers().toString())
          .build();
  // create updated policy
  Policy updatedPolicy = Policy.newBuilder(policy).addBindings(binding).build();
  updatedPolicy = topicAdminClient.setIamPolicy(topicName, updatedPolicy);
  return updatedPolicy;
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Node.js.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

// The new IAM policy
const newPolicy = {
  bindings: [
    {
      // Add a group as editors
      role: `roles/pubsub.editor`,
      members: [`group:cloud-logs@google.com`],
    },
    {
      // Add all users as viewers
      role: `roles/pubsub.viewer`,
      members: [`allUsers`],
    },
  ],
};

// Updates the IAM policy for the topic
const [updatedPolicy] = await pubsub
  .topic(topicName)
  .iam.setPolicy(newPolicy);
console.log(`Updated policy for topic: %j`, updatedPolicy.bindings);

PHP

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour PHP.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Adds a user to the policy for a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 * @param string $userEmail  The user email to add to the policy.
 */
function set_topic_policy($projectId, $topicName, $userEmail)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $policy = $topic->iam()->policy();
    $policy['bindings'][] = [
        'role' => 'roles/pubsub.publisher',
        'members' => ['user:' . $userEmail]
    ];
    $topic->iam()->setPolicy($policy);

    printf('User %s added to policy for %s' . PHP_EOL,
        $userEmail,
        $topicName);
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Python.

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

policy = client.get_iam_policy(topic_path)

# Add all users as viewers.
policy.bindings.add(
    role='roles/pubsub.viewer',
    members=['allUsers'])

# Add a group as a publisher.
policy.bindings.add(
    role='roles/pubsub.publisher',
    members=['group:cloud-logs@google.com'])

# Set the policy
policy = client.set_iam_policy(topic_path, policy)

print('IAM policy for topic {} set: {}'.format(
    topic_name, policy))

Ruby

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Ruby.

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic = pubsub.topic topic_name
topic.policy do |policy|
  policy.add "roles/pubsub.publisher",
             "serviceAccount:account_name@project_name.iam.gserviceaccount.com"
end

Tester les autorisations

Vous pouvez utiliser la méthode testIamPermissions() afin de tester les autorisations dont dispose l'appelant sur une ressource donnée. Elle prend comme paramètres un nom de ressource et un ensemble d'autorisations, et renvoie le sous-ensemble d'autorisations que possède l'appelant.

Voici un exemple de code permettant de tester les autorisations sur un abonnement :

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

List<string> permissions = new List<string>();
permissions.Add("pubsub.subscriptions.get");
permissions.Add("pubsub.subscriptions.update");
TestIamPermissionsRequest request = new TestIamPermissionsRequest
{
    Resource = new SubscriptionName(_projectId, subscriptionId).ToString(),
    Permissions = { permissions }
};
TestIamPermissionsResponse response = publisher.TestIamPermissions(request);
return response;

COMMANDE GCLOUD

gcloud iam list-testable-permissions https://pubsub.googleapis.com/v1/projects/ \
{your_project}/subscriptions/{your_subscription} --format json

Sortie :

  [
    {
      "name": "pubsub.subscriptions.consume",
      "stage": "GA"
    },
    {
      "name": "pubsub.subscriptions.delete",
      "stage": "GA"
    },
    {
      "name": "pubsub.subscriptions.get",
      "stage": "GA"
    },
    {
      "name": "pubsub.subscriptions.getIamPolicy",
      "stage": "GA"
     },
    {
      "name": "pubsub.subscriptions.setIamPolicy",
      "stage": "GA"
    },
    {
      "name": "pubsub.subscriptions.update",
      "stage": "GA"
    }
  ]

Go

Avant d'essayer cet exemple, suivez les instructions de configuration de Go décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Go.

sub := c.Subscription(subName)
perms, err := sub.IAM().TestPermissions(ctx, []string{
	"pubsub.subscriptions.consume",
	"pubsub.subscriptions.update",
})
if err != nil {
	return nil, err
}
for _, perm := range perms {
	log.Printf("Allowed: %v", perm)
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  List<String> permissions = new LinkedList<>();
  permissions.add("pubsub.subscriptions.get");
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  TestIamPermissionsResponse testedPermissions =
      topicAdminClient.testIamPermissions(subscriptionName.toString(), permissions);
  return testedPermissions;
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Node.js.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

const permissionsToTest = [
  `pubsub.subscriptions.consume`,
  `pubsub.subscriptions.update`,
];

// Tests the IAM policy for the specified subscription
const [permissions] = await pubsub
  .subscription(subscriptionName)
  .iam.testPermissions(permissionsToTest);
console.log(`Tested permissions for subscription: %j`, permissions);

PHP

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour PHP.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the permissions of a subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function test_subscription_permissions($projectId, $subscriptionName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $permissions = $subscription->iam()->testPermissions([
        'pubsub.subscriptions.consume',
        'pubsub.subscriptions.update'
    ]);
    foreach ($permissions as $permission) {
        printf('Permission: %s' . PHP_EOL, $permission);
    }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Python.

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

permissions_to_check = [
    'pubsub.subscriptions.consume',
    'pubsub.subscriptions.update'
]

allowed_permissions = client.test_iam_permissions(
    subscription_path, permissions_to_check)

print('Allowed permissions for subscription {}: {}'.format(
    subscription_path, allowed_permissions))

Ruby

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Ruby.

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
permissions  = subscription.test_permissions "pubsub.subscriptions.consume",
                                             "pubsub.subscriptions.update"

puts "Permission to consume" if permissions.include? "pubsub.subscriptions.consume"
puts "Permission to update" if permissions.include? "pubsub.subscriptions.update"

Voici un exemple de code permettant de tester les autorisations sur un sujet :

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

List<string> permissions = new List<string>();
permissions.Add("pubsub.topics.get");
permissions.Add("pubsub.topics.update");
TestIamPermissionsRequest request = new TestIamPermissionsRequest
{
    Resource = new TopicName(_projectId, topicId).ToString(),
    Permissions = { permissions }
};
TestIamPermissionsResponse response = publisher.TestIamPermissions(request);
return response;

COMMANDE GCLOUD

gcloud beta iam list-testable-permissions https://pubsub.googleapis.com/v1/projects/ \
{your_project}/subscriptions/{your_subscription} --format json

Sortie

  [
    {
      "name": "pubsub.topics.attachSubscription",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.delete",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.get",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.getIamPolicy",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.publish",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.setIamPolicy",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.update",
      "stage": "GA"
    }
  ]

Go

Avant d'essayer cet exemple, suivez les instructions de configuration de Go décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Go.

topic := c.Topic(topicName)
perms, err := topic.IAM().TestPermissions(ctx, []string{
	"pubsub.topics.publish",
	"pubsub.topics.update",
})
if err != nil {
	return nil, err
}
for _, perm := range perms {
	log.Printf("Allowed: %v", perm)
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  List<String> permissions = new LinkedList<>();
  permissions.add("pubsub.topics.get");
  ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
  TestIamPermissionsResponse testedPermissions =
      topicAdminClient.testIamPermissions(topicName.toString(), permissions);
  return testedPermissions;
}

Node.js

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Node.js.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

const permissionsToTest = [
  `pubsub.topics.attachSubscription`,
  `pubsub.topics.publish`,
  `pubsub.topics.update`,
];

// Tests the IAM policy for the specified topic
const [permissions] = await pubsub
  .topic(topicName)
  .iam.testPermissions(permissionsToTest);
console.log(`Tested permissions for topic: %j`, permissions);

PHP

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour PHP.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the permissions of a topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function test_topic_permissions($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $permissions = $topic->iam()->testPermissions([
        'pubsub.topics.attachSubscription',
        'pubsub.topics.publish',
        'pubsub.topics.update'
    ]);
    foreach ($permissions as $permission) {
        printf('Permission: %s' . PHP_EOL, $permission);
    }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration de Python décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Python.

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

permissions_to_check = [
    'pubsub.topics.publish',
    'pubsub.topics.update'
]

allowed_permissions = client.test_iam_permissions(
    topic_path, permissions_to_check)

print('Allowed permissions for topic {}: {}'.format(
    topic_path, allowed_permissions))

Ruby

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Ruby.

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic       = pubsub.topic topic_name
permissions = topic.test_permissions "pubsub.topics.attachSubscription",
                                     "pubsub.topics.publish", "pubsub.topics.update"

puts "Permission to attach subscription" if permissions.include? "pubsub.topics.attachSubscription"
puts "Permission to publish" if permissions.include? "pubsub.topics.publish"
puts "Permission to update" if permissions.include? "pubsub.topics.update"

Exemple de cas d'utilisation : communication entre projets

La gestion IAM pour Cloud Pub/Sub est utile pour ajuster les accès avec précision dans le cadre de la communication entre projets. Par exemple, supposons qu'un compte de service dans le projet Cloud A souhaite publier des messages dans une rubrique du projet Cloud B. Une solution consiste à accorder au compte de service les droits d'édition dans le projet Cloud B. Toutefois, cette approche manque bien souvent de précision. Vous pouvez affiner le niveau d'accès à l'aide de l'API IAM.

Par exemple, cet extrait de code utilise la méthode setIamPolicy() ainsi qu'un fichier topic_policy.json préparé pour octroyer au compte de service foobar@appspot.gserviceaccount.com le rôle d'éditeur sur le sujet projects/myproject/topics/mytopic :

gcloud beta pubsub topics set-iam-policy projects/{your_project}/topics/ \
{your_topic} topic_policy.json

Sortie :

Updated IAM policy for topic [your-topic].
bindings:
- members:
  - serviceAccount:foobar@appspot.gserviceaccount.com
  role: roles/pubsub.publisher
etag: BwWGrQYX6R4=

Comportement de disponibilité partielle

Les vérifications d'autorisation dépendent du sous-système Cloud Identity and Access Management. Afin de toujours garantir une faible latence de réponse pour les opérations sur les données (publication et consultation de messages), le système peut s'appuyer sur les stratégies IAM Cloud mises en cache. Pour en savoir plus sur le délai d'application de vos modifications, consultez la documentation Cloud IAM.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation sur Cloud Pub/Sub