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.

Condiciones y tipos de políticas

Puedes usar condiciones en los siguientes lugares:

  • Políticas de permiso
  • Políticas de denegación
  • Vinculaciones de políticas para las políticas de límite de acceso de las principales

En las siguientes secciones, se describe cómo puedes usar condiciones en cada uno de estos lugares para aplicar el control de acceso basado en atributos.

Condiciones en las políticas de permisos

Puedes usar condiciones en las políticas de autorización para 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 red corporativa.

Las condiciones se especifican en las vinculaciones de roles de la política de permisos de un recurso. Si una vinculación de roles tiene una condición, los principales en el rol solo se les otorga el rol si la expresión de condición se evalúa como true.

Para agregar una condición a una vinculación de roles, debes definir el campo condition:

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]

Para obtener más información sobre los campos de una condición, consulta Estructura de la condición en esta página.

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.

Como práctica recomendada, no agregues más de 100 vinculaciones de roles condicionales a una sola política de permisos. Si usas una mayor cantidad de vinculaciones de roles condicionales, puedes exceder el límite de tamaño general de las políticas de permisos.

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

Condiciones en las políticas de denegación

Puedes usar condiciones en las políticas de denegación para aplicar una regla de denegación solo si se cumple una condición determinada. Por ejemplo, puedes denegar un permiso solo si el recurso al que el principal intenta acceder está etiquetado como parte del entorno prod.

Las condiciones se especifican en las reglas de denegación de las políticas de denegación de un recurso. Si la condición se evalúa como true o no se puede evaluar, se aplica la regla de denegación, y las principales no pueden usar los permisos especificados. Si la condición se evalúa como false, la regla de denegación no se aplica, y las principales pueden usar los permisos especificados si los tienen.

Para agregar una condición a una regla de denegación, debes definir el campo denialCondition:

"rules": [
  {
    "denyRule": {
      "deniedPrincipals": [
        "PRINCIPAL_1",
        "PRINCIPAL_2"
      ],
      "exceptionPrincipals": [
        "EXCEPTION_PRINCIPAL_1",
        "EXCEPTION_PRINCIPAL_2"
      ],
      "deniedPermissions": [
        "DENIED_PERMISSION_1",
        "DENIED_PERMISSION_2"
      ],
      "denialCondition": {
        "title": "TITLE",
        "description": "DESCRIPTION",
        "expression": "EXPRESSION"
      }
    }
  }
]

Para obtener más información sobre los campos de una condición, consulta Estructura de la condición en esta página.

Para obtener información sobre cómo crear y administrar políticas de denegación, consulta Cómo denegar el acceso.

Condiciones en las vinculaciones de la política de límite de acceso de las principales

Puedes usar condiciones en las vinculaciones de políticas para las políticas de límite de acceso de las principales para definir mejor el conjunto de principales al que se aplica la política de límite de acceso de las principales. Por ejemplo, solo podrías aplicar una política para las cuentas de servicio o eximir a super-admin@example.com de una política.

Las condiciones se especifican en cada vinculación de políticas. Si una vinculación de políticas tiene una condición, la política en la vinculación de políticas se aplica solo si la condición se evalúa como true.

Para agregar una condición a una vinculación de políticas, debes definir el campo condition en la vinculación de políticas:

{
  "displayName": "DISPLAY_NAME",
  "target": {
    "principalSet": "PRINCIPAL_SET"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "PAB_POLICY",
  "condition": {
    "title": "TITLE",
    "description": "DESCRIPTION",
    "expression": "EXPRESSION"
  }
}

Para obtener más información sobre los campos de una condición, consulta Estructura de la condición en esta página.

Para obtener información sobre cómo crear vinculaciones de políticas para las Políticas de Límite de Acceso de las Principales, consulta Cómo aplicar una Política de Límite de Acceso de las Principales a un conjunto de principales.

Estructura de la 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 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.

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 a través de operadores lógicos (&&, || o !).

Cada sentencia expresa una regla de control basada en atributos y, en última instancia, determina si se aplica la vinculación de roles, la regla de denegación o la vinculación de políticas.

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 cadena 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 básicas 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.

Los atributos de condición que puedes usar en una expresión de condición dependen del tipo de política para el que escribes condiciones. Para obtener una lista completa de los atributos de condición y más información sobre los atributos compatibles con cada tipo de política, consulta la referencia de atributos.

En las siguientes secciones, se muestran ejemplos de algunos de los atributos que puedes usar en las condiciones.

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

En una vinculación de roles, la siguiente expresión de condición permite el acceso a las instancias de VM de Compute Engine, pero no a otro tipo de recurso:

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

En una vinculación de roles, la siguiente expresión de condición permite el acceso a los recursos de Cloud Storage, pero no a los recursos de ningún otro servicio:

resource.service == 'storage.googleapis.com'

En una vinculación de roles, la siguiente expresión de condición 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/')

En una regla de rechazo, la siguiente expresión de condición deniega el acceso a los recursos de Google Cloud que tienen la etiqueta env: prod:

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

Atributos principales

Los atributos principales te permiten escribir condiciones en función del principal que emitió la solicitud. Los atributos que puedes evaluar incluyen los siguientes:

  • El tipo de principal en la solicitud
  • La identidad del principal en la solicitud

Para obtener más información, consulta la Referencia del atributo de las Condiciones de IAM.

Expresiones de ejemplo

En una vinculación de política de límite de acceso de las principales, la siguiente expresión de condición garantiza que la política en la vinculación solo se aplique a las cuentas de servicio:

principal.type == 'iam.googleapis.com/ServiceAccount'

En una vinculación de política de límite de acceso de las principales, la siguiente expresión de condición garantiza que la política en la vinculación no se aplique para super-admin@example.com:

principal.subject != 'super-admin@example.com'

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. Luego, agrega la siguiente expresión de condición a una vinculación de rol para permitir el acceso solo 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

En una vinculación de roles para un rol con el permiso iam.projects.setIamPolicy, la siguiente expresión de condición permite que un usuario otorgue y revoque solo el rol de Administrador de cuentas de facturación (roles/billing.admin) en el proyecto:

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

En una vinculación de roles, la siguiente expresión de condición permite el acceso hasta la medianoche del 1 de enero de 2021:

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

En una vinculación de roles, la siguiente expresión condicional permite el acceso solo durante el horario laboral 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') <= '

En una vinculación de roles, la siguiente expresión de condición permite el acceso solo para junio de 2020, 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)

En una vinculación de roles, la siguiente expresión de condición 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

En una vinculación de roles, la siguiente expresión de condición 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'
  ])
)

Para obtener detalles sobre los esquemas de balanceo de cargas, consulta Usa Condiciones de IAM en los balanceadores de cargas de Google Cloud.

Expresiones de ruta y host de URL de ejemplo (para IAP)

En una vinculación de roles, la siguiente expresión de condición permite el acceso solo 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')

Expresión de ejemplo con diferentes tipos de atributos

En una vinculación de roles, la siguiente expresión de condición permite el acceso si la solicitud se realiza durante un tiempo específico, coincide con un prefijo de nombre de recurso, tiene el nivel de acceso elegido y es para un tipo de recurso específico:

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?