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). Puedes usar las condiciones de IAM para 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 otorgar acceso a los principales solo si se cumplen las condiciones especificadas. Por ejemplo, puedes otorgar acceso temporal a los usuarios para que resuelvan un problema de producción, o puedes otorgar acceso solo a los empleados que realicen solicitudes desde tu oficina corporativa.

Las condiciones se especifican en las vinculaciones de roles de la política de permisos de un recurso. Cuando existe una condición, la solicitud de acceso se otorga solo si la expresión de la condición se evalúa como true. Cada expresión de condición es un conjunto de instrucciones lógicas que especifican uno o más atributos que se deben verificar.

Políticas de permisos con condiciones

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

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

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

Solo algunos tipos de recursos aceptan condiciones en las vinculaciones de roles. Sin embargo, puedes otorgar acceso condicional a otros tipos de recursos si otorgas funciones a nivel de organización o de proyecto.

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). La expresión de condición puede contener varias declaraciones; cada declaración evalúa un atributo. 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 para tomar 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 hasta con 12 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 el acceso.

Las condiciones de IAM usan las siguientes funciones de CEL:

  • 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 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, por ejemplo, su tipo o nombre, o en detalles sobre la solicitud, por ejemplo, su marca de tiempo o la dirección IP de destino.

Atributos de recursos

Puedes usar atributos de recursos para escribir condiciones que evalúan el recurso en la solicitud de acceso. Los atributos que puedes evaluar incluyen los siguientes:

  • El tipo de recurso.
  • Es el nombre del recurso
  • El servicio de Google Cloud que se usa
  • Las etiquetas adjuntas al recurso

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"

Permite el acceso solo a los objetos de Cloud Storage dentro de un bucket específico:

resource.type == "storage.googleapis.com/Object" &&
resource.name.startsWith("projects/_/buckets/exampleco-site-assets/")

Permite el acceso a los recursos de Google Cloud que tienen la etiqueta env: prod:

resource.matchTag('123456789012/env', 'prod')

Atributos de solicitud

Puedes usar atributos de solicitud para escribir condiciones que evalúen detalles sobre la solicitud, como las siguientes:

  • El nivel de acceso
  • Fecha y hora
  • La dirección IP y el puerto de destino (para túneles TCP de IAP)
  • La ruta o host de URL esperada (para IAP)

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

En el siguiente ejemplo, la organización define 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. El acceso solo se permite si la solicitud cumple con el nivel de acceso CorpNet:

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

Tu organización define los niveles de acceso 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. Para obtener más detalles, consulta la documentación de Access Context Manager.

Ejemplo de expresión de atributo de la API

Permite que un usuario otorgue y revoque solo la función de administrador de la cuenta de facturación (roles/billing.admin):

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
                 .hasOnly(['roles/billing.admin'])

Si deseas obtener más información para usar los atributos de API para limitar la concesión de funciones, consulta Establece límites en el otorgamiento de funciones.

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 aprender a usar expresiones de fecha y hora para configurar el acceso temporal, consulta Configura el acceso temporal.

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

Permite el acceso a una dirección IP de destino interna o a un número de puerto:

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

Expresiones de reglas de reenvío de ejemplo

Permite el acceso de una principal 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'
  ])
)

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")

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")

¿Qué sigue?