Cómo controlar el acceso de publicación

Identity and Access Management (IAM) ofrece varios tipos de políticas para ayudarte a controlar a qué recursos pueden acceder los principales. En esta guía, se describe cómo usar políticas de acceso para controlar el acceso cuando se publican mensajes de eventos en un bus de Eventarc Advanced.

Las políticas de acceso de IAM pueden permitir y denegar el acceso a los recursos. Sin embargo, a diferencia de las políticas de permiso y denegación de IAM, las políticas de acceso pueden otorgar o denegar el acceso según atributos específicos del contexto del evento, como la prioridad del mensaje del evento.

Cada política de acceso es un conjunto de reglas que te permite identificar principales y definir condiciones que determinan la aplicabilidad de una regla, y que te permite habilitar el control de acceso detallado. Por ejemplo, según la evaluación de una expresión de Common Expression Language (CEL) aplicada a un atributo de contexto de evento, puedes permitir o rechazar el permiso para publicar un subconjunto de mensajes de eventos en un bus avanzado de Eventarc.

En esta guía, se explica cómo crear y aplicar una política de acceso. Para ello, primero se crea una política de acceso y, luego, se crea una vinculación de política para conectar esa política a un proyecto Google Cloud .

Antes de comenzar

Antes de crear y aplicar una política de acceso, ya deberías haber creado un bus avanzado de Eventarc en el que se puedan publicar mensajes de eventos.

  1. Asegúrate de tener en cuenta lo siguiente:

    • Las políticas de acceso deben aplicarse o vincularse a un proyecto Google Cloud . Cada política de acceso se puede adjuntar a un máximo de 5 proyectos, y cada proyecto puede tener hasta 5 políticas de acceso adjuntas. Puedes crear un bus porGoogle Cloud proyecto y por región admitida. Una política de acceso adjunta a un proyecto controla el acceso de publicación a cualquier bus de Eventarc Advanced en ese proyecto.

    • Puedes usar políticas de acceso para controlar el acceso de publicación a un bus de Eventarc Advanced, pero no para controlar el acceso a la suscripción de mensajes de un bus en particular. El permiso compatible es eventarc.messageBuses.publish.

    • El control de acceso solo se puede basar en atributos de contexto del evento y no en el contenido de la carga útil del evento.

    • Se descartan los mensajes de eventos que se publican desde fuentes de Google y que se rechazan. Si la entidad principal publica directamente un mensaje de evento, un mensaje de registro Event published successfully lo indica. Sin embargo, si la condición de la política de acceso rechaza el mensaje del evento, se produce un error similar al siguiente:

      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 aún no lo hiciste, habilita las APIs de Eventarc y de IAM:

    gcloud services enable eventarc.googleapis.com \
        eventarcpublishing.googleapis.com \
        iam.googleapis.com
  3. Configura la autenticación:

    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 de REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones 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.

    Para obtener más información, consulta Autentícate para usar REST en la documentación de autenticación de Google Cloud .

    Roles obligatorios

    Un rol de IAM contiene un conjunto de permisos que te permiten realizar acciones específicas en los recursos de Google Cloud .

    Para obtener los permisos que necesitas para controlar el acceso de publicación, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    Estos roles predefinidos contienen los permisos necesarios para controlar el acceso a la publicación. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

    Permisos necesarios

    Se requieren los siguientes permisos para controlar el acceso de publicación:

    • Crea políticas de acceso: iam.accessPolicies.create
    • Aplica políticas de acceso:
      • iam.accessPolicies.bind
      • resourcemanager.projects.createPolicyBinding

    También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

    Crear una política de acceso

    Crea una política de acceso para controlar el acceso cuando publiques en un bus avanzado de Eventarc en tu proyecto.

    Puedes crear una política de acceso con Google Cloud CLI o realizando una solicitud directa a la API de IAM v3.

    gcloud

    Puedes crear una política de acceso ejecutando el 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"}}}

    Reemplaza lo siguiente:

    • POLICY_ID: Es un nombre único para la política de acceso, por ejemplo, my-access-policy.
    • POLICY_PROJECT_ID: Es el ID del proyecto Google Cloud en el que se creará la política.
    • POLICY_DESCRIPTION: Es una descripción opcional de la política (256 caracteres como máximo).
    • EFFECT: Es el efecto de la regla (ALLOW o DENY).
    • PRINCIPALS: Son las identidades a las que se aplica esta regla. El formato del identificador depende del tipo de principal al que deseas hacer referencia. Para obtener más información, consulta Tipos de principales para políticas de acceso.
    • EXCLUDED_PRINCIPALS: Son las identidades que se excluyen de la aplicación de la regla, incluso si se enumeran en principals. Por ejemplo, puedes agregar un Grupo de Google a principals y, luego, excluir a usuarios específicos que pertenecen a ese grupo.
    • CEL_EXPRESSION: Es la expresión CEL que se evaluará para determinar la aplicabilidad de la regla, por ejemplo, message.version != \"v1\". Para obtener más información, consulta Usa Common Expression Language.

    Ten en cuenta lo siguiente:

    • La marca --location especifica la ubicación de la política de acceso y debe ser global.
    • La marca --details-rules puede especificar la ruta de acceso al archivo de política de acceso, que se puede escribir en JSON o YAML (por ejemplo, --details-rules=path_to_file.json).

      La marca también se puede repetir cuando se configuran varias reglas. Cada regla se evalúa de forma independiente.

      Una política de acceso usa el siguiente 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 respuesta contiene una operación de larga duración que representa tu solicitud. Para obtener información sobre cómo obtener el estado de una operación de larga duración, consulta Revisa el estado de una operación de larga duración en este documento.

    Ejemplo

    El siguiente comando crea una política de acceso que permite que la entidad principal especificada publique mensajes de eventos en un bus, pero deniega la publicación cuando el tipo de medio de datos es 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 de REST

    Puedes crear una política de acceso con projects.locations.accessPolicies.create method.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • POLICY_DISPLAY_NAME: es opcional. Es un nombre legible para la política de acceso, por ejemplo, "Política de ejemplo". El nombre visible puede tener un máximo de 63 caracteres.
    • POLICY_DESCRIPTION: es opcional. Es una descripción legible de la política de acceso, por ejemplo, "Descripción de ejemplo". La descripción puede tener un máximo de 256 caracteres.
    • EFFECT: Es el efecto de la regla, que puede ser ALLOW o DENY.
    • PRINCIPALS: Son las identidades a las que se aplica esta regla. El formato del identificador depende del tipo de principal al que deseas hacer referencia. Para obtener más información, consulta Tipos de principales para políticas de acceso.
    • EXCLUDED_PRINCIPALS: Son las identidades que se excluyen de la aplicación de la regla, incluso si se enumeran en principals. Por ejemplo, puedes agregar un Grupo de Google a principals y, luego, excluir a usuarios específicos que pertenecen a ese grupo.
    • CEL_EXPRESSION: Es la expresión CEL que se evaluará para determinar la aplicabilidad de la regla. Para obtener más información, consulta Usa Common Expression Language.
    • POLICY_PROJECT_ID: Es el Google Cloud ID del proyecto en el que se creará la política.
    • POLICY_ID: Es un nombre único para la política de acceso, por ejemplo, my-access-policy.

    Se pueden enumerar varias reglas. Cada regla se evalúa de forma independiente. Si una regla no se aplica, es posible que se apliquen otras.

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene una operación de larga duración que representa tu solicitud. Para obtener información sobre cómo obtener el estado de una operación de larga duración, consulta Revisa el estado de una operación de larga duración en esta página.

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

    Ejemplo

    La siguiente política de acceso permite que la principal especificada publique mensajes de eventos en un bus, pero rechaza la publicación cuando la prioridad del mensaje es 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"

    Aplica una política de acceso

    Crea una vinculación de política para aplicar tu política de acceso a un proyecto Google Cloud . Cada vinculación de políticas asocia una política de acceso a un recurso.

    Puedes aplicar una política de acceso con Google Cloud CLI o realizando una solicitud directa a la API de IAM v3.

    gcloud

    Puedes crear una vinculación de política y aplicar tu política de acceso ejecutando el 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

    Reemplaza lo siguiente:

    • BINDING_ID: Es un nombre único para la vinculación de políticas, por ejemplo, my-access-policy-binding.
    • BINDING_PROJECT_ID: Es el ID del proyecto Google Cloud en el que se creará la vinculación. Debe ser el mismo que el ID del proyecto en el que se crea el bus de Eventarc Advanced y debe indicar el destino de la vinculación.

    La marca --location especifica la ubicación de la vinculación de política y debe ser global.

    La respuesta contiene una operación de larga duración que representa tu solicitud. Para obtener información sobre cómo obtener el estado de una operación de larga duración, consulta Revisa el estado de una operación de larga duración en este documento.

    Ejemplo

    El siguiente comando crea una vinculación de política que aplica la política de acceso especificada a un proyecto 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 de REST

    Puedes crear una vinculación de política y aplicar tu política de acceso con projects.locations.policyBindings.create method.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • BINDING_DISPLAY_NAME: Opcional. Es un nombre legible para la vinculación de la política, por ejemplo, "Vinculación de ejemplo". El nombre visible puede tener un máximo de 63 caracteres.
    • BINDING_PROJECT_ID: El Google Cloud ID del proyecto en el que se creará la vinculación. Debe ser el mismo que el ID del proyecto en el que se crea el bus de Eventarc Advanced y debe indicar el destino de la vinculación.
    • POLICY_PROJECT_ID: Es el Google Cloud ID del proyecto en el que se crea la política.
    • POLICY_ID: Es el nombre de la política de acceso que se vinculará, por ejemplo, my-access-policy.

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    La respuesta contiene una operación de larga duración que representa tu solicitud. Para obtener información sobre cómo obtener el estado de una operación de larga duración, consulta Revisa el estado de una operación de larga duración en esta página.

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

    Revisa el estado de una operación de larga duración

    Cuando usas la API de REST de IAM, cualquier método que cambie una política o vinculación de acceso devuelve una operación de larga duración (LRO). La operación de larga duración realiza un seguimiento del estado de la solicitud y también indica si se completó el cambio en la política o la vinculación.

    El método operations.get muestra el estado de una operación de larga duración.

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • OPERATION_NAME: Es el nombre completo de la operación. Recibirás este nombre en la respuesta a tu solicitud original.

      El nombre de la operación tiene el siguiente formato:

      projects/PROJECT_ID/locations/global/operations/OPERATION_ID
    • PROJECT_ID: Es el Google Cloud ID del proyecto en el que se devuelve la operación.

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "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 el campo done de la operación no está presente, continúa supervisando su estado obteniendo la operación repetidas veces. Usa la retirada exponencial truncada para ingresar una demora entre cada solicitud. Cuando el campo done se establece como true, la operación está completa, y puedes dejar de obtener la operación.

    ¿Qué sigue?