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
oUPDATE
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:
- Contenedores:
storage.googleapis.com/Bucket
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
En la Google Cloud consola, ve a la página Políticas de la organización.
Selecciona el selector de proyectos en la parte superior de la página.
En el selector de proyectos, selecciona el recurso para el que quieras definir la política de la organización.
Haz clic en
Restricción personalizada.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.
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.
.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.
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
.En Método de aplicación, selecciona si quieres aplicar la restricción al método REST
CREATE
oUPDATE
.Para definir una condición, haz clic en
Editar condición.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.Haz clic en Guardar.
En Acción, seleccione si quiere permitir o denegar el método evaluado si se cumple la condición.
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, como123456789
.CONSTRAINT_NAME
: el nombre que quieras asignar a la nueva restricción personalizada. Una restricción personalizada debe empezar porcustom.
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 serCREATE
oCREATE
yUPDATE
.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óncondition
. Puede serALLOW
oDENY
.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
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
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
- En la Google Cloud consola, ve a la página Políticas de la organización.
- En el selector de proyectos, elige el proyecto para el que quieras definir la política de organización.
- 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.
- Para configurar la política de la organización de este recurso, haz clic en Gestionar política.
- En la página Editar política, selecciona Anular política del recurso superior.
- Haz clic en Añadir regla.
- En la sección Aplicación, selecciona si quieres activar o desactivar la aplicación de esta política de la organización.
- 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.
- 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.
- 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
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.
Define la restricción personalizada.
gcloud org-policies set-custom-constraint enforceCMEK.yaml
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.
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 |
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.dataLocations 1 |
list |
defaultEventBasedHold |
bool |
encryption.defaultKmsKeyName |
string |
iamConfiguration.publicAccessPrevention |
string |
iamConfiguration.uniformBucketLevelAccess.enabled |
bool |
labels |
map |
lifecycle.rule |
list |
lifecycle.rule.action.storageClass 1 |
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 |
location 1 |
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 |
projectNumber 2 |
string |
retentionPolicy.isLocked 3 |
bool |
retentionPolicy.retentionPeriod |
int |
rpo |
string |
softDeletePolicy.retentionDurationSeconds |
int |
storageClass 1 |
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.