Descripción general de las condiciones de Cloud IAM

En esta página, se describen las características de condiciones de Cloud Identity and Access Management (Cloud IAM). Esta característica te permite definir y aplicar el control de acceso condicional basado en atributos para los recursos de Google Cloud.

Con las condiciones de Cloud IAM, puedes optar por otorgar accesos a recursos a las identidades (miembros) solo si se cumplen las condiciones configuradas. esto podría hacerse a fin de configurar el acceso temporal de los usuarios en caso de un problema de producción o para limitar el acceso a los recursos solo a los empleados que realizan solicitudes desde tu oficina corporativa.

Las condiciones se especifican en las vinculaciones de funciones de la política de Cloud IAM de un recurso. Cuando existe una condición, la solicitud de acceso solo se otorga si la expresión de la condición se evalúa como true. Cada expresión de condición se define como un conjunto de instrucciones lógicas que te permiten especificar uno o más atributos para verificar.

Políticas de Cloud IAM con condiciones

Las políticas de Cloud IAM comprenden una o más vinculaciones de funciones, que tienen la estructura siguiente:

    "bindings": [
      {
        "role": ...
        "members": ...
        "condition": ...
      },
      ...
    ]
    

El objeto condition es opcional y cada vinculación de funciones puede contener cero o una condición. Una vinculación de función sin objeto condition se considera como una concesión incondicional, ya que no es necesaria ninguna verificación de condición. El objeto condition tiene la siguiente estructura:

    "condition": {
        "title": ...
        "description": ...
        "expression": ...
    }
    

El title de la condición es obligatorio, pero la description es opcional. El título y la descripción solo son campos informativos que sirven para ayudarte a identificar y describir la condición.

El campo expression es obligatorio. Define una expresión lógica basada en atributos con un subconjunto de Common Expression Language (CEL). El CEL se describe con más detalle en la siguiente sección. La condición expression puede contener varias declaraciones, cada una usa un atributo y las declaraciones se combinan con operadores lógicos, según la especificación del lenguaje CEL.

CEL para las condiciones

Common Expression Language o CEL es el lenguaje de expresión que se usa para especificar una expresión en las condiciones de Cloud IAM. Está diseñado para expresar expresiones lógicas basadas en atributos. Para obtener más información, consulta la especificación de CEL y su definición de lenguaje.

En las condiciones de Cloud IAM, se usa un subconjunto de CEL con el fin de lograr decisiones de autorización booleanas basadas en datos de atributos. En general, una expresión de condición consiste en una o más declaraciones que se unen mediante operadores lógicos (&&, || o !). Cada declaración expresa una regla de control basada en atributos que se aplica a la vinculación de funciones y, en última instancia, determina si se permite la autorización.

A continuación, se describen las funciones CEL más importantes relacionadas con las condiciones:

  • Variables: las condiciones usan variables para expresar un atributo determinado, como request.time (de tipo marca de tiempo) o resource.name (de tipo string). Estas variables se propagan con el valor en función del contexto en el entorno de ejecución.
  • Operadores: todos los tipos de datos, como marca de tiempo o string, admiten un conjunto de operadores que se pueden usar para crear una expresión lógica. Por lo general, los operadores se usan para comparar el valor que contiene una variable con un valor literal, como resource.service == "compute.googleapis.com". En este ejemplo, si el valor de entrada de resource.service es compute.googleapis.com, la expresión se evalúa como true.
  • Funciones: una función es un operador “compuesto” para los tipos de datos que admiten operaciones más complejas. En las expresiones de condición, hay funciones predefinidas que se pueden usar junto con un tipo de datos determinado. Por ejemplo, request.path.startsWith("/finance") usa una función de coincidencia de prefijo de string y evalúa true si el valor de request.path contiene un prefijo que coincide, como “/finance”.
  • Operadores lógicos: las condiciones admiten tres operadores lógicos que se pueden usar para compilar expresiones lógicas complejas de declaraciones de expresiones simples: &&, || y !. Estos operadores lógicos permiten usar múltiples variables de entrada en una expresión de condición. Por ejemplo: request.time.getFullYear() < 2020 && resource.service == "compute.googleapis.com" une dos declaraciones simples y requiere que se cumplan ambas declaraciones para producir un resultado de evaluación general true.

