En esta página se describe la función Condiciones de Gestión de Identidades y Accesos (IAM). Puedes usar las condiciones de IAM para definir y aplicar controles de acceso condicionales y basados en atributos a los Google Cloud recursos.
Condiciones y tipos de políticas
Puedes usar condiciones en los siguientes lugares:
- Permitir vinculaciones de roles de políticas, incluidas las vinculaciones de roles gestionadas por derechos de Privileged Access Manager
- Reglas de política de denegación
- Vinculaciones de políticas de límites de acceso de principales
En las siguientes secciones se describe cómo puede usar las condiciones en cada uno de estos lugares para aplicar el control de acceso basado en atributos.
Condiciones en las políticas de permiso
Puedes usar condiciones en las políticas de permiso para conceder acceso a las entidades principales solo si se cumplen las condiciones especificadas. Por ejemplo, puedes conceder acceso temporal a los usuarios para que puedan resolver un problema de producción o puedes conceder acceso solo a los empleados que hagan solicitudes desde tu red corporativa.
Las condiciones se especifican en las vinculaciones de roles de la política de permisos de un recurso. Si un enlace de rol tiene una condición, a las entidades de seguridad del rol solo se les concede el rol si la expresión de la condición se evalúa como true
.
Para añadir una condición a una vinculación de rol, define 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 la sección Estructura de la condición de esta página.
Solo algunos tipos de recursos aceptan condiciones en las vinculaciones de roles. Sin embargo, puedes conceder acceso condicional a otros tipos de recursos asignando roles a nivel de organización o de proyecto.
Como práctica recomendada, no añadas más de 100 vinculaciones de roles condicionales a una sola política de permiso. Si usas un número mayor de vinculaciones de roles condicionales, es posible que superes el límite de tamaño general de las políticas de permiso.
Para saber cómo añadir, modificar y quitar vinculaciones de roles condicionales, consulta el artículo sobre gestionar vinculaciones de roles condicionales.
Condiciones de las políticas de denegación
Puede 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 intenta acceder la entidad se ha 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 entidades 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 entidades de seguridad pueden usar los permisos especificados si los tienen.
Las condiciones de las políticas de denegación tienen la misma estructura que las de las políticas de permiso, pero solo reconocen las funciones de etiquetas de recursos.
Para añadir una condición a una regla de denegación, define 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 la sección Estructura de la condición de esta página.
Para saber cómo crear y gestionar políticas de denegación, consulta Denegar acceso.
Condiciones en las vinculaciones de la política de límites de acceso de principales
Puede usar condiciones en enlaces de políticas de límites de acceso de principales para acotar el conjunto de principales al que se aplica la política de límites de acceso de principales. Por ejemplo, puedes aplicar una política solo a las cuentas de servicio o eximir a super-admin@example.com
de una política.
Las condiciones se especifican en cada enlace de política. Si un enlace de política tiene una condición, la política del enlace solo se aplica si la condición se evalúa como true
.
Para añadir una condición a un enlace de política, define el campo condition
en el enlace de política:
{ "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 la sección Estructura de la condición de esta página.
Para saber cómo crear enlaces de políticas de límites de acceso de principales, consulta Aplicar una política de límites de acceso de 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 el description
es opcional. Tanto el título como la descripción son campos meramente informativos que te ayudan a identificar y describir la condición.
El campo expression
es obligatorio. Define una expresión lógica basada en atributos
mediante un subconjunto del lenguaje de expresión común (CEL).
La expresión de condición puede contener varias instrucciones. Cada instrucción evalúa un atributo. Las instrucciones se combinan mediante operadores lógicos, siguiendo la especificación del lenguaje CEL.
CEL para condiciones
El lenguaje de expresión común (CEL) es el lenguaje de expresiones que se usa para especificar una expresión en las condiciones de IAM. Se ha 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 gestión de identidades y accesos, 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 consta de una o varias instrucciones unidas por operadores lógicos (&&
, ||
o !
).
Las condiciones de gestión de identidades y accesos usan las siguientes funciones de CEL:
- Variables: las condiciones usan variables para expresar un atributo determinado, como
request.time
(de tipo Timestamp) oresource.name
(de tipo String). Estas variables se rellenan con valores en función del contexto en el tiempo de ejecución. - Operadores: cada tipo de datos, como Timestamp o String, admite un conjunto de operadores que se pueden usar para crear una expresión lógica. Lo más habitual es que los operadores se usen para comparar el valor contenido en una variable con un valor literal, como
resource.service == 'compute.googleapis.com'
. En este ejemplo, si el valor de entrada deresource.service
escompute.googleapis.com
, la expresión se evalúa comotrue
. - Funciones: una función es un operador compuesto para 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 concreto. Por ejemplo,
request.path.startsWith('/finance')
usa un prefijo de cadena función de coincidencia y se evalúa comotrue
si el valor derequest.path
contiene un prefijo coincidente, como/finance
. - Operadores lógicos: las condiciones admiten tres operadores lógicos que se pueden usar para crear expresiones lógicas complejas a partir de instrucciones de expresiones básicas:
&&
,||
y!
. Estos operadores lógicos permiten usar varias variables de entrada en una expresión condicional. Por ejemplo:request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com'
combina dos instrucciones básicas y requiere que se cumplan ambas para producir un resultado de evaluación generaltrue
.
Para obtener más información sobre las variables, los operadores y las funciones admitidos, consulta la referencia de atributos.
Atributos de condición
Los atributos de condición se basan en el recurso solicitado (por ejemplo, su tipo o nombre) o en los detalles de la solicitud (por ejemplo, su marca de tiempo o 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 estés escribiendo las condiciones. Para ver una lista completa de los atributos de condición y obtener más información sobre los atributos admitidos en cada tipo de política, consulta la referencia de atributos.
En las siguientes secciones se muestran ejemplos de algunos de los atributos que puede usar en las condiciones.
Atributos de recursos
Puede usar atributos de recursos para escribir condiciones que evalúen el recurso en la solicitud de acceso. Entre los atributos que puedes evaluar se incluyen los siguientes:
- El tipo de recurso
- Nombre del recurso
- El servicio Google Cloud que se está usando
- Las etiquetas asociadas al recurso
Puede usar cualquiera de estos atributos en las vinculaciones de roles de la política de permiso. Además, puede usar el atributo de etiquetas de recursos en las reglas de denegación de la política de denegación.
Para ver una lista completa de los atributos de recursos, consulta la referencia de atributos de recursos.
Para saber cómo usar los atributos de recursos para configurar el acceso basado en recursos, consulta Configurar el acceso basado en recursos.
Ejemplos de expresiones
En un enlace de rol, la siguiente expresión de condición permite el acceso a las instancias de máquina virtual de Compute Engine, pero no a ningún otro tipo de recurso:
resource.type == 'compute.googleapis.com/Instance'
En un enlace de rol, la siguiente expresión de condición permite el acceso a los recursos de Cloud Storage, pero no a los de ningún otro servicio:
resource.service == 'storage.googleapis.com'
En un enlace de rol, la siguiente expresión de condición permite el acceso solo a los objetos de Cloud Storage que se encuentran en un segmento específico:
resource.type == 'storage.googleapis.com/Object' &&
resource.name.startsWith('projects/_/buckets/exampleco-site-assets/')
En una regla de denegación, la siguiente expresión de condición deniega el acceso a los
Google Cloud recursos que tienen la etiqueta env: prod
:
resource.matchTag('123456789012/env', 'prod')
Atributos principales
Los atributos principales te permiten escribir condiciones basadas en la entidad principal que ha enviado la solicitud. Entre los atributos que puedes evaluar se incluyen los siguientes:
- El tipo de principal de la solicitud
- La identidad de la entidad de seguridad de la solicitud
Puede usar estos atributos en las vinculaciones de políticas de las políticas de límites de acceso de principales.
Para obtener más información, consulta la referencia del atributo conditions.
Ejemplos de expresiones
En un enlace de política de límites de acceso de principales, la siguiente expresión de condición asegura que la política del enlace solo se aplique a las cuentas de servicio:
principal.type == 'iam.googleapis.com/ServiceAccount'
En una vinculación de política de límites de acceso de principales, la siguiente expresión condicional
asegura que la política de la vinculación no se aplique a
super-admin@example.com
:
principal.subject != 'super-admin@example.com'
Atributos request
Puede usar atributos de solicitud para escribir condiciones que evalúen detalles sobre la solicitud, como los siguientes:
- El nivel de acceso
- La fecha y la hora
- La dirección IP y el puerto de destino (para la creación de túneles TCP de IAP)
- Host o ruta de URL esperados (para compras en aplicaciones)
Puede usar estos atributos en las vinculaciones de roles de la política de permiso.
Ejemplo de expresión de nivel de acceso (solo para compras en la aplicación)
En el siguiente ejemplo, tu organización define un nivel de acceso, CorpNet
,
que limita el acceso al intervalo de direcciones IP por el que entra y sale el tráfico de una
red corporativa. A continuación, añade la siguiente expresión de condición a una vinculación de rol para permitir el acceso solo si la solicitud cumple el nivel de acceso CorpNet
:
'accessPolicies/199923665455/accessLevels/CorpNet' in
request.auth.access_levels
Tu organización define los niveles de acceso en función de los atributos de la solicitud, como la dirección IP de origen, los atributos del dispositivo, la hora del día y más. Para obtener más información, consulta la documentación del Administrador de contextos de acceso.
Ejemplo de expresión de atributo de API
En un enlace de rol para un rol con el permiso iam.projects.setIamPolicy
, la siguiente expresión de condición permite a un usuario asignar y revocar solo el rol Administrador de cuenta de facturación (roles/billing.admin
) en el proyecto:
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
.hasOnly(['roles/billing.admin'])
Para obtener más información sobre cómo usar los atributos de la API para limitar la concesión de roles, consulta el artículo sobre cómo definir límites en la concesión de roles.
Ejemplos de expresiones de fecha y hora
En un enlace de rol, la siguiente expresión de condición permite el acceso hasta la medianoche del 1 de enero del 2021:
request.time < timestamp('2021-01-01T00:00:00Z')
En una vinculación de rol, la siguiente expresión condicional permite el acceso solo durante las horas de trabajo especificadas, 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 un enlace de rol, la siguiente expresión de condición permite el acceso solo durante el mes de junio del 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 de la base de datos de zonas horarias de IANA.
Para obtener más información sobre las expresiones de fecha y hora, consulta la especificación de CEL.
Para saber cómo usar expresiones de fecha y hora para configurar el acceso temporal, consulte Configurar el acceso temporal.
Ejemplos de expresiones de puerto e IP de destino (para la creación de túneles TCP de IAP)
En un enlace de rol, la siguiente expresión de condición permite el acceso a una dirección IP o un número de puerto de destino internos:
destination.ip == '14.0.0.1'
destination.ip != '127.0.0.1'
destination.port == 22
destination.port > 21 && destination.port <= 23
Ejemplos de expresiones de reglas de reenvío
En un enlace de rol, la siguiente expresión de condición permite el acceso a una entidad si la solicitud no crea una regla de reenvío o si la solicitud crea una regla de reenvío para un balanceador de carga interno: 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 carga, consulta Usar condiciones de IAM en balanceadores de carga Google Cloud .
Ejemplos de expresiones de host o ruta de URL (para compras en aplicaciones)
En un enlace de rol, la siguiente expresión de condición permite el acceso solo a determinados subdominios o rutas de URL de 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 un enlace de rol, la siguiente expresión de condición permite el acceso si la solicitud se realiza durante un periodo 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')
Siguientes pasos
- Consulta información detallada sobre los atributos de condición que puedes usar para gestionar el acceso.
- Más información sobre las políticas de permitir
- Consulta los tipos de recursos que aceptan enlaces de roles condicionales.