Controllare l'accesso in pubblicazione

Identity and Access Management (IAM) offre diversi tipi di policy per aiutarti a controllare a quali risorse i principal possono accedere. Questa guida descrive come utilizzare le policy di accesso per controllare l'accesso durante la pubblicazione di messaggi di eventi in un bus Eventarc Advanced.

I criteri di accesso IAM possono consentire e negare l'accesso alle risorse. Tuttavia, a differenza delle policy di autorizzazione e negazione IAM, le policy di accesso possono concedere o negare l'accesso in base ad attributi di contesto di eventi specifici, ad esempio la priorità del messaggio di evento.

Ogni policy di accesso è un insieme di regole che ti consente di identificare le entità e definire le condizioni che determinano l'applicabilità di una regola e che ti consente di attivarcontrollo dell'accessolo dell'accesso granulare. Ad esempio, a seconda della valutazione di un'espressione Common Expression Language (CEL) applicata a un attributo del contesto di un evento, puoi consentire o negare l'autorizzazione a pubblicare un sottoinsieme di messaggi di eventi in un bus avanzato Eventarc.

Questa guida spiega come creare e applicare una policy di accesso creando prima una policy di accesso e poi un'associazione di policy per collegare la policy a un progetto Google Cloud .

Prima di iniziare

Prima di creare e applicare una policy di accesso, devi aver già creato un bus Eventarc Advanced a cui possono essere pubblicati i messaggi di eventi.

  1. Assicurati di prendere in considerazione quanto segue:

    • Le policy di accesso devono essere applicate o associate a un progetto Google Cloud . Ogni policy di accesso può essere collegata a un massimo di 5 progetti; ogni progetto può avere fino a 5 policy di accesso collegate. Puoi creare un bus per progetto per regione supportata.Google Cloud Una policy di accesso collegata a un progetto controlla l'accesso alla pubblicazione a qualsiasi bus Eventarc Advanced in quel progetto.

    • Puoi utilizzare i criteri di accesso per controllare l'accesso alla pubblicazione a un bus avanzato Eventarc, ma non per controllare l'accesso alla sottoscrizione dei messaggi da un bus specifico. L'autorizzazione supportata è eventarc.messageBuses.publish.

    • Il controllo dell'accesso può basarsi solo sugli attributi del contesto dell'evento e non sul contenuto del payload dell'evento.

    • I messaggi di eventi pubblicati da origini Google e rifiutati vengono eliminati. Se il principale pubblica direttamente un messaggio di evento, viene indicato da un messaggio di log Event published successfully. Tuttavia, se il messaggio di evento viene negato dalla condizione nella norma di accesso, si verifica un errore simile al seguente:

      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. Se non l'hai ancora fatto, abilita le API Eventarc e IAM:

    gcloud services enable eventarc.googleapis.com \
        eventarcpublishing.googleapis.com \
        iam.googleapis.com
  3. Configura l'autenticazione:

    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

    Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, utilizza le credenziali che fornisci a 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.

    Per saperne di più, consulta Autenticati per usare REST nella documentazione sull'autenticazione di Google Cloud .

    Ruoli obbligatori

    Un ruolo IAM contiene un insieme di autorizzazioni che ti consentono di eseguire azioni specifiche sulle risorse Google Cloud .

    Per ottenere le autorizzazioni necessarie per controllare l'accesso alla pubblicazione, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Questi ruoli predefiniti contengono le autorizzazioni necessarie per controllare l'accesso alla pubblicazione. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

    Autorizzazioni obbligatorie

    Per controllare l'accesso alla pubblicazione sono necessarie le seguenti autorizzazioni:

    • Crea policy di accesso: iam.accessPolicies.create
    • Applica criteri di accesso:
      • iam.accessPolicies.bind
      • resourcemanager.projects.createPolicyBinding

    Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

    Crea una policy di accesso

    Crea una policy di accesso per controllare l'accesso durante la pubblicazione in un bus Eventarc Advanced nel tuo progetto.

    Puoi creare una policy di accesso utilizzando Google Cloud CLI o effettuando una richiesta diretta all'API IAM v3.

    gcloud

    Puoi creare una policy di accesso eseguendo il comando 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"}}}

    Sostituisci quanto segue:

    • POLICY_ID: un nome univoco per la policy di accesso, ad esempio my-access-policy.
    • POLICY_PROJECT_ID: l'ID progetto Google Cloud del progetto in cui verrà creata la policy.
    • POLICY_DESCRIPTION: una descrizione facoltativa del criterio (256 caratteri al massimo).
    • EFFECT: l'effetto della regola (ALLOW o DENY).
    • PRINCIPALS: le identità a cui si applica questa regola. Il formato dell'identificatore dipende dal tipo di entità a cui vuoi fare riferimento. Per saperne di più, consulta Tipi di principal per le policy di accesso.
    • EXCLUDED_PRINCIPALS: le identità escluse dall'applicazione della regola, anche se elencate in principals. Ad esempio, puoi aggiungere un gruppo Google a principals ed escludere utenti specifici che appartengono a quel gruppo.
    • CEL_EXPRESSION: l'espressione CEL che verrà valutata per determinare l'applicabilità della regola, ad esempio message.version != \"v1\". Per ulteriori informazioni, consulta la pagina Utilizzare Common Expression Language.

    Tieni presente quanto segue:

    • Il flag --location specifica la posizione della policy di accesso e deve essere global.
    • Il flag --details-rules può specificare il percorso del file di policy di accesso, che può essere scritto in formato JSON o YAML, ad esempio --details-rules=path_to_file.json.

      Il flag può essere ripetuto anche durante la configurazione di più regole. Ogni regola viene valutata in modo indipendente.

      Una policy di accesso utilizza il seguente formato:

      {
        "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 risposta contiene un'operazione a lunga esecuzione che rappresenta la tua richiesta. Per scoprire come ottenere lo stato di un'operazione a lunga esecuzione, consulta Controllare lo stato di un'operazione a lunga esecuzione in questo documento.

    Esempio

    Il seguente comando crea un criterio di accesso che consente al principal specificato di pubblicare messaggi di eventi in un bus, ma nega la pubblicazione quando il tipo di supporto dati è 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

    Puoi creare una policy di accesso utilizzando projects.locations.accessPolicies.create method.

    Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

    • POLICY_DISPLAY_NAME: facoltativo. Un nome leggibile per la policy di accesso, ad esempio "Policy di esempio". Il nome visualizzato può contenere un massimo di 63 caratteri.
    • POLICY_DESCRIPTION: facoltativo. Una descrizione leggibile della norma di accesso, ad esempio "Descrizione di esempio". La descrizione può contenere un massimo di 256 caratteri.
    • EFFECT: l'effetto della regola, ALLOW o DENY.
    • PRINCIPALS: le identità a cui si applica questa regola. Il formato dell'identificatore dipende dal tipo di entità a cui vuoi fare riferimento. Per saperne di più, consulta Tipi di principal per le policy di accesso.
    • EXCLUDED_PRINCIPALS: le identità escluse dall'applicazione della regola, anche se elencate in principals. Ad esempio, puoi aggiungere un gruppo Google a principals ed escludere utenti specifici che appartengono a quel gruppo.
    • CEL_EXPRESSION: l'espressione CEL che verrà valutata per determinare l'applicabilità della regola. Per saperne di più, consulta la pagina Utilizzare Common Expression Language.
    • POLICY_PROJECT_ID: l' Google Cloud ID progetto del progetto in cui verrà creata la policy.
    • POLICY_ID: un nome univoco per la policy di accesso, ad esempio my-access-policy.

    È possibile elencare più regole. Ogni regola viene valutata in modo indipendente. Se una regola non si applica, potrebbero applicarsi altre regole.

    Corpo JSON della richiesta:

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

    Per inviare la richiesta, espandi una di queste opzioni:

    La risposta contiene un'operazione a lunga esecuzione che rappresenta la tua richiesta. Per scoprire come ottenere lo stato di un'operazione a lunga esecuzione, consulta Controllare lo stato di un'operazione a lunga esecuzione in questa pagina.

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

    Esempio

    Il seguente criterio di accesso consente all'entità specificata di pubblicare messaggi di eventi in un bus, ma nega la pubblicazione quando la priorità del messaggio è 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"

    Applicare una policy di accesso

    Crea un'associazione di policy per applicare la policy di accesso a un progetto Google Cloud . Ogni binding dei criteri associa un criterio di accesso a una risorsa.

    Puoi applicare una policy di accesso utilizzando Google Cloud CLI o effettuando una richiesta diretta all'API IAM v3.

    gcloud

    Puoi creare un'associazione di policy e applicare la tua policy di accesso eseguendo il comando 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

    Sostituisci quanto segue:

    • BINDING_ID: un nome univoco per l'associazione della policy, ad esempio my-access-policy-binding.
    • BINDING_PROJECT_ID: l'ID Google Cloud progetto del progetto in cui verrà creato il binding. Deve essere uguale all'ID del progetto in cui viene creato il bus Eventarc Advanced e indica la destinazione del binding.

    Il flag --location specifica la posizione del binding della policy e deve essere global.

    La risposta contiene un'operazione a lunga esecuzione che rappresenta la tua richiesta. Per scoprire come ottenere lo stato di un'operazione a lunga esecuzione, consulta Controllare lo stato di un'operazione a lunga esecuzione in questo documento.

    Esempio

    Il comando seguente crea un'associazione di policy che applica la policy di accesso specificata a un progetto 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

    Puoi creare un binding di policy e applicare la policy di accesso utilizzando projects.locations.policyBindings.create method.

    Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

    • BINDING_DISPLAY_NAME: facoltativo. Un nome leggibile per il binding della policy, ad esempio "Binding di esempio". Il nome visualizzato può contenere un massimo di 63 caratteri.
    • BINDING_PROJECT_ID: l'ID progetto del progetto in cui verrà creata l'associazione. Google Cloud Deve essere uguale all'ID del progetto in cui viene creato il bus Eventarc Advanced e indica la destinazione del binding.
    • POLICY_PROJECT_ID: l'ID progetto del progetto in cui viene creata la policy. Google Cloud
    • POLICY_ID: il nome della policy di accesso da associare, ad esempio my-access-policy.

    Corpo JSON della richiesta:

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

    Per inviare la richiesta, espandi una di queste opzioni:

    La risposta contiene un'operazione a lunga esecuzione che rappresenta la tua richiesta. Per scoprire come ottenere lo stato di un'operazione a lunga esecuzione, consulta Controllare lo stato di un'operazione a lunga esecuzione in questa pagina.

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

    Controllare lo stato di un'operazione a lunga esecuzione

    Quando utilizzi l'API REST IAM, qualsiasi metodo che modifica una policy di accesso o un binding restituisce un'operazione a lunga esecuzione (LRO). L'operazione a lunga esecuzione tiene traccia dello stato della richiesta e indica se la modifica alla norma o all'associazione è stata completata.

    Il metodo operations.get restituisce lo stato di un'operazione a lunga esecuzione.

    Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

    • OPERATION_NAME: il nome completo dell'operazione. Riceverai questo nome nella risposta alla tua richiesta originale.

      Il nome dell'operazione ha il seguente formato:

      projects/PROJECT_ID/locations/global/operations/OPERATION_ID
    • PROJECT_ID: l'ID progetto Google Cloud del progetto in cui viene restituita l'operazione.

    Per inviare la richiesta, espandi una di queste opzioni:

    Dovresti ricevere una risposta JSON simile alla seguente:

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

    Se il campo done dell'operazione non è presente, continua a monitorarne lo stato recuperando ripetutamente l'operazione. Utilizza il backoff esponenziale troncato per introdurre un ritardo tra una richiesta e l'altra. Quando il campo done è impostato su true, l'operazione è completata e puoi interrompere la ricezione dell'operazione.

    Passaggi successivi