Administra recursos de Cloud Storage con restricciones personalizadas

La política de la organización proporciona restricciones predefinidas para Cloud Storage. Sin embargo, si deseas un control más detallado y personalizable sobre los campos específicos que están restringidos en las políticas de tu organización, también puedes crear restricciones personalizadas y usarlas en una política de la organización.

En esta página, se describe cómo establecer restricciones personalizadas para aplicar políticas en los recursos de Cloud Storage.

Para probar una restricción nueva antes de que se aplique en tu entorno de producción, usa el Policy Simulator.

Herencia de políticas

De forma predeterminada, las políticas de la organización se heredan según los subordinados de los recursos en los que se aplica la política. Por ejemplo, si aplicas una política en una organización, Google Cloud aplica la política en todos los proyectos de la organización. Para obtener más información sobre este comportamiento y cómo cambiarlo, consulta Reglas de evaluación de la jerarquía.

Precios

El Servicio de Políticas de la Organización, que incluye las restricciones predefinidas y personalizadas, se ofrece sin cargo.

Limitaciones

  • Las restricciones personalizadas para los recursos de Cloud Storage solo se pueden configurar mediante la consola de Google Cloud o Google Cloud CLI.

  • Las restricciones personalizadas solo se pueden aplicar en los métodos CREATE o UPDATE para los recursos de Cloud Storage.

  • Las restricciones personalizadas recién aplicadas no se aplican de forma automática a los recursos existentes. Los recursos existentes se deben actualizar para que se aplique la restricción.

    Para encontrar los recursos existentes que deberán actualizarse, puedes aplicar una política de la organización de ejecución de prueba.

  • Las restricciones personalizadas no se pueden usar para restringir las LCA o las políticas de IAM en objetos o buckets.

Recursos admitidos de Cloud Storage

Para Cloud Storage, puedes establecer restricciones personalizadas en el siguiente recurso:

  • Buckets: storage.googleapis.com/Bucket

Roles obligatorios

Para obtener información sobre los roles necesarios para administrar las políticas de la organización con restricciones personalizadas, consulta Roles obligatorios.

Además de administrar las políticas de la organización, te recomendamos probar las restricciones personalizadas que creas. A fin de probar las restricciones personalizadas, se recomienda usar la función predefinida o personalizada menos permisiva que contenga los permisos necesarios para probar la restricción específica. Para ver qué permisos y roles son necesarios, consulta roles y permisos para Cloud Storage.

Configura una restricción personalizada

Console

  1. En la consola de Google Cloud, ve a la página Políticas de la organización.

    Ir a Políticas de la organización

  2. Selecciona el Selector de proyectos en la parte superior de la página.

  3. En el Selector de proyectos, selecciona el recurso para el que deseas configurar la política de la organización.

  4. Haz clic en Restricción personalizada.

  5. En el cuadro Nombre visible, ingresa un nombre descriptivo para la restricción. La longitud máxima de este campo es 200 caracteres. No uses PII ni datos sensibles en nombres de restricciones, ya que podrían exponerse en mensajes de error.

  6. En el cuadro ID de restricción, ingresa el nombre que deseas para la nueva restricción personalizada. Una restricción personalizada debe comenzar con custom. y solo puede incluir letras mayúsculas, minúsculas o números, por ejemplo, custom.enforceBucketVersioning. La longitud máxima de este campo es de 70 caracteres, sin contar el prefijo, por ejemplo, organizations/123456789/customConstraints/custom..

  7. En el cuadro Description, ingresa una descripción fácil de usar de la restricción que se mostrará como un mensaje de error cuando se infringe la política. La longitud máxima de este campo es 2000 caracteres.

  8. En el campo Tipo de recurso, selecciona el nombre del recurso de Google Cloud REST que contiene el objeto y el campo que deseas restringir. Por ejemplo, storage.googleapis.com/Bucket.

  9. En Método de aplicación, selecciona si deseas aplicar la restricción en el método de REST CREATE o UPDATE.

  10. Para definir una condición, haz clic en Editar condición.

    1. En el panel Agregar condición, crea una condición de CEL que haga referencia a un recurso de servicio compatible, por ejemplo resource.versioning.enabled == true. La longitud máxima de este campo es 1000 caracteres.

    2. Haz clic en Guardar.

  11. En Acción, selecciona si deseas permitir o rechazar el método evaluado si se cumple la condición.

  12. Haz clic en Crear restricción.

