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
oUPDATE
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
En la consola de Google Cloud, 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 deseas configurar la política de la organización.
Haz clic en
Restricción personalizada.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.
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.
.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.
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
.En Método de aplicación, selecciona si deseas aplicar la restricción en el método de REST
CREATE
oUPDATE
.Para definir una condición, haz clic en
Editar condición.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.Haz clic en Guardar.
En Acción, selecciona si deseas permitir o rechazar el método evaluado si se cumple la condición.
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, como123456789
.CONSTRAINT_NAME
: el nombre que deseas para tu nueva restricción personalizada. Una restricción personalizada debe comenzar concustom.
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 serCREATE
oCREATE
yUPDATE
.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 cumplecondition
. Puede serALLOW
oDENY
.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 una nueva restricción personalizada mediante Google Cloud CLI, debes configurarla a fin de 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
CONSTRAINT_PATH
por la ruta de acceso completa al
archivo de restricción personalizado. Por ejemplo, /home/user/customconstraint.yaml
.
Una vez completadas, encontrarás tus restricciones personalizadas como políticas de organización disponibles 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
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
Para aplicar una restricción booleana, sigue estos pasos:
- En la consola de Google Cloud, 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 proyecto para el que deseas configurar la política de la organización.
- Selecciona tu restricción de la lista en la página de las políticas de la organización. Debería aparecer la página Detalles de la política para esa restricción.
- Si deseas configurar las políticas de la organización para este recurso, haz clic en Administrar política.
- En la página Editar política, selecciona Anular la política del elemento superior.
- Haz clic en Agregar una regla.
- En Aplicación, selecciona si la aplicación de esta política de la organización debe estar activada o desactivada.
- De manera 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.
- 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.
- Para finalizar y aplicar la política de la organización, haz clic en Establecer política. La política tardará 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 tardará 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
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.
Establece 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
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.
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 |
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.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 |
objectRetention.mode |
string |
name |
string |
projectNumber 2 |
string |
retentionPolicy.isLocked |
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 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.