Especificación de nivel de acceso personalizado

En esta página se detallan los objetos y atributos que se usan para crear expresiones del lenguaje de expresión común (CEL) para los niveles de acceso personalizados. Se incluyen ejemplos.

Para obtener más información sobre CEL, consulta la definición del lenguaje CEL.

Objetos

El Administrador de contextos de acceso proporciona cuatro objetos que contienen atributos de nivel de acceso.

Objetos
origin Contiene atributos que identifican el origen de la solicitud.
request.auth Contiene atributos que identifican los aspectos de autenticación y autorización de la solicitud.
levels Contiene atributos para definir la dependencia de otros niveles de acceso.
device Contiene atributos que describen el dispositivo del que procede la solicitud.

Atributos de origin

En esta sección se enumeran los atributos admitidos por el objeto origin.

Atributos
ip
Tipo cadena
Descripción

La dirección IP desde la que se ha originado la solicitud. Si no se puede determinar la dirección IP, origin.ip devuelve un error. Te recomendamos que uses inIpRange para comprobar si la dirección IP de origen se encuentra en un intervalo de direcciones IP específico en lugar de hacer una comparación de cadenas.

Ejemplo:

inIpRange(origin.ip, ["203.0.113.24"])

region_code
Tipo cadena
Descripción

El código ISO 3166-1 alfa-2 del país o la región desde donde se ha enviado la solicitud. Si no se puede determinar el código de región, origin.region_code se evalúa como un error.

Ejemplo:

origin.region_code == "GB"
origin.region_code in ["US", "FR", "JP"]

Atributos de request.auth

En esta sección se enumeran los atributos admitidos por el objeto request.auth.

Atributos
principal
Tipo cadena, lista(cadena)
Descripción

El ID único del usuario que ha enviado la solicitud.

El valor de request.auth.principal debe ser uno o varios IDs de usuario únicos. Los UUIDs se pueden obtener mediante la API Directory del SDK de administrador.

El valor debe tener el siguiente formato: https://accounts.google.com/UUID

UUID es el UUID de un usuario.

Ejemplo:

request.auth.principal == "https://accounts.google.com/1134924314572461055"
request.auth.principal in ["https://accounts.google.com/1134924314572461055", "https://accounts.google.com/3134824314572461115"]

claims.crd_str.pwd
Tipo booleano
Descripción

El usuario se ha autenticado con una contraseña.

Ejemplo:

request.auth.claims.crd_str.pwd == true

claims.crd_str.push
Tipo booleano
Descripción

El usuario se ha autenticado con una notificación push en el dispositivo móvil.

Ejemplo:

request.auth.claims.crd_str.push == true

claims.crd_str.sms
Tipo booleano
Descripción

El usuario se ha autenticado mediante un código enviado por SMS o por llamada telefónica.

Ejemplo:

request.auth.claims.crd_str.sms == true

claims.crd_str.swk
Tipo booleano
Descripción

La verificación en dos pasos usaba una llave de software, como un teléfono, como llave de seguridad.

Ejemplo:

request.auth.claims.crd_str.swk == true

claims.crd_str.hwk
Tipo booleano
Descripción

La verificación en dos pasos usaba una llave de hardware, como la llave Titan de Google.

Ejemplo:

request.auth.claims.crd_str.hwk == true

claims.crd_str.otp
Tipo booleano
Descripción

El usuario se ha autenticado con métodos de contraseña de un solo uso (Google Authenticator y códigos de verificación alternativos).

Ejemplo:

request.auth.claims.crd_str.otp == true

claims.crd_str.mfa
Tipo booleano
Descripción

El usuario se ha autenticado con alguno de los métodos de esta tabla, excepto con la contraseña.

Ejemplo:

request.auth.claims.crd_str.mfa == true

Para obtener más información sobre la política de seguridad de credenciales, consulta Configurar una política de seguridad de credenciales.

Atributo levels

En esta sección se enumeran los atributos admitidos por el objeto levels.

Atributos
level name
Tipo booleano
Descripción

level name corresponde al nombre de un nivel de acceso que ya tengas.

Cuando se utilicen, las condiciones del nivel de acceso especificado también se deben cumplir, además de los demás requisitos de tu nivel de acceso personalizado.

Ejemplo:

levels.allow_corp_ips

Donde allow_corp_ips es el nombre de un nivel de acceso.

Atributo device

En esta sección se enumeran los atributos admitidos por el objeto device. Si no se encuentra ningún dispositivo asociado a los identificadores de la solicitud, todos los atributos siguientes se evaluarán como un error.

Atributos
encryption_status
Tipo enum
Descripción

Describe el estado del cifrado del dispositivo.

Valores de enumeración:

enum DeviceEncryptionStatus {
  // The encryption status of the device is not specified or not known.
  ENCRYPTION_UNSPECIFIED == 0;
  // The device does not support encryption.
  ENCRYPTION_UNSUPPORTED == 1;
  // The device supports encryption, but is currently unencrypted.
  UNENCRYPTED == 2;
  // The device is encrypted.
  ENCRYPTED == 3;
}

Ejemplo:

device.encryption_status == DeviceEncryptionStatus.ENCRYPTED

is_admin_approved_device
Tipo booleano
Descripción

Si el administrador del dominio ha aprobado el dispositivo.

Ejemplo:

device.is_admin_approved_device == true

is_corp_owned_device
Tipo booleano
Descripción

Si el dispositivo es propiedad de la organización.

Ejemplo:

device.is_corp_owned_device == true

is_secured_with_screenlock
Tipo booleano
Descripción

Indica si el dispositivo tiene habilitada la función de bloqueo de pantalla.

Ejemplo:

device.is_secured_with_screenlock == true

os_type
Tipo enum
Descripción

Identifica el sistema operativo que usa el dispositivo.

Valores de enumeración:

enum OsType {
  // The operating system of the device is not specified or not known.
  OS_UNSPECIFIED == 0;
  // A desktop Mac operating system.
  DESKTOP_MAC == 1;
  // A desktop Windows operating system.
  DESKTOP_WINDOWS == 2;
  // A desktop Linux operating system.
  DESKTOP_LINUX == 3;
  // An Android operating system.
  ANDROID == 4;
  // An iOS operating system.
  IOS == 5;
  // A desktop ChromeOS operating system.
  DESKTOP_CHROME_OS == 6;
}

Ejemplo:

device.os_type == OsType.DESKTOP_MAC
device.os_type != OsType.OS_UNSPECIFIED

vendors
Tipo map<string, Vendor> vendors;
Descripción

El objeto vendors se usa para acceder a los datos proporcionados por proveedores externos de seguridad y gestión de endpoints. Cada proveedor puede rellenar tres atributos de nivel superior compartidos: is_compliant_device, is_managed_device y device_health_score.

Además, los proveedores pueden proporcionar sus propias claves y valores, que se referencian mediante el atributo data. Las claves disponibles para el atributo data varían de un proveedor a otro. Asegúrate de que el valor de la clave sea coherente al comparar la expresión de la política. Por ejemplo, si esperas que el valor de la clave sea una cadena o un valor booleano, asegúrate de compararlo con una cadena o un valor booleano en la expresión de la política. Tenga en cuenta que, si el valor es un número entero, debe compararlo con un número decimal en la expresión de la política.

Para hacer referencia al estado del dispositivo, usa el formato key-acme, donde acme es el ID de cliente de la organización. Puede obtener el ID de cliente de la GET https://www.googleapis.com/admin/directory/v1/customers/my_customerURL. El campo ID de la respuesta contiene el ID de cliente, que empieza por la letra C. Usa la cadena que hay después de la letra C, sin incluirla, para el ID de cliente.C

Valores de enumeración:

// Health score of the device as provided by the vendor (possibly third party).
enum DeviceHealthScore {
  // The health score for the device is not specified or unknown.
  DEVICE_HEALTH_SCORE_UNSPECIFIED = 0;
  // The health of the device is very poor.
  VERY_POOR = 1;
  // The health of the device is poor.
  POOR = 2;
  // The health of the device is ok.
  NEUTRAL = 3;
  // The health of the device is good.
  GOOD = 4;
  // The health of the device is very good.
  VERY_GOOD = 5;
}

Ejemplos:

device.vendors["some_vendor"].is_compliant_device == true

device.vendors["some_vendor"].is_managed_device == true

device.vendors["some_vendor"].device_health_score == DeviceHealthScore.VERY_GOOD

device.vendors["some_vendor"].data["is_device_compromised"] == true

device.vendors["some_vendor"].data["some_num"] == 1.0

android_device_security.verified_boot
Tipo booleano
Descripción

Indica si el estado de inicio verificado de Android es green.

Ejemplo:

device.android_device_security.verified_boot == true

android_device_security.cts_profile_match
Tipo booleano
Descripción

Indica si el dispositivo cumple el perfil de la CTS.

Ejemplo:

device.android_device_security.cts_profile_match == true

android_device_security.verify_apps_enabled
Tipo booleano
Descripción

Si el dispositivo tiene habilitada la función Verificar aplicaciones de Google Play Protect.

Ejemplo:

device.android_device_security.verify_apps_enabled == true

android_device_security.has_potentially_harmful_apps
Tipo booleano
Descripción

Indica si se han encontrado aplicaciones potencialmente dañinas en el dispositivo.

Ejemplo:

device.android_device_security.has_potentially_harmful_apps == true
ios_device_security.is_device_jailbroken
Tipo booleano
Descripción

Indica si se ha detectado que el dispositivo iOS tiene jailbreak.

Ejemplo:

device.ios_device_security.is_device_jailbroken == true

verified_chrome_os
Tipo booleano
Descripción

Si la solicitud procede de un dispositivo con una versión verificada de ChromeOS.

Ejemplo:

device.verified_chrome_os == true

chrome.management_state
Tipo cadena
Descripción

El navegador está gestionado a nivel de navegador o de perfil, y la empresa tiene el dominio correcto.

Un navegador se considera gestionado si las políticas se gestionan y se envían de forma centralizada, y si el dominio del navegador o del perfil gestionado coincide con el dominio esperado en el lado del servidor.

A continuación se indican los estados de gestión de Chrome disponibles:

Estado
MANAGED El navegador o el perfil los gestiona el cliente.
UNMANAGED Ningún cliente gestiona el navegador o el perfil.
MANAGED_BY_OTHER_DOMAIN El navegador o el perfil están gestionados por otro cliente.
PROFILE_MANAGED El cliente gestiona el perfil.
BROWSER_MANAGED El cliente gestiona el navegador.

Ejemplo:

device.chrome.management_state in
    [
        ChromeManagementState.CHROME_MANAGEMENT_STATE_BROWSER_MANAGED,
        ChromeManagementState.CHROME_MANAGEMENT_STATE_PROFILE_MANAGED,
    ]

chrome.versionAtLeast
Tipo cadena
Descripción

El navegador tiene una versión mínima determinada.

Ejemplo:

device.chrome.versionAtLeast("88.0.4321.44")

chrome.is_realtime_url_check_enabled
Tipo booleano
Descripción

Indica si el conector de comprobación de URLs en tiempo real está habilitado.

Ejemplo:

device.chrome.is_realtime_url_check_enabled == true | false

chrome.is_file_upload_analysis_enabled
Tipo booleano
Descripción

¿Está habilitado el conector de análisis de subida de archivos?

Ejemplo:

device.chrome.is_file_upload_analysis_enabled == true | false

chrome.is_file_download_analysis_enabled
Tipo booleano
Descripción

¿Está habilitado el conector de análisis de descarga de archivos?

Ejemplo:

device.chrome.is_file_download_analysis_enabled == true | false

chrome.is_bulk_data_entry_analysis_enabled
Tipo booleano
Descripción

Indica si el conector de análisis de texto en bloque (pegado) está habilitado.

Ejemplo:

device.chrome.is_bulk_data_entry_analysis_enabled == true | false

chrome.is_security_event_analysis_enabled
Tipo booleano
Descripción

¿Está habilitado el conector de informes de eventos de seguridad?

Ejemplo:

device.chrome.is_security_event_analysis_enabled == true | false

Functions

Administrador de contextos de acceso proporciona las siguientes funciones para usarlas en las expresiones CEL de los niveles de acceso personalizados.

Functions
inIpRange(address, [subnets])
Tipo (cadena, lista(cadena)) -< booleano
Descripción

Comprueba si una dirección IP pertenece a una de las subredes dadas.

Ejemplo:

inIpRange(origin.ip, ["192.0.2.0/24", "198.51.100.0/24", "203.0.113.0/24"])

device.versionAtLeast(minVersion)
Tipo DeviceType.(string) -> boolean
Descripción

Comprueba si el sistema operativo del dispositivo es al menos una versión determinada. Te recomendamos que uses esta función con el atributo device.os_type.

Ejemplo:

device.versionAtLeast("10.0") == true

certificateBindingState(origin, device)
Tipo (Peer, DeviceType) -> integer
Descripción

Comprueba si el certificado de cliente asociado al origen coincide con el dispositivo e informa del estado.

El estado devuelto por la función puede ser uno de los siguientes:

  • CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE
  • CertificateBindingState.CERT_NOT_MATCHING_EXISTING_DEVICE
  • CertificateBindingState.CERT_STATE_UNKNOWN

Ejemplo:

certificateBindingState(origin, device) == CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE

startsWith()
Tipo string.(string) -> booleano
Descripción

Comprueba si el operando de cadena empieza por el argumento de prefijo.

Ejemplo:

"Sample string".startsWith("Sample")

endsWith()
Tipo string.(string) -> booleano
Descripción

Comprueba si el operando de cadena termina con el argumento de sufijo.

Ejemplo:

"Sample string".endsWith("string")

origin.clientCertFingerprint()
Tipo Origin.() -> string
Descripción

Devuelve la huella digital del certificado asociado al origen. Puedes usarlo en macros para probar certificados de dispositivos.

Ejemplo:

// Checks if the enterprise certificate associated with the origin matches the device.
device.certificates.exists(cert, cert.is_valid && cert.cert_fingerprint == origin.clientCertFingerprint())

Macros para expresiones CEL

Puedes usar las siguientes macros en las expresiones CEL de los niveles de acceso personalizados:

Macro Descripción
has(e.f) Comprueba si un campo está disponible. Para obtener más información, consulta Selección de campos. Ejemplo:

has({"key": "value"}.key) has(device.vendors.some_vendor)

e.all(x, p) Comprueba si un predicado se cumple para todos los elementos de una lista e o las claves de un mapa e. Aquí, x es un identificador que se usará en p, que se vincula al elemento o a la clave. La macro all() combina resultados de predicados por elemento con el operador and (&&), por lo que, si algún predicado se evalúa como falso, la macro se evalúa como falsa y se ignoran los errores de otros predicados. Ejemplo:

Devuelve false porque no todos los elementos son mayores que 1:
[1,2,3].all(x, x > 1)

e.exists(x, p) Al igual que la macro all(), pero combina los resultados del predicado con el operador or (||). Ejemplo:

Devuelve true porque hay al menos un elemento en la lista que es mayor que 1:
[1,2,3].exists(x, x > 1)

Comprueba si el certificado de empresa asociado al dispositivo coincide con el emisor:
device.certificates.exists(cert, cert.is_valid && cert.issuer == "EMAILADDRESS=test_inter1@beyondcorp.in, CN=inter_1, OU=BCEDemo_1, O=BCEDemo, L=NCR, ST=UP, C=IN")

e.exists_one(x, p) Es similar a la macro exists(), pero se evalúa como true solo si el predicado de exactamente un elemento o clave se evalúa como true y el resto como false. Cualquier otra combinación de resultados booleanos se evalúa como falsa y cualquier error de predicado provoca que la macro genere un error. Ejemplo:

Esta expresión devuelve "false" porque más de un elemento es mayor que 1:
[1,2,3].exists_one(x, x > 1)

Ejemplos de expresiones CEL

En esta sección se incluyen ejemplos de expresiones CEL que se usan para crear niveles de acceso personalizados.

Ejemplo 1

device.encryption_status == DeviceEncryptionStatus.ENCRYPTED && (origin.region_code in ["US"] || device.is_admin_approved_device)

En este ejemplo se muestra un nivel de acceso que requiere que se cumplan las siguientes condiciones para permitir una solicitud:

  • El dispositivo del que procede la solicitud está cifrado.

  • Se cumple una o varias de las siguientes condiciones:

    • La solicitud se originó en Estados Unidos.

    • El administrador del dominio ha aprobado el dispositivo desde el que se originó la solicitud.

Ejemplo 2

(device.os_type == OsType.DESKTOP_WINDOWS && device.is_corp_owned_device) || (device.os_type == OsType.DESKTOP_MAC && device.is_admin_approved_device && device.versionAtLeast("10.11.0"))

En este ejemplo se muestra un nivel de acceso que requiere que se cumplan las siguientes condiciones para permitir una solicitud:

  • Se cumple una de las siguientes condiciones:

    • El dispositivo del que procede la solicitud usa un sistema operativo Windows de escritorio y es propiedad de tu organización.

    • El dispositivo desde el que se originó la solicitud usa un sistema operativo Mac de escritorio, el administrador del dominio lo ha aprobado y usa al menos macOS 10.11.

Ejemplo 3

(certificateBindingState(origin, device) == CertificateBindingState.CERT_MATCHES_EXISTING_DEVICE)

En este ejemplo se muestra un nivel de acceso que requiere que se cumpla la siguiente condición para permitir una solicitud:

  • La función de extensión certificateBindingState determina que el certificado presentado en el momento de la solicitud coincide con uno de los certificados del dispositivo que se registró cuando el dispositivo se inscribió en la verificación de endpoints.