Cuando ingreses un valor en cada campo, aparecerá a la derecha la configuración de YAML equivalente para esta restricción personalizada.

gcloud

A fin de crear una restricción personalizada con Google Cloud CLI, crea un archivo YAML para la restricción personalizada:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- RESOURCE_NAME
methodTypes:
- METHOD1
- METHOD2
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

Reemplaza lo siguiente:

  • ORGANIZATION_ID: el ID de la organización, como 123456789.

  • CONSTRAINT_NAME: el nombre que deseas para tu nueva restricción personalizada. Una restricción personalizada debe comenzar con custom. y solo puede incluir letras mayúsculas, minúsculas o números, por ejemplo, custom.enforceBucketVersioning. La longitud máxima de este campo es de 70 caracteres, sin contar el prefijo (por ejemplo, organizations/123456789/customConstraints/custom.).

  • RESOURCE_NAME: el nombre completamente calificado del recurso de REST de Google Cloud que contiene el objeto y el campo que deseas restringir. Por ejemplo, storage.googleapis.com/Bucket.

  • METHOD1,METHOD2: una lista de métodos de RESTful para aplicar la restricción. Puede ser CREATE o CREATE y UPDATE.

  • CONDITION: una condición de CEL que hace referencia a un recurso de servicio compatible, por ejemplo, "resource.versioning.enabled == true". La longitud máxima de este campo es 1000 caracteres. Para obtener detalles sobre el uso de CEL, consulta Common Expression Language.

  • ACTION: la acción que se realiza si se cumple condition. Puede ser ALLOW o DENY.

  • DISPLAY_NAME: un nombre descriptivo para la restricción. La longitud máxima de este campo es 200 caracteres.

  • DESCRIPTION: una descripción fácil de usar de la restricción que se mostrará como un mensaje de error cuando se infringe la política. La longitud máxima de este campo es 2000 caracteres.

Después de crear el archivo YAML para una nueva restricción personalizada, debes configurarla para que esté disponible para las políticas de la organización de tu organización. Para configurar una restricción personalizada, usa el comando gcloud org-policies set-custom-constraint:

gcloud org-policies set-custom-constraint CONSTRAINT_PATH
Reemplaza CONSTRAINT_PATH por la ruta de acceso completa al archivo de restricción personalizado. Por ejemplo, /home/user/customconstraint.yaml. Una vez completadas, tus restricciones personalizadas estarán disponibles como políticas de la organización en tu lista de políticas de la organización de Google Cloud. Para verificar que la restricción personalizada exista, usa el comando gcloud org-policies list-custom-constraints:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
Reemplaza ORGANIZATION_ID por el ID del recurso de tu organización. Para obtener más información, consulta Visualiza las políticas de la organización.

Si la solicitud se realiza de forma correcta, el resultado es similar al siguiente:

CUSTOM_CONSTRAINT             ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
custom.uniformBucketLevelAccess  DENY         CREATE,UPDATE  storage.googleapis.com/Bucket  Enable object versioning

Para obtener más información sobre cómo configurar y administrar restricciones personalizadas, consulta Crea y administra restricciones personalizadas.

Aplica una restricción

Puedes aplicar una restricción booleana si creas una política de la organización que haga referencia a ella y si aplicas esa política a un recurso de Google Cloud.

Console

  1. En la consola de Google Cloud, ve a la página Políticas de la organización.

    Ir a Políticas de la organización

  2. En el selector de proyectos, selecciona el proyecto para el que deseas configurar la política de la organización.
  3. En la lista de la página Políticas de la organización, selecciona tu restricción para ver la página Detalles de la política de esa restricción.
  4. Si deseas configurar las políticas de la organización para este recurso, haz clic en Administrar política.
  5. En la página Editar política, selecciona Anular la política del elemento superior.
  6. Haz clic en Agregar una regla.
  7. En la sección Aplicación, selecciona si la aplicación de esta política de la organización está activada o desactivada.
  8. Opcional: haz clic en Agregar condición para que la política de la organización sea condicional en una etiqueta. Ten en cuenta que si agregas una regla condicional a una política de la organización, debes agregar al menos una regla sin condición o la política no se puede guardar. Para obtener más información, consulta Configura una política de la organización con etiquetas.
  9. Si se trata de una restricción personalizada, puedes hacer clic en Probar cambios para simular el efecto de esta política de la organización. Para obtener más información, consulta Prueba los cambios en las políticas de la organización con Policy Simulator.
  10. Para finalizar y aplicar la política de la organización, haz clic en Establecer política. La política tarda hasta 15 minutos en aplicarse.

