Crea y administra restricciones personalizadas

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

La política de la organización de Google Cloud te brinda control programático centralizado sobre los recursos de tu organización. Como administrador de políticas de la organización, puedes definir una política de la organización, que es un conjunto de restricciones llamadas restricciones que se aplican a los recursos de Google Cloud y descendientes de esos recursos en la jerarquía de recursos de Google Cloud. Puedes aplicar políticas de la organización a nivel de la organización, la carpeta o el proyecto.

La política de la organización proporciona restricciones predefinidas para varios servicios de Google Cloud. Sin embargo, si deseas tener un mayor control de las políticas de la organización, puedes crear restricciones personalizadas y usarlas en las políticas de la organización.

En esta página, se describe cómo ver, crear y administrar restricciones de políticas de la organización personalizadas. Los administradores crean restricciones personalizadas para proporcionar un control más detallado y personalizable sobre los campos específicos que restringen las políticas de la organización.

Antes de comenzar

Para obtener más información sobre qué son las políticas y las restricciones de la organización y cómo funcionan, consulta la introducción al servicio de políticas de la organización.

Funciones requeridas

A fin de obtener los permisos que necesitas para administrar las políticas de la organización, pídele al administrador que te otorgue la función de IAM Administrador de políticas de la organización (roles/orgpolicy.policyAdmin). Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.

Esta función predefinida contiene los permisos necesarios para administrar las políticas de la organización. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Restricciones personalizadas

Se crea una restricción personalizada en un archivo YAML que especifica los recursos, métodos, condiciones y acciones que están sujetos a la restricción. Estos son específicos del servicio en el que aplicas la política de la organización. Las condiciones para tu restricción personalizada se definen mediante Common Expression Language (CEL).

Crea un archivo YAML para la restricción personalizada:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resource_types: RESOURCE_NAME
method_types:
- METHOD1
- METHOD2
condition: CONDITION
action_type: ACTION
display_name: DISPLAY_NAME
description: DESCRIPTION

Reemplaza lo siguiente:

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

  • CONSTRAINT_NAME: Es el nombre que deseas para la restricción personalizada nueva. Por ejemplo, custom.disableGkeAutoUpgrade.

  • RESOURCE_NAME: Es el nombre completo del recurso de REST de Google Cloud que contiene el objeto y el campo que deseas restringir. Por ejemplo, container.googleapis.com/NodePool.

  • METHOD1,METHOD2: Es una lista de métodos RESTful para los que se aplica la restricción. Puede ser CREATE, UPDATE o ambos. No todos los servicios de Google Cloud admiten ambos métodos. Para ver los métodos admitidos de cada servicio, busca el servicio en Servicios compatibles.

  • CONDITION: Es una condición de CEL que hace referencia a un recurso de servicio compatible, por ejemplo, resource.management.autoUpgrade == false. Para obtener detalles sobre el uso de CEL, consulta Lenguaje de expresión común.

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

  • DISPLAY_NAME: Es un nombre sencillo para la restricción.

  • DESCRIPTION: Es una descripción sencilla de la restricción que se mostrará como un mensaje de error cuando se incumpla la política.

Para obtener más información sobre los recursos de servicio que puedes usar en tus restricciones personalizadas, consulta Servicios compatibles con restricciones personalizadas.

Common Expression Language

El servicio de políticas de la organización usa Common Expression Language (CEL) para evaluar las condiciones en las restricciones personalizadas. CEL es un lenguaje completo de código abierto que no realiza giras y que implementa una semántica común para la evaluación de expresiones.

Cada servicio que admite restricciones personalizadas hace que un conjunto particular de sus recursos y los campos de estos recursos estén disponibles. Los campos disponibles están escritos de forma sólida y se les puede hacer referencia directamente mediante restricciones personalizadas.

Puedes crear condiciones de CEL que hagan referencia a los campos de recursos de servicio según el tipo de campo. El servicio de políticas de la organización admite un subconjunto de tipos de datos, expresiones y macros de CEL. En las siguientes secciones, se enumeran los tipos de datos disponibles y las expresiones y macros comunes que funcionan con ellos.

Si deseas obtener detalles sobre qué expresiones y macros están disponibles para cada servicio, consulta Servicios compatibles con restricciones personalizadas.

En el siguiente ejemplo de JSON, se muestra cada uno de los tipos de campo posibles a los que puedes hacer referencia mediante restricciones personalizadas:

{
  integerValue: 1
  stringValue: "A text string"
  booleanValue: true
  nestedValue: {
    nestedStringValue: "Another text string"
  }
  listValue: [foo, bar]
  mapValue["costCenter"] == "123"
}

Para cada expresión CEL, la restricción personalizada se aplica cuando la condición se evalúa como true. Puedes combinar expresiones con (&&) o (||) para crear una consulta compleja.

Integer

Los campos de números enteros, como integerValue en el ejemplo anterior, permiten que los operadores de comparación se usen en condiciones. Por ejemplo:

resource.integerValue == 1
resource.integerValue > 5
resource.integerValue < 10

String

Los campos de string, como stringValue en el ejemplo anterior, se pueden evaluar con un literal de string, una expresión regular o una expresión CEL. Por ejemplo:

resource.stringValue == "abc"
// stringValue is exactly "abc".

resource.stringValue.matches("dev$")
// stringValue matches a regular expression, which specifies the string ends
// with the word "dev".

resource.stringValue.startsWith("startValue")
// stringValue starts with "startValue".

resource.stringValue.endsWith("endValue")
// stringValue ends with "endValue".

resource.stringValue.contains("fooBar")
// stringValue contains "fooBar".

Los campos anidados, como nestedStringValue en el ejemplo anterior, deben hacerse referencia a la ruta completa. Por ejemplo:

resource.nestedValue.nestedStringValue == "foo"
// nestedValue contains the object nestedStringValue, which has a value of "foo".

Lista

Los campos de lista, como listValue en el ejemplo anterior, se pueden evaluar según el tamaño de la lista, el contenido de la lista y si existe un elemento en particular dentro de la lista.

Por ejemplo:

resource.listValue.size() >= 1 && resource.listValue[0] == "bar"
// listValue has size greater than or equal to one, and the first element is "bar".

resource.listValue.exists(value, value == "foo")
// listValue has at least one element that is exactly "foo".

resource.listValue.all(value, value.contains("foo"))
// listValue is a list of values that are all exactly "foo".

Map

Los campos de mapa, como mapValue en el ejemplo anterior, son pares clave-valor que se pueden evaluar en función de la existencia y el valor de elementos específicos.

Por ejemplo:

has(resource.mapValue.foo) && resource.mapValue.foo == "bar"
// mapValue contains the key "foo", and that key has the value "bar".

Soluciona errores de CEL

Una condición que se crea con expresiones no válidas o tipos que no coinciden muestra un error cuando intentas configurar la restricción personalizada. Por ejemplo, dada la siguiente restricción personalizada no válida, que compara una string con un número entero:

name: organizations/1234567890123/customConstraints/custom.badConfig
resource_types: dataproc.googleapis.com/Cluster
method_types:
- CREATE
- UPDATE
condition: resource.config.masterConfig.numInstances == "mismatch"
action_type: ALLOW
display_name: Number of instances is a string
description: Demonstrate that type mismatches will cause an error.

Se producirá un error si intentas configurar esa restricción:

ERROR: (gcloud.org-policies.set-custom-constraint) INVALID_ARGUMENT: Custom constraint condition [resource.config.masterConfig.numInstances == "mismatch"] is invalid. Error: ERROR: <input>:1:15: found no matching overload for '_==_' applied to '(int, string)' (candidates: (%A0, %A0))
 | resource.config.masterConfig.numInstances == "mismatch"
 | ..........................................^.

El servicio de políticas de la organización compila y valida las condiciones que creas y muestra un error si la condición no es correcta de manera sintáctica. Sin embargo, hay ciertas condiciones que se compilan, pero dan como resultado un error cuando Google Cloud intenta aplicar las restricciones. Por ejemplo, si configuras una restricción con una condición que intenta acceder a un índice de lista o a una clave de mapa que no existe, la restricción falla y muestra un error en el momento de la aplicación, y bloquea cualquier intento de crear el recurso.

Cuando crees condiciones que dependan de elementos de lista o de mapa, te recomendamos que comiences la condición con una verificación que garantice que la condición sea válida en todos los casos. Por ejemplo, verifica list.size() antes de hacer referencia a un elemento de lista en particular o usa has() antes de hacer referencia a un elemento de mapa.

Restricción de ejemplo

Puedes definir restricciones personalizadas similares a las predefinidas que proporciona Google. Una restricción personalizada típica se verá similar a la siguiente:

name: organizations/1234567890123/customConstraints/custom.disableGkeAutoUpgrade
resource_types: container.googleapis.com/NodePool
method_types:
- CREATE
- UPDATE
condition: resource.management.autoUpgrade == false
action_type: ALLOW
display_name: Disable GKE auto upgrade
description: Only allow GKE NodePool resource to be created or updated if
AutoUpgrade is not enabled where this custom constraint is enforced.

Configura una restricción personalizada

A fin de que una nueva restricción personalizada esté disponible para las políticas de la organización en tu organización, debes configurarla mediante Google Cloud CLI. 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 completa a tu archivo de restricciones personalizado. Por ejemplo, /home/user/customconstraint.yaml. Una vez completadas, encontrarás tus restricciones personalizadas como restricciones 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
Reemplaza ORGANIZATION_ID por el ID del recurso de la organización. El resultado es similar a este:
CONSTRAINT: custom.disableGkeAutoUpgrade
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: COCsm5QGENiXi2E=
Para obtener más información, consulta Visualiza las políticas de la organización.

Actualizar una restricción personalizada

Puedes actualizar una restricción personalizada si vuelves a editar el archivo YAML y usas el comando set-custom-constraint de la CLI de gcloud. No hay control de versiones de restricciones personalizadas, por lo que esta reemplaza la restricción personalizada existente. Si la restricción personalizada ya está aplicada, la restricción personalizada actualizada tendrá efecto de inmediato.

Borrar una restricción personalizada

Para borrar una restricción personalizada, usa el comando org-policies delete-custom-constraint de la CLI de gcloud:

gcloud org-policies delete-custom-constraint custom.CONSTRAINT_NAME \
  --organization=123456789

Reemplaza CONSTRAINT_NAME por el nombre de tu restricción personalizada. Por ejemplo, custom.disableGkeAutoUpgrade. El resultado es similar al siguiente:

Deleted custom constraint [organizations/123456789/customConstraints/custom.disableGkeAutoUpgrade]

Si borras una restricción personalizada, las políticas que se crearon con esa restricción seguirán existiendo, pero se ignorarán.

Si creas otra restricción personalizada con el mismo nombre, las restricciones de la política de la organización ignoradas usarán la nueva restricción personalizada y ya no se ignorarán.

Aplica una restricción personalizada

Una vez que se configura una restricción personalizada, funciona de manera idéntica a las restricciones booleanas predefinidas. Google Cloud verifica las restricciones personalizadas primero cuando evalúa si se permite una solicitud del usuario. Si alguna de las restricciones personalizadas rechaza la solicitud, esta se rechaza. Luego, Google Cloud verifica las restricciones predefinidas que se aplican a ese recurso.

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

Console

Para aplicar una restricción booleana, sigue estos pasos:

  1. Abre la página Políticas de la organización en Google Cloud Console.

    Abrir la página 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 proyecto para el que deseas establecer la política de la organización.
  4. Selecciona tu restricción de la lista en la página Políticas de la organización. Debería aparecer la página Detalles de la política para esa restricción.
  5. Si deseas personalizar las políticas de la organización para este recurso, haz clic en Editar (Edit).
  6. En la página Editar, selecciona Personalizar.
  7. Haga clic en Agregar regla.
  8. En Aplicación, selecciona si la aplicación de esta política de la organización debe estar activada o no.
  9. De manera opcional, para que la política de la organización sea condicional a una etiqueta, haz clic en Agregar condición. Ten en cuenta que si agregas una regla condicional a una política de la organización, debes agregar al menos una regla incondicional, o la política no se podrá guardar. Para obtener más detalles, consulta Establece una política de la organización con etiquetas.
  10. Para finalizar y aplicar la política de la organización, haz clic en Guardar (Save). 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 JSON que haga referencia a la restricción:

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

Reemplaza lo siguiente:

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

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 JSON de la política de la organización. La política tardará hasta 15 minutos en aplicarse.

Servicios compatibles

Cada servicio define el conjunto de campos de restricciones personalizados que se pueden usar para aplicar políticas de la organización en los recursos del servicio. Para obtener una lista de los servicios que admiten restricciones personalizadas, consulta Servicios compatibles con restricciones personalizadas.

Para obtener más información sobre la configuración de un análisis de políticas de la organización, consulta los resultados de vulnerabilidades de las políticas de la organización.

¿Qué sigue?