Contrôler l'accès en publication

Identity and Access Management (IAM) propose plusieurs types de stratégies pour vous aider à contrôler les ressources auxquelles les principaux peuvent accéder. Ce guide explique comment utiliser des règles d'accès pour contrôler l'accès lors de la publication de messages d'événement sur un bus Eventarc Advanced.

Les règles d'accès IAM peuvent autoriser ou refuser l'accès aux ressources. Toutefois, contrairement aux stratégies IAM d'autorisation et de refus, les stratégies d'accès peuvent accorder ou refuser l'accès en fonction d'attributs de contexte d'événement spécifiques, tels que la priorité du message d'événement.

Chaque stratégie d'accès est un ensemble de règles qui vous permet d'identifier les comptes principaux et de définir des conditions qui déterminent l'applicabilité d'une règle. Elle vous permet également d'activer un contrôle des accès d'accès précis. Par exemple, en fonction de l'évaluation d'une expression CEL (Common Expression Language) appliquée à un attribut de contexte d'événement, vous pouvez autoriser ou refuser l'autorisation de publier un sous-ensemble de messages d'événement sur un bus Eventarc Advanced.

Ce guide explique comment créer et appliquer une règle d'accès. Pour ce faire, vous devez d'abord créer une règle d'accès, puis une liaison de règle pour associer cette règle à un projet Google Cloud .

Avant de commencer

