Descripción general de las Condiciones de IAM

En esta página, se describe la función de Condiciones de la administración de identidades y accesos (IAM). Esta función te permite definir y aplicar el control de acceso condicional basado en atributos para los recursos de Google Cloud.

Con las Condiciones de IAM, puedes optar por otorgarles a las identidades (miembros) acceso a recursos solo si se cumplen las condiciones configuradas. Esto puede hacerse a fin de configurar el acceso temporal de los usuarios en el 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 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 declaraciones lógicas que te permiten especificar uno o más atributos que se deben verificar.

Políticas de IAM con condiciones

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

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

El objeto condition es opcional, y cada vinculación de función puede contener una condición o no tener ninguna. Si una vinculación de función no tiene un objeto condition, los miembros en esa vinculación de función siempre tienen la función especificada en el recurso.

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 mediante 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.

Para obtener información sobre cómo agregar, modificar y quitar vinculaciones de funciones condicionales, consulta Administra vinculaciones de funciones condicionales.

CEL para las condiciones

El Common Expression Language o CEL es el lenguaje de expresión que se usa para especificar una expresión en las Condiciones de 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 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 la función y, en última instancia, determina si se permite la autorización.

A continuación, se describen las características de 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 las marcas de tiempo o las strings, 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 se evalúa como 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 a partir 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 los atributos.

Atributos de condiciones

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, la dirección IP de origen o la 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 te permiten crear condiciones que evalúan el recurso en la solicitud de acceso, incluidos el tipo y el nombre del recurso, además del servicio de Google Cloud que se usa.

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

Si deseas obtener información sobre cómo usar los atributos de recursos para configurar el acceso basado en recursos, consulta Configura el acceso basado en 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"

Solo permite el acceso 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 te permiten crear condiciones que evalúan los detalles de la solicitud, como su fecha y hora, el host o la ruta de URL previstos (para IAP), la dirección IP y el puerto de destino (para el túnel TCP de IAP) o su nivel de acceso.

Expresiones de fecha y hora de ejemplo

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

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

Permite el acceso solo durante el horario laboral establecido, 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 determinados, 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 zonas horarias IANA.

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

Si deseas obtener información sobre cómo usar expresiones de fecha y hora para configurar el acceso temporal, consulta Configura el acceso temporal.

Expresiones de ruta y host de URL de ejemplo (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")

Expresiones de IP y puertos de destino de ejemplo (para túneles TCP de IAP)

Permite el acceso a una IP o un puerto de destino en particular en la solicitud:

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

Expresión de nivel de acceso de ejemplo (solo para IAP)

Permite 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.

Expresiones de reglas de reenvío de ejemplo

Permite 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 detalles sobre los esquemas de balanceo de cargas, consulta Usa Condiciones de IAM en los balanceadores de cargas de Google Cloud.

Expresión de ejemplo 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 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
  • Imágenes
  • 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
  • Proyectos
Secret Manager
  • Secretos
  • Versiones de los secretos
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 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 IAM. Sin embargo, puedes agregar vinculaciones de funciones condicionales a nivel de organización o de proyecto. 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 los atributos.

Limitaciones conocidas

Las siguientes limitaciones se aplican a las Condiciones de IAM:

  • Tal como se describe en los detalles de 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 condiciones son compatibles con una cantidad limitada de servicios.
  • Las funciones básicas (roles/owner, roles/editor y 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 que no se admiten en una vinculación de función condicional. Si especificas uno de estos tipos de miembros, la operación setIamPolicy fallará.
  • Recomendamos que ninguna política 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 un 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