gcloud

Para crear una política de la organización que aplique una restricción booleana, crea un archivo de política en formato YAML que haga referencia a la restricción:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

Reemplaza lo siguiente:

  • PROJECT_ID: el proyecto en el que deseas aplicar tu restricción.
  • CONSTRAINT_NAME: el nombre que definiste para tu restricción personalizada. Por ejemplo: custom.uniformBucketLevelAccess

Para aplicar la política de la organización que contiene la restricción, ejecuta el siguiente comando:

    gcloud org-policies set-policy POLICY_PATH
    

Reemplaza POLICY_PATH por la ruta de acceso completa al archivo YAML de la política de la organización. La política tarda hasta 15 minutos en aplicarse.

Las solicitudes que se rechazan por incumplir una restricción personalizada fallan con un error 412: CUSTOM_ORGPOLICY_CONSTRAINT_FAILED.

Ejemplo: Crea una restricción que aplique claves de encriptación administradas por el cliente en los buckets

gcloud

  1. Crea un archivo de restricción enforceCMEK.yaml con la siguiente información:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.customerManagedEncryptionKeys
    resource_types: storage.googleapis.com/Bucket
    method_types: CREATE UPDATE
    condition: "has(resource.encryption.defaultKmsKeyName)"
    action_type: ALLOW
    display_name: Enforce Cloud KMS key
    description: When this constraint is enforced, newly created buckets and newly updated buckets must be encrypted with a
    Cloud KMS key. The Cloud KMS key on existing buckets can be updated but not deleted.
  2. Establece la restricción personalizada.

    gcloud org-policies set-custom-constraint enforceCMEK.yaml
    
  3. Crea un archivo de política enforceCMEK-policy.yaml con la siguiente información:

    name: projects/PROJECT_ID/policies/custom.customerManagedEncryptionKeys
    spec:
      rules:
    enforce: true

    Reemplaza PROJECT_ID con el ID del proyecto.

    En este ejemplo, aplicamos esta restricción a nivel del proyecto, pero también puedes configurarla a nivel de la organización o de la carpeta.

  4. Aplica la política de manera forzosa.

    gcloud org-policies set-policy enforceCMEK-policy.yaml
    

Restricciones personalizadas de ejemplo para casos de uso comunes

En las siguientes secciones, se proporciona la sintaxis de algunas restricciones personalizadas que pueden resultarte útiles:

Caso práctico Sintaxis
Las políticas de retención de los buckets deben tener un período que esté dentro de las duraciones especificadas
      name: organizations/ORGANIZATION_ID/customConstraints/custom.retentionPolicy
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.retentionPeriod not in [3600, 2678400]"
      action_type: DENY
      display_name: Bucket retention policy is either 3,600 seconds or 2,678,400 seconds
      description: Newly created buckets and newly updated buckets must have a
      retention policy that's either 3,600 seconds or 2,678,400 seconds.
Los buckets deben tener habilitado el control de versiones de objetos
      name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceBucketVersioning
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.versioning.enabled == true"
      action_type: ALLOW
      display_name: Buckets must have Object Versioning enabled
      description: Newly created buckets and newly updated buckets must have Object Versioning enabled.
Los depósitos deben nombrarse con una expresión regular específica.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketName
      method_types:
CREATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.name.matches('^[a-zA-Z]+$')"
      action_type: ALLOW
      display_name: Bucket names must match the specified regular expression
      description: Newly created buckets must have a name that matches the
      specified regular expression. Only letters are allowed in the bucket name.
Los buckets no pueden tener habilitado el bloqueo de buckets
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitBucketLock
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.isLocked == true"
      action_type: DENY
      display_name: Prohibit the use of Bucket Lock
      description: Newly created buckets and newly updated buckets cannot have
      Bucket Lock enabled.
Los buckets no pueden tener habilitado el bloqueo de retención de objetos
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitObjectRetentionLock
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.objectRetention.mode == 'Enabled'"
      action_type: DENY
      display_name: Objects cannot have retention configurations
      description: Newly created buckets and newly updated buckets cannot have
      Object Retention Lock enabled.
Los buckets ubicados en las multirregiones US o EU deben tener un período de retención de 86,400 segundos.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.locationRetentionPolicy
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "(resource.location.startsWith('US') || resource.location.startsWith('EU')) && resource.retentionPolicy.retentionPeriod != 86400"
      action_type: DENY
      display_name: All buckets in US and EU must have a retention policy of 86,400 seconds
      description: Newly created buckets and newly updated buckets located in
      US and EU regions must have a retention policy of 86,400 seconds.
Los buckets deben tener etiquetas1.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.labels
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'my_annotations.data.source' in resource.labels && resource.labels['my_annotations.data.source'] in ['SOURCE_IMAGES','SOURCE_TEXT','SOURCE_VIDEOS']"
      action_type: ALLOW
      display_name: Buckets must have a label classifying the contents of the bucket
      description: Newly created buckets and newly updated buckets must have the
      label my_annotations.data.source with the SOURCE_IMAGES, SOURCE_TEXT, or
      SOURCE_VIDEOS key.
Los buckets deben estar ubicados en una birregional
      name: organizations/ORGANIZATION_ID/customConstraints/custom.dualRegionUS
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'US-EAST1' in resource.customPlacementConfig.dataLocations && 'US-EAST4' in resource.customPlacementConfig.dataLocations"
      action_type: ALLOW
      display_name: Buckets must be located in a dual-region
      description: Newly created buckets and newly updated buckets must be located in a dual-region
      composed of the us-east1 and us-east4 regions.
Los buckets no pueden usar clases de almacenamiento heredadas
      name: organizations/ORGANIZATION_ID/customConstraints/custom.disableLegacyStorageClass
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.storageClass in ['STANDARD', 'NEARLINE', 'COLDLINE', 'ARCHIVE']"
      action_type: ALLOW
      display_name: Buckets cannot use legacy storage classes
      description: Newly created buckets and newly updated buckets must use
      Standard storage, Nearline storage, Coldline storage, or Archive storage.

1 Especificar una clave de etiqueta de bucket que no existe muestra un error BAD_CONDITION. Este error bloquea la ejecución de los métodos CREATE y UPDATE en el depósito. Para evitar este error, siempre verifica que la clave de etiqueta exista primero mediante "my_annotations.data.source" in resource.labels.

Campos de expresión para las condiciones

La siguiente tabla contiene los campos de expresión que puedes usar para crear condiciones. Las condiciones se escriben en Common Expression Language (CEL). Ten en cuenta que el valor de estos campos de expresión distingue entre mayúsculas y minúsculas.

Para obtener descripciones de los siguientes campos de expresión y los valores que puedes especificar, consulta la Representación de recursos de buckets para la API de JSON.

Campo de expresión Tipo de valor
billing.requesterPays bool
cors list
cors.maxAgeSeconds int
cors.method list
cors.origin list
cors.responseHeader list
customPlacementConfig.dataLocations1 list
defaultEventBasedHold bool
encryption.defaultKmsKeyName string
iamConfiguration.publicAccessPrevention string
iamConfiguration.uniformBucketLevelAccess.enabled bool
labels map
lifecycle.rule list
lifecycle.rule.action.storageClass1 string
lifecycle.rule.action.type string
lifecycle.rule.condition.age int
lifecycle.rule.condition.createdBefore string
lifecycle.rule.condition.customTimeBefore string
lifecycle.rule.condition.daysSinceCustomTime int
lifecycle.rule.condition.daysSinceNoncurrentTime int
lifecycle.rule.condition.isLive bool
lifecycle.rule.condition.matchesPrefix list
lifecycle.rule.condition.matchesStorageClass list
lifecycle.rule.condition.matchesSuffix list
lifecycle.rule.condition.noncurrentTimeBefore string
lifecycle.rule.condition.numNewerVersions int
location1 string
locationType string
logging.logBucket string
logging.logObjectPrefix string
objectRetention.mode string
name string
projectNumber2 string
retentionPolicy.isLocked bool
retentionPolicy.retentionPeriod int
rpo string
softDeletePolicy.retentionDurationSeconds int
storageClass1 string
versioning.enabled bool
website.mainPageSuffix string
website.notFoundPage string

1 El valor de este campo se debe escribir en mayúsculas.

2 Este campo está obsoleto.

Consideraciones

No se recomiendan las etiquetas de bucket para su uso en condiciones de restricciones personalizadas. En su lugar, usa etiquetas, que solo pueden configurarlas las personas con las funciones de IAM necesarias y que están más controladas que las etiquetas.