Avant de créer et d'appliquer une règle d'accès, vous devez avoir créé un bus Eventarc Advanced sur lequel les messages d'événement peuvent être publiés.

  1. Assurez-vous de tenir compte des points suivants :

    • Les règles d'accès doivent être appliquées à un projet Google Cloud ou liées à celui-ci. Chaque règle d'accès peut être associée à cinq projets maximum, et chaque projet peut être associé à cinq règles d'accès maximum. Vous pouvez créer un bus par projetGoogle Cloud et par région acceptée. Une règle d'accès associée à un projet contrôle l'accès à la publication pour tout bus Eventarc Advanced de ce projet.

    • Vous pouvez utiliser des règles d'accès pour contrôler l'accès à la publication sur un bus Eventarc Advanced, mais pas pour contrôler l'accès à l'abonnement aux messages d'un bus spécifique. L'autorisation acceptée est eventarc.messageBuses.publish.

    • Le contrôle des accès ne peut être basé que sur les attributs de contexte d'événement, et non sur le contenu de la charge utile de l'événement.

    • Les messages d'événement publiés à partir de sources Google et refusés sont supprimés. Si le principal publie directement un message d'événement, un message de journal Event published successfully l'indique. Toutefois, si le message d'événement est refusé par la condition de la règle d'accès, une erreur semblable à la suivante se produit :

      ERROR: (gcloud.beta.eventarc.message-buses.publish)
      PERMISSION_DENIED: Permission 'eventarc.googleapis.com/messageBuses.publish' denied on resource due to an IAM Access Policy.
      This command is authenticated as user@example.com which is the active account specified by the [core/account] property.
      '@type': type.googleapis.com/google.rpc.ErrorInfo
      domain: iam.googleapis.com
      metadata:
      permission: eventarc.googleapis.com/messageBuses.publish
      reason: IAM_PERMISSION_DENIED
  2. Si vous ne l'avez pas déjà fait, activez les API Eventarc et IAM :

    gcloud services enable eventarc.googleapis.com \
        eventarcpublishing.googleapis.com \
        iam.googleapis.com
  3. Configurez l'authentification :

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    API REST

    Pour utiliser les exemples API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à la gcloud CLI.

      Install the Google Cloud CLI. After installation, initialize the Google Cloud CLI by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud .

    Rôles requis

    Un rôle IAM contient un ensemble d'autorisations qui vous permet d'effectuer des actions spécifiques sur les ressources Google Cloud .

    Pour obtenir les autorisations nécessaires pour contrôler l'accès à la publication, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

    Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

    Ces rôles prédéfinis contiennent les autorisations requises pour contrôler l'accès à la publication. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

    Autorisations requises

    Les autorisations suivantes sont requises pour contrôler l'accès à la publication :

    • Créez des règles d'accès : iam.accessPolicies.create
    • Appliquez des règles d'accès :
      • iam.accessPolicies.bind
      • resourcemanager.projects.createPolicyBinding

    Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

    Créer une règle d'accès

    Créez une stratégie d'accès pour contrôler l'accès lorsque vous publiez des événements sur un bus Eventarc Advanced dans votre projet.

    Vous pouvez créer une stratégie d'accès à l'aide de la Google Cloud CLI ou en envoyant une requête directe à l'API IAM v3.

    gcloud

    Vous pouvez créer une règle d'accès en exécutant la commande gcloud beta iam access-policies create.

    gcloud beta iam access-policies create POLICY_ID \
        --project=POLICY_PROJECT_ID \
        --location=global \
        --details-rules=description="POLICY_DESCRIPTION",effect=EFFECT, \
        principals=[PRINCIPALS],excludedPrincipals=[EXCLUDED_PRINCIPALS], \
        permissions=[eventarc.googleapis.com/messageBuses.publish], \
        activationConditions={eventarc.googleapis.com={celCondition={expression="CEL_EXPRESSION"}}}

    Remplacez les éléments suivants :

    • POLICY_ID : nom unique de la règle d'accès, par exemple my-access-policy.
    • POLICY_PROJECT_ID : ID du projet dans lequel la règle sera créée. Google Cloud
    • POLICY_DESCRIPTION : description facultative de la règle (256 caractères maximum).
    • EFFECT : effet de la règle (ALLOW ou DENY).
    • PRINCIPALS : identités auxquelles s'applique cette règle. Le format de l'identifiant dépend du type de compte principal auquel vous souhaitez faire référence. Pour en savoir plus, consultez Types de comptes principaux pour les règles d'accès.
    • EXCLUDED_PRINCIPALS : identités exclues de l'application de la règle, même si elles sont listées dans principals. Par exemple, vous pouvez ajouter un groupe Google à principals, puis exclure des utilisateurs spécifiques appartenant à ce groupe.
    • CEL_EXPRESSION : expression CEL qui sera évaluée pour déterminer l'applicabilité de la règle (par exemple, message.version != \"v1\"). Pour en savoir plus, consultez Utiliser le Common Expression Language.

    Veuillez noter les points suivants :

    • L'indicateur --location spécifie l'emplacement de la règle d'accès et doit être global.
    • L'indicateur --details-rules peut spécifier le chemin d'accès au fichier de stratégie d'accès, qui peut être écrit en JSON ou en YAML (par exemple, --details-rules=path_to_file.json).

      Cet indicateur peut également être répété lorsque vous configurez plusieurs règles. Chaque règle est évaluée indépendamment.

      Une stratégie d'accès utilise le format suivant :

      {
        "displayName": "POLICY_DISPLAY_NAME",
        "details": {
          "rules": [
            {
              "description": "POLICY_DESCRIPTION",
              "effect": "EFFECT",
              "principals": [
                "PRINCIPALS"
              ],
              "excludedPrincipals": [
              "EXCLUDED_PRINCIPALS"
              ],
              "permissions": [
                "eventarc.googleapis.com/messageBuses.publish"
              ],
              "activationConditions": {
                "eventarc.googleapis.com": {
                  "celCondition": {
                    "expression": "CEL_EXPRESSION"
                  }
                }
              }
            }
          ]
        }
      }

    La réponse contient une opération de longue durée représentant votre demande. Pour savoir comment obtenir l'état d'une opération de longue durée, consultez la section Vérifier l'état d'une opération de longue durée dans ce document.

    Exemple

    La commande suivante crée une stratégie d'accès qui autorise le principal spécifié à publier des messages d'événement sur un bus, mais refuse la publication lorsque le type de support de données est JSON.

    gcloud beta iam access-policies create my-access-policy \
        --project=my-project-id \
        --location=global \
        --details-rules=description="Allow publishing to bus",effect=ALLOW,principals=[principal://goog/subject/user@example.com],permissions=[eventarc.googleapis.com/messageBuses.publish] \
        --details-rules=description="Deny publishing to bus if media type is JSON",effect=DENY,principals=[principal://goog/subject/user@example.com],permissions=[eventarc.googleapis.com/messageBuses.publish],activationConditions={eventarc.googleapis.com={celCondition={expression="message.datacontenttype=='application/json'"}}}

    API REST

    Vous pouvez créer une règle d'accès à l'aide de projects.locations.accessPolicies.create method.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • POLICY_DISPLAY_NAME (facultatif) : Nom lisible de la règle d'accès (par exemple, "Exemple de règle"). Le nom à afficher ne peut pas comporter plus de 63 caractères.
    • POLICY_DESCRIPTION (facultatif) : Description lisible de la règle d'accès (par exemple, "Description de l'exemple"). La description ne peut pas comporter plus de 256 caractères.
    • EFFECT : effet de la règle, ALLOW ou DENY.
    • PRINCIPALS : identités auxquelles cette règle s'applique. Le format de l'identifiant dépend du type de compte principal auquel vous souhaitez faire référence. Pour en savoir plus, consultez Types de comptes principaux pour les règles d'accès.
    • EXCLUDED_PRINCIPALS : identités exclues de l'application de la règle, même si elles sont listées dans principals. Par exemple, vous pouvez ajouter un groupe Google à principals, puis exclure des utilisateurs spécifiques appartenant à ce groupe.
    • CEL_EXPRESSION : expression CEL qui sera évaluée pour déterminer l'applicabilité de la règle. Pour en savoir plus, consultez Utiliser le Common Expression Language.
    • POLICY_PROJECT_ID : Google Cloud ID du projet dans lequel la règle sera créée.
    • POLICY_ID : nom unique de la stratégie d'accès, par exemple my-access-policy.

    Plusieurs règles peuvent être listées. Chaque règle est évaluée indépendamment. Si une règle ne s'applique pas, d'autres le feront peut-être.

    Corps JSON de la requête :

    {
      "displayName": "POLICY_DISPLAY_NAME",
      "details": {
        "rules": [
          {
            "description": "POLICY_DESCRIPTION",
            "effect": "EFFECT",
            "principals": [
              "PRINCIPALS"
            ],
            "excludedPrincipals": [
            "EXCLUDED_PRINCIPALS"
            ],
            "permissions": [
              "eventarc.googleapis.com/messageBuses.publish"
            ],
            "activationConditions": {
              "eventarc.googleapis.com": {
                "celCondition": {
                  "expression": "CEL_EXPRESSION"
                }
              }
            }
          }
        ]
      }
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    La réponse contient une opération de longue durée représentant votre demande. Pour savoir comment obtenir l'état d'une opération de longue durée, consultez la section Vérifier l'état d'une opération de longue durée sur cette page.

    {
      "name": "projects/POLICY_PROJECT_ID/locations/global/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
        "createTime": "2025-01-25T17:17:45.782370139Z",
        "target": "projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v3"
      },
      "done": false
    }
    

    Exemple

    La règle d'accès suivante autorise le compte principal spécifié à publier des messages d'événement dans un bus, mais refuse la publication lorsque la priorité du message est HIGH.

    cat > request.json << 'EOF'
    {
    "displayName": "Eventarc Advanced access policy",
    "details": {
      "rules": [
      {
        "description": "Allow publishing to bus",
        "effect": "ALLOW",
        "principals": [
          "principal://goog/subject/user@example.com"
        ],
        "permissions": [
          "eventarc.googleapis.com/messageBuses.publish"
        ]
      },
        {
          "description": "Deny publishing to bus if message priority is HIGH",
          "effect": "DENY",
          "principals": [
            "principal://goog/subject/user@example.com"
          ],
          "permissions": [
            "eventarc.googleapis.com/messageBuses.publish"
          ],
          "activationConditions": {
            "eventarc.googleapis.com": {
              "celCondition": {
                "expression": "message.priority == \"HIGH\""
              }
            }
          }
        }
      ]
    }
    }
    EOF
    
    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://iam.googleapis.com/v3/projects/POLICY_PROJECT_ID/locations/global/accessPolicies?access_policy_id=POLICY_ID"

    Appliquer une règle d'accès

    Créez une liaison de stratégie pour appliquer votre règle d'accès à un projet Google Cloud . Chaque liaison de stratégie associe une stratégie d'accès à une ressource.

    Vous pouvez appliquer une règle d'accès à l'aide de la Google Cloud CLI ou en envoyant une requête directe à l'API IAM v3.

    gcloud

    Vous pouvez créer une association de stratégie et appliquer votre règle d'accès en exécutant la commande gcloud beta iam policy-bindings create.

    gcloud beta iam policy-bindings create BINDING_ID \
        --project=BINDING_PROJECT_ID \
        --location=global \
        --policy=projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID \
        --target-resource=//cloudresourcemanager.googleapis.com/projects/BINDING_PROJECT_ID

    Remplacez les éléments suivants :

    • BINDING_ID : nom unique de la liaison de stratégie, par exemple my-access-policy-binding.
    • BINDING_PROJECT_ID : ID du projet Google Cloud dans lequel la liaison sera créée. Il doit s'agir du même ID que celui du projet dans lequel le bus Eventarc Advanced est créé. Il indique la cible de la liaison.

    L'indicateur --location spécifie l'emplacement de la liaison de stratégie et doit être global.

    La réponse contient une opération de longue durée représentant votre demande. Pour savoir comment obtenir l'état d'une opération de longue durée, consultez la section Vérifier l'état d'une opération de longue durée de ce document.

    Exemple

    La commande suivante crée une liaison de règle qui applique la règle d'accès spécifiée à un projet Google Cloud  :

    gcloud beta iam policy-bindings create my-access-policy-binding \
        --project=my-project-id \
        --location=global \
        --policy=projects/my-project-id/locations/global/accessPolicies/my-access-policy \
        --target-resource=//cloudresourcemanager.googleapis.com/projects/my-project-id

    API REST

    Vous pouvez créer une association de règles et appliquer votre règle d'accès à l'aide de projects.locations.policyBindings.create method.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • BINDING_DISPLAY_NAME : facultatif. Nom lisible de l'association de stratégie (par exemple, "Association exemple"). Le nom à afficher ne peut pas comporter plus de 63 caractères.
    • BINDING_PROJECT_ID : Google Cloud ID du projet dans lequel la liaison sera créée. Il doit s'agir du même ID que celui du projet dans lequel le bus Eventarc Advanced est créé. Il indique la cible de la liaison.
    • POLICY_PROJECT_ID : Google Cloud ID du projet dans lequel la règle est créée.
    • POLICY_ID : nom de la stratégie d'accès à lier, par exemple my-access-policy.

    Corps JSON de la requête :

    {
      "display_name": "BINDING_DISPLAY_NAME",
      "target": {"resource": "//cloudresourcemanager.googleapis.com/projects/BINDING_PROJECT_ID"},
      "policy_kind": "ACCESS",
      "policy": "projects/POLICY_PROJECT_ID/locations/global/accessPolicies/POLICY_ID"
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    La réponse contient une opération de longue durée représentant votre demande. Pour savoir comment obtenir l'état d'une opération de longue durée, consultez la section Vérifier l'état d'une opération de longue durée sur cette page.

    {
      "name": "projects/BINDING_PROJECT_ID/locations/global/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
        "createTime": "2025-01-25T17:17:45.782370139Z",
        "target": "projects/BINDING_PROJECT_ID/locations/global/policyBindings/POLICY_ID-binding",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v3"
      },
      "done": false
    }
    

    Vérifier l'état d'une opération de longue durée

    Lorsque vous utilisez l'API REST IAM, toute méthode modifiant une stratégie ou une liaison d'accès renvoie une opération de longue durée (LRO). L'opération de longue durée suit l'état de la requête et indique si la modification de la règle ou de la liaison est terminée.

    La méthode operations.get renvoie l'état d'une opération de longue durée.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • OPERATION_NAME : nom complet de l'opération. Vous recevez ce nom dans la réponse à votre requête d'origine.

      Il est au format suivant :

      projects/PROJECT_ID/locations/global/operations/OPERATION_ID
    • PROJECT_ID : ID Google Cloud du projet dans lequel l'opération est renvoyée.

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "name": "projects/PROJECT_ID/locations/global/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.iam.v3.OperationMetadata",
        "createTime": "2025-01-28T00:05:12.006289686Z",
        "endTime": "2025-01-28T00:05:12.192141801Z",
        "target": "projects/PROJECT_ID/locations/global/accessPolicies/POLICY_ID",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v3"
      },
      "done": true,
      "response": {
        ACCESS_POLICY
      }
    }
    

    Si le champ done de l'opération n'est pas présent, continuez à surveiller son état en obtenant l'opération de façon répétée. Utilisez un intervalle exponentiel tronqué entre les tentatives pour introduire un délai entre chaque requête. Lorsque le champ done est défini sur true, l'opération est terminée et vous pouvez cesser de l'obtenir.

    Étapes suivantes