Para obtener más información sobre las variables, los operadores y las funciones compatibles, consulta la referencia de atributos.

Atributos de condición

Los atributos de condición se basan en el recurso solicitado (p. ej., su tipo o nombre) o en detalles sobre la solicitud (p. ej., su marca de tiempo, dirección IP de origen o dirección IP de destino de la instancia de máquina virtual de Compute Engine de destino). A continuación, se proporcionan ejemplos de expresiones que usan estos atributos.

Atributos de recursos

Los atributos de recursos proporcionan restricciones basadas en el recurso de la solicitud de acceso, como el tipo de recurso, el nombre del recurso o el servicio de Google Cloud que se usa.

Para obtener una lista completa de los atributos de recursos, consulta la referencia de atributos de recursos.

Expresiones de ejemplo

Permite el acceso a las instancias de VM de Compute Engine, pero no a otro tipo de recurso:

resource.type == "compute.googleapis.com/Instance"
    

Permite el acceso a los recursos de Cloud Storage, pero no a otros recursos de servicios:

resource.service == "storage.googleapis.com"
    

Permitir el acceso solo a los recursos cuyos nombres comiencen con una string de prefijo especificada:

resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")
    

Atributos de solicitud

Los atributos de solicitud proporcionan restricciones basadas en detalles sobre la solicitud de acceso, como su fecha/hora, la ruta/host de URL esperada (para IAP), la dirección IP y el puerto de destino (para los túneles TCP de IAP TCP) o su nivel de acceso.

Ejemplo de expresiones de fecha y hora

Permite el acceso de forma temporal hasta una fecha y hora de vencimiento especificadas:

request.time < timestamp("2021-01-01T00:00:00Z")
    

Permite el acceso solo durante el horario de trabajo especificado, según la zona horaria de Berlín, Alemania:

request.time.getHours("Europe/Berlin") >= 9 &&
    request.time.getHours("Europe/Berlin") <= 17 &&
    // Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
    request.time.getDayOfWeek("Europe/Berlin") >= 1 &&
    request.time.getDayOfWeek("Europe/Berlin") <= 5
    

Permite el acceso solo durante un mes y un año específicos, según la zona horaria de Berlín, Alemania:

request.time.getFullYear("Europe/Berlin") == 2020
    request.time.getMonth("Europe/Berlin") < 6
    

Para especificar una marca de tiempo, usa el formato RFC 3339. Para especificar una zona horaria, usa los identificadores en la Base de datos de la zona horaria de IANA.

Para obtener más detalles sobre las expresiones de fecha y hora, consulta la especificación de CEL.

Ejemplo de expresiones de host/ruta de URL (para IAP)

Solo permite el acceso para ciertos subdominios o rutas de URL en la solicitud:

request.host == "hr.example.com"
    request.host.endsWith(".example.com")
    request.path == "/admin/payroll.js"
    request.path.startsWith("/admin")
    

Ejemplo de expresiones de puertos o IP de destino (para túneles TCP de IAP)

Permitir el acceso a una determinada IP o puerto de destino en la solicitud:

destination.ip == "14.0.0.1"
    destination.ip != "127.0.0.1"
    destination.port == 22
    destination.port > 21 && destination.port <= 23
    

Ejemplo de expresión de nivel de acceso (para IAP)

Permitir el acceso solo si la solicitud cumple con un nivel de acceso definido por la organización. En el siguiente ejemplo, la organización definió un nivel de acceso, CorpNet, que limita el acceso al rango de direcciones IP donde entra y sale el tráfico de una red corporativa:

"accessPolicies/199923665455/accessLevels/CorpNet" in
    request.auth.access_levels
    

Tu organización define los niveles de acceso. Se asignan según los atributos de la solicitud, como la dirección IP de origen, los atributos del dispositivo, la hora del día y mucho más. Consulta la documentación de Access Context Manager para obtener más información sobre los niveles de acceso.

Ejemplos de expresiones de reglas de reenvío

Permitir el acceso de un miembro si la solicitud no crea una regla de reenvío o si la solicitud crea una regla de reenvío para un balanceador de cargas interno de Google Cloud:

!compute.isForwardingRuleCreationOperation() || (
      compute.isForwardingRuleCreationOperation() &&
      compute.matchLoadBalancingSchemes([
        'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
      ]))
    )
    

Para obtener más información sobre los esquemas de balanceo de cargas, consulta Usa las condiciones de Cloud IAM en los balanceadores de cargas de Google Cloud.

Ejemplo de expresión con diferentes tipos de atributos

Permite el acceso si la solicitud cumple con las siguientes condiciones: se realiza durante un tiempo específico para un tipo de recurso en particular, coincide con un prefijo de nombre de recurso y posee el nivel de acceso deseado.

request.time > timestamp("2018-08-03T16:00:00-07:00") &&
    request.time < timestamp("2018-08-03T16:05:00-07:00") &&
    ((resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/dev") ||
     (resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod") &&
      "accessPolicies/34569256/accessLevels/CorpNet" in request.auth.access_levels)) ||
     resource.type != "compute.googleapis.com/Instance")
    

Recursos que aceptan vinculaciones de funciones condicionales

Puedes agregar condiciones a las políticas de Cloud IAM para los siguientes tipos de recursos de Google Cloud:

Servicio de Google Cloud Tipos de recursos
Cloud Storage Depósitos1
Compute Engine
  • Servicios de backend globales
  • Servicios de backend regionales
  • Firewalls
  • Images
  • Plantillas de instancia
  • Instancias
  • Discos persistentes regionales
  • Discos persistentes zonales
  • Instantáneas
Identity-Aware Proxy (IAP)
  • Túneles
  • Instancias de túneles
  • Zonas de túneles
  • Todos los servicios web
  • Servicios web individuales
  • Tipos de servicios web
  • Versiones de servicios web
Cloud Key Management Service (Cloud KMS)
  • Claves criptográficas
  • Versiones de claves criptográficas
  • Llaveros de claves
Resource Manager
  • Organizaciones
  • Carpetas
  • Proyectos
1. Puedes usar el atributo resource.name en una condición para hacer referencia a objetos en depósitos de Cloud Storage. Sin embargo, debes agregar la condición a la política de Cloud IAM para un recurso de nivel superior, como el depósito o el proyecto.

Otros tipos de recursos no permiten condiciones en sus políticas de Cloud IAM. Sin embargo, puedes agregar vinculaciones de funciones condicionales a nivel de la organización, la carpeta o el proyecto, y otros recursos heredarán esas vinculaciones de funciones mediante la jerarquía de recursos.

Para obtener más detalles sobre qué atributos afectan qué tipos de recursos, consulta la referencia de atributos.

Limitaciones conocidas

Las siguientes limitaciones se aplican a las Condiciones de Cloud IAM:

  • Tal como se describe en los detalles sobre los servicios compatibles en esta página, puedes agregar condiciones a las vinculaciones de funciones solo para los servicios de Google Cloud seleccionados. Además, la mayoría de los atributos de condición son compatibles con una cantidad limitada de servicios.
  • Las funciones básicas (roles/owner, roles/editor, roles/viewer) no son compatibles; si intentas establecer una condición en una vinculación de función que usa una función básica, la operación setIamPolicy fallará.
  • Los valores allUsers y allAuthenticatedUsers son tipos de miembros no compatibles en una vinculación de función condicional. Si especificas uno de estos tipos de miembros, la operación setIamPolicy fallará.
  • Recomendamos que cada política no contenga más de 100 vinculaciones de funciones condicionales. Existe una limitación de tamaño de almacenamiento subyacente para una política. Las políticas que incluyen muchas vinculaciones de funciones condicionales pueden superar el límite de tamaño y es posible que se rechacen.
  • Te recomendamos que establezcas solo unas pocas vinculaciones de funciones condicionales diferentes para el mismo miembro de la misma función (condiciones diferentes). Sin embargo, puedes incluir el máximo de 20 vinculaciones de funciones para la misma función y el mismo miembro. Si superas esta cantidad, la operación setIamPolicy fallará.
  • Puedes usar un máximo de 12 operadores lógicos en una expresión de condición. Si superas esta cantidad, la operación setIamPolicy fallará.

Próximos pasos