Controlar el acceso de publicación

Gestión de Identidades y Accesos (IAM) ofrece varios tipos de políticas para ayudarte a controlar a qué recursos pueden acceder las entidades principales. En esta guía se describe cómo usar políticas de acceso para controlar el acceso al publicar mensajes de eventos en un bus avanzado de Eventarc.

Las políticas de acceso de gestión de identidades y accesos pueden permitir y denegar el acceso a los recursos. Sin embargo, a diferencia de las políticas de admisión y de denegación de IAM, las políticas de acceso pueden conceder o denegar el acceso en función de atributos de contexto de eventos específicos, 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, así como habilitar un control de acceso pormenorizado. Por ejemplo, en función de la evaluación de una expresión del lenguaje de expresión común (CEL) aplicada a un atributo de contexto de evento, puedes permitir o denegar el permiso para publicar un subconjunto de mensajes de evento 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, a continuación, se crea un enlace de política para conectar esa política a un proyecto. Google Cloud

Antes de empezar

Antes de crear y aplicar una política de acceso, debes 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 asociarse a un Google Cloud proyecto. Cada política de acceso se puede asociar a un máximo de 5 proyectos, y cada proyecto puede tener un máximo de 5 políticas de acceso asociadas. Puedes crear un bus por proyecto y por región admitida.Google Cloud Una política de acceso asociada a un proyecto controla el acceso de publicación a cualquier bus avanzado de Eventarc de ese proyecto.

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

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

    • Los mensajes de eventos que se publican desde fuentes de Google y que se deniegan se descartan. Si la entidad principal publica directamente un mensaje de evento, se indica con un mensaje de registro Event published successfully. Sin embargo, si la condición de la política de acceso deniega el mensaje del evento, se producirá 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 ha hecho, habilite las APIs Eventarc e 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 REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

      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 el artículo Autenticarse para usar REST de la documentación sobre Google Cloud autenticación.

    Roles obligatorios

    Un rol de gestión de identidades y accesos 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, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:

    Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

    Estos roles predefinidos contienen los permisos necesarios para controlar el acceso de publicación. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

    Permisos obligatorios

    Para controlar el acceso de publicación, se necesitan los siguientes permisos:

    • 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 u otros roles predefinidos.

    Crear una política de acceso

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

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

    gcloud

    Para crear una política de acceso, ejecuta 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"}}}

    Haz los cambios siguientes:

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

    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 al archivo de política de acceso, que se puede escribir en formato JSON o YAML. Por ejemplo, --details-rules=path_to_file.json.

      También se puede repetir la marca al configurar 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 la sección Comprobar el estado de una operación de larga duración de este documento.

    Ejemplo

    El siguiente comando crea una política de acceso que permite que la entidad de seguridad 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 REST

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

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • POLICY_DISPLAY_NAME: opcional. Nombre legible de la política de acceso (por ejemplo, "Política de ejemplo"). El nombre visible puede tener un máximo de 63 caracteres.
    • POLICY_DESCRIPTION: opcional. Descripción de la política de acceso legible por humanos. Por ejemplo, "Descripción de ejemplo". La descripción puede tener un máximo de 256 caracteres.
    • EFFECT: el efecto de la regla, que puede ser ALLOW o DENY.
    • PRINCIPALS: las identidades a las que se aplica esta regla. El formato del identificador depende del tipo de principal al que quieras hacer referencia. Para obtener más información, consulta Tipos de principales de las políticas de acceso.
    • EXCLUDED_PRINCIPALS: las identidades que se excluyen de la aplicación de la regla, aunque figuren en principals. Por ejemplo, puedes añadir un grupo de Google a principals y, a continuación, excluir a usuarios específicos que pertenezcan a ese grupo.
    • CEL_EXPRESSION: la expresión CEL que se evaluará para determinar si se aplica la regla. Para obtener más información, consulta Usar lenguaje de expresión común.
    • POLICY_PROJECT_ID: el Google Cloud ID del proyecto en el que se creará la política.
    • POLICY_ID: 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, puede 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, despliega una de estas opciones:

    La respuesta contiene una operación de larga duración que representa tu solicitud. Para saber cómo obtener el estado de una operación de larga duración, consulta Comprobar 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 entidad de seguridad especificada publique mensajes de eventos en un bus, pero deniega 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"

    Aplicar una política de acceso

    Crea un enlace de política para aplicar tu política de acceso a un Google Cloud proyecto. Cada enlace de política vincula una política de acceso a un recurso.

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

    gcloud

    Puedes crear un enlace 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

    Haz los cambios siguientes:

    • BINDING_ID: un nombre único para el enlace de la política (por ejemplo, my-access-policy-binding).
    • BINDING_PROJECT_ID: el ID del proyecto en el que se creará el enlace. Google Cloud Debe ser el mismo que el ID del proyecto en el que se crea el bus avanzado de Eventarc e indica el destino de la vinculación.

    La marca --location especifica la ubicación de la vinculación de la 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 la sección Comprobar el estado de una operación de larga duración de este documento.

    Ejemplo

    El siguiente comando crea un enlace de política que aplica la política de acceso especificada a un Google Cloud proyecto:

    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

    Puedes crear un enlace de política y aplicar tu política de acceso mediante projects.locations.policyBindings.create method.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • BINDING_DISPLAY_NAME: opcional. Nombre legible de 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á el enlace. Debe ser el mismo ID del proyecto en el que se crea el bus avanzado de Eventarc e indica el destino de la vinculación.
    • POLICY_PROJECT_ID: el Google Cloud ID del proyecto en el que se crea la política.
    • POLICY_ID: el nombre de la política de acceso que se va a 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, despliega una de estas opciones:

    La respuesta contiene una operación de larga duración que representa tu solicitud. Para saber cómo obtener el estado de una operación de larga duración, consulta la sección Comprobar el estado de una operación de larga duración en esta página de este documento.

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

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

    Cuando usas la API REST de IAM, cualquier método que cambie una política o una vinculación de acceso devuelve una operación de larga duración (OLD). La operación de larga duración monitoriza el estado de la solicitud e indica si se ha completado el cambio en la política o en la vinculación.

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

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • OPERATION_NAME: 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: el ID del proyecto Google Cloud en el que se devuelve la operación.

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "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, sigue monitorizando su estado obteniendo la operación repetidamente. Usa un tiempo de espera exponencial truncado para introducir un retraso entre cada solicitud. Cuando el campo done se define como true, la operación se completa y puedes dejar de obtenerla.

    Siguientes pasos