Gestionar recursos de Cloud Storage con restricciones personalizadas

La política de organización proporciona restricciones predefinidas para Cloud Storage. Sin embargo, si quieres tener un control más granular 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 definir restricciones personalizadas para aplicar políticas en recursos de Cloud Storage.

Para probar una nueva restricción antes de que se aplique en tu entorno de producción, usa el simulador de políticas.

Herencia de políticas

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

Precios

El servicio de políticas de la organización, incluidas las restricciones predefinidas y personalizadas, se ofrece sin coste adicional.

Limitaciones

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

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

  • Las restricciones personalizadas que se aplican no se aplican automáticamente a los recursos que ya existen. Los recursos que ya tengas deben actualizarse para que se aplique la restricción.

    Para encontrar los recursos que deben actualizarse, puedes aplicar una política de organización de prueba.

  • Las restricciones personalizadas no se pueden usar para restringir las listas de control de acceso ni las políticas de gestión de identidades y accesos en objetos o en contenedores.

Recursos admitidos de Cloud Storage

En Cloud Storage, puede definir restricciones personalizadas en el siguiente recurso:

Roles obligatorios

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

Además de gestionar las políticas de la organización, puede que quieras probar las restricciones personalizadas que crees. Para probar las restricciones personalizadas, te recomendamos que uses el rol predefinido o personalizado menos permisivo que contenga los permisos necesarios para probar la restricción específica. Para ver qué permisos y roles son necesarios, consulta los roles y los permisos de Cloud Storage.

Configurar una restricción personalizada

Consola

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

    Ir a Políticas de 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 quieras definir la política de la organización.

  4. Haz clic en Restricción personalizada.

  5. En el campo Nombre visible, introduce un nombre descriptivo para la restricción. Este campo tiene una longitud máxima de 200 caracteres. No utilices información personal identificable ni datos sensibles en los nombres de las restricciones, ya que podrían exponerse en mensajes de error.

  6. En el cuadro ID de la restricción, introduce el nombre que quieras para la nueva restricción personalizada. Una restricción personalizada debe empezar por custom. y solo puede incluir letras mayúsculas, letras 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 campo Description (Descripción), introduce una descripción de la restricción que sea fácil de entender para que se muestre como mensaje de error cuando se infrinja la política. Este campo tiene una longitud máxima de 2000 caracteres.

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

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

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

    1. En el panel Añadir condición, crea una condición CEL que haga referencia a un recurso de servicio compatible. Por ejemplo, resource.versioning.enabled == true. Este campo tiene una longitud máxima de 1000 caracteres.

    2. Haz clic en Guardar.

  11. En Acción, seleccione si quiere permitir o denegar el método evaluado si se cumple la condición.

  12. Haz clic en Crear restricción.

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

gcloud

Para crear una restricción personalizada con la CLI de Google Cloud, cree 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

Haz los cambios siguientes:

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

  • CONSTRAINT_NAME: el nombre que quieras asignar a la nueva restricción personalizada. Una restricción personalizada debe empezar por custom. y solo puede incluir letras mayúsculas, letras 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: nombre completo del recurso RESTGoogle Cloud que contiene el objeto y el campo que quieres restringir. Por ejemplo, storage.googleapis.com/Bucket.

  • METHOD1,METHOD2: una lista de métodos RESTful para los que se debe 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 admitido, por ejemplo, "resource.versioning.enabled == true". Este campo tiene una longitud máxima de 1000 caracteres. Para obtener más información sobre el uso de CEL, consulta Lenguaje de expresión común.

  • ACTION: la acción que se debe llevar a cabo si se cumple la condición condition. Puede ser ALLOW o DENY.

  • DISPLAY_NAME: nombre descriptivo de la restricción. Este campo tiene una longitud máxima de 200 caracteres.

  • DESCRIPTION: descripción de la restricción que se mostrará como mensaje de error cuando se infrinja la política. Este campo tiene una longitud máxima de 2000 caracteres.

Una vez que hayas creado el archivo YAML de una nueva restricción personalizada, debes configurarla para que esté disponible en las políticas de 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
Sustituye CONSTRAINT_PATH por la ruta completa a tu archivo de restricciones personalizadas. Por ejemplo, /home/user/customconstraint.yaml. Una vez completado el proceso, las restricciones personalizadas estarán disponibles como políticas de organización en la lista de Google Cloud políticas de organización. Para verificar que la restricción personalizada existe, usa el comando gcloud org-policies list-custom-constraints:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
Sustituye ORGANIZATION_ID por el ID del recurso de tu organización. Para obtener más información, consulta Ver políticas de la organización.

Si la solicitud se realiza correctamente, el resultado será 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 gestionar restricciones personalizadas, consulta Crear y gestionar restricciones personalizadas.

Aplicar una restricción

Para aplicar una restricción, crea una política de organización que haga referencia a ella y, a continuación, aplica esa política de organización a un Google Cloud recurso.

Consola

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

    Ir a Políticas de organización

  2. En el selector de proyectos, elige el proyecto para el que quieras definir la política de organización.
  3. En la lista de la página Políticas de organización, selecciona la restricción para ver la página Detalles de la política correspondiente.
  4. Para configurar la política de la organización de este recurso, haz clic en Gestionar política.
  5. En la página Editar política, selecciona Anular política del recurso superior.
  6. Haz clic en Añadir regla.
  7. En la sección Aplicación, selecciona si quieres activar o desactivar la aplicación de esta política de la organización.
  8. Opcional: Para que la política de la organización dependa de una etiqueta, haz clic en Añadir condición. Ten en cuenta que, si añades una regla condicional a una política de organización, debes añadir al menos una regla incondicional o la política no se podrá guardar. Para obtener más información, consulta Configurar una política de organización con etiquetas.
  9. Haz clic en Probar cambios para simular el efecto de la política de la organización. La simulación de políticas no está disponible para las restricciones gestionadas antiguas. Para obtener más información, consulta el artículo Probar los cambios en las políticas de la organización con el simulador de políticas.
  10. Para finalizar y aplicar la política de organización, haz clic en Definir política. La política tarda hasta 15 minutos en aplicarse.

gcloud

Para crear una política de organización con reglas booleanas, crea un archivo YAML de política que haga referencia a la restricción:

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

Haz los cambios siguientes:

  • PROJECT_ID: el proyecto en el que quieras aplicar la restricción.
  • CONSTRAINT_NAME: el nombre que has definido 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
    

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

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

Ejemplo: crear una restricción que aplique claves de cifrado gestionadas por el cliente en los segmentos

gcloud

  1. Crea un archivo de restricciones 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. Define 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

    Sustituye PROJECT_ID por el ID del proyecto.

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

  4. Aplica la política.

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

Ejemplos de restricciones personalizadas para casos prácticos habituales

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

Caso práctico Sintaxis
Las políticas de retención de segmentos deben tener un periodo que se encuentre 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 segmentos deben tener habilitada la gestión 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 segmentos 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 contenedores no pueden tener habilitado el bloqueo de contenedor
      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 contenedores 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 segmentos ubicados en las multirregiones US o EU deben tener un periodo de conservació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 segmentos 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 segmentos deben estar ubicados en una región doble
      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 segmentos no pueden usar clases de almacenamiento antiguas
      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.
El filtrado de IP de los segmentos debe restringir las solicitudes de toda la Internet pública
      name: organizations/ORGANIZATION_ID/customConstraints/custom.IpFilter
      method_types:
CREATE
      resource_types: storage.googleapis.com/Bucket
      condition: "!has(resource.ipFilter) || (resource.ipFilter.mode == 'Disabled' || resource.ipFilter.publicNetworkSource.allowedIpCidrRanges.size() > 0)"
      action_type: DENY
      display_name: Bucket IP filter rules must restrict all the public network
      description: Newly created buckets must have IP filtering and IP filtering rules must restrict all public network resources. 

1 Si se especifica una clave de etiqueta de segmento que no existe, se devuelve un error BAD_CONDITION. Este error impide que se ejecuten los métodos CREATE y UPDATE en el segmento. Para evitar este error, comprueba siempre que la clave de la etiqueta exista primero con "my_annotations.data.source" in resource.labels.

Campos de expresión de las condiciones

En la siguiente tabla se muestran los campos de expresión que puede usar para crear condiciones. Las condiciones se escriben en lenguaje de expresión común (CEL). Ten en cuenta que en el valor de estos campos de expresión se distingue entre mayúsculas y minúsculas.

Para ver las descripciones de los siguientes campos de expresiones y los valores que puede especificar, consulte la representación del recurso Buckets de la API 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
ipFilter.mode string
ipFilter.publicNetworkSource object
ipFilter.publicNetworkSource.allowedIpCidrRanges list
ipFilter.vpcNetworkSources list
ipFilter.vpcNetworkSources.network string
ipFilter.vpcNetworkSources.allowedIpCidrRanges list
objectRetention.mode string
name string
projectNumber2 string
retentionPolicy.isLocked3 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 debe escribirse en mayúsculas.

2 Este campo está obsoleto.

3 Este campo solo se puede usar para prohibir el uso de Bloqueo de segmentos, no para aplicarlo.

Cuestiones importantes

No se recomienda usar etiquetas de contenedor en condiciones de restricciones personalizadas. En su lugar, usa etiquetas, que solo pueden definir los usuarios que tengan los roles de gestión de identidades y accesos necesarios y que están más controladas que las etiquetas.