Recopila registros de administrador de Duo

Versión del analizador: 5.0

Compatible con:

En este documento, se explica cómo transferir registros de administrador de Duo a Google Security Operations con Google Cloud Storage. El analizador extrae campos de los registros (formato JSON) y los asigna al modelo de datos unificado (UDM). Controla varios tipos de acciones de Duo (acceso, administración de usuarios, administración de grupos) de manera diferente, propagando los campos de UDM relevantes según la acción y los datos disponibles, incluidos los detalles del usuario, los factores de autenticación y los resultados de seguridad. También realiza transformaciones de datos, como combinar direcciones IP, convertir marcas de tiempo y controlar errores.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Un proyecto de GCP con la API de Cloud Storage habilitada
  • Permisos para crear y administrar buckets de GCS
  • Permisos para administrar políticas de IAM en buckets de GCS
  • Permisos para crear funciones de Cloud Run, temas de Pub/Sub y trabajos de Cloud Scheduler
  • Acceso con privilegios al usuario de Duo (aplicación de la API de Admin)

Configura la aplicación de la API de Admin de Duo

  1. Accede al Panel de administración de Duo.
  2. Ve a Applications > Application Catalog.
  3. Agrega la aplicación de la API de Admin.
  4. Registra los siguientes valores:
    • Clave de integración (ikey)
    • Clave secreta (skey)
    • Nombre de host de la API (por ejemplo, api-XXXXXXXX.duosecurity.com)
  5. En Permisos, habilita Otorgar registro de lectura (para leer los registros de administrador).
  6. Guarda la aplicación.

Crea un bucket de Google Cloud Storage

  1. Ve a la consola de Google Cloud.
  2. Selecciona tu proyecto o crea uno nuevo.
  3. En el menú de navegación, ve a Cloud Storage > Buckets.
  4. Haz clic en Crear bucket.
  5. Proporciona los siguientes detalles de configuración:

    Parámetro de configuración Valor
    Asigna un nombre a tu bucket Ingresa un nombre único a nivel global (por ejemplo, duo-admin-logs).
    Tipo de ubicación Elige una en función de tus necesidades (región, birregional o multirregional).
    Ubicación Selecciona la ubicación (por ejemplo, us-central1).
    Clase de almacenamiento Estándar (recomendado para los registros a los que se accede con frecuencia)
    Control de acceso Uniforme (recomendado)
    Herramientas de protección Opcional: Habilita el control de versiones de objetos o la política de retención
  6. Haz clic en Crear.

Crea una cuenta de servicio para la función de Cloud Run

La función de Cloud Run necesita una cuenta de servicio con permisos para escribir en el bucket de GCS.

Crea una cuenta de servicio

  1. En Google Cloud Console, ve a IAM y administración > Cuentas de servicio.
  2. Haz clic en Crear cuenta de servicio.
  3. Proporciona los siguientes detalles de configuración:
    • Nombre de la cuenta de servicio: Ingresa duo-admin-collector-sa.
    • Descripción de la cuenta de servicio: Ingresa Service account for Cloud Run function to collect Duo administrator logs.
  4. Haz clic en Crear y continuar.
  5. En la sección Otorga acceso al proyecto a esta cuenta de servicio, haz lo siguiente:
    1. Haz clic en Seleccionar un rol.
    2. Busca y selecciona Administrador de objetos de Storage.
    3. Haz clic en + Agregar otro rol.
    4. Busca y selecciona Invocador de Cloud Run.
    5. Haz clic en + Agregar otro rol.
    6. Busca y selecciona Invocador de Cloud Functions.
  6. Haz clic en Continuar.
  7. Haz clic en Listo.

Estos roles son necesarios para lo siguiente:

  • Administrador de objetos de Storage: Escribe registros en el bucket de GCS y administra archivos de estado
  • Invocador de Cloud Run: Permite que Pub/Sub invoque la función
  • Invocador de Cloud Functions: Permite la invocación de funciones

Otorga permisos de IAM en el bucket de GCS

Otorga permisos de escritura a la cuenta de servicio en el bucket de GCS:

  1. Ve a Cloud Storage > Buckets.
  2. Haz clic en el nombre del bucket.
  3. Ve a la pestaña Permisos.
  4. Haz clic en Otorgar acceso.
  5. Proporciona los siguientes detalles de configuración:
    • Agregar principales: Ingresa el correo electrónico de la cuenta de servicio.
    • Asignar roles: Selecciona Administrador de objetos de Storage.
  6. Haz clic en Guardar.

Crea un tema de Pub/Sub

Crea un tema de Pub/Sub en el que Cloud Scheduler publicará y al que se suscribirá la función de Cloud Run.

  1. En Google Cloud Console, ve a Pub/Sub > Temas.
  2. Haz clic en Crear tema.
  3. Proporciona los siguientes detalles de configuración:
    • ID del tema: Ingresa duo-admin-trigger.
    • Deja el resto de la configuración con sus valores predeterminados.
  4. Haz clic en Crear.

Crea una función de Cloud Run para recopilar registros

La función de Cloud Run se activa con mensajes de Pub/Sub de Cloud Scheduler para recuperar registros de la API de Duo Admin y los escribe en GCS.

  1. En Google Cloud Console, ve a Cloud Run.
  2. Haz clic en Crear servicio.
  3. Selecciona Función (usa un editor directo para crear una función).
  4. En la sección Configurar, proporciona los siguientes detalles de configuración:

    Parámetro de configuración Valor
    Nombre del servicio duo-admin-collector
    Región Selecciona la región que coincida con tu bucket de GCS (por ejemplo, us-central1).
    Tiempo de ejecución Selecciona Python 3.12 o una versión posterior.
  5. En la sección Activador (opcional), haz lo siguiente:

    1. Haz clic en + Agregar activador.
    2. Selecciona Cloud Pub/Sub.
    3. En Selecciona un tema de Cloud Pub/Sub, elige el tema (duo-admin-trigger).
    4. Haz clic en Guardar.
  6. En la sección Autenticación, haz lo siguiente:

    1. Selecciona Necesita autenticación.
    2. Verifica la Administración de identidades y accesos (IAM).
  7. Desplázate hacia abajo y expande Contenedores, redes y seguridad.

  8. Ve a la pestaña Seguridad:

    • Cuenta de servicio: Selecciona la cuenta de servicio (duo-admin-collector-sa).
  9. Ve a la pestaña Contenedores:

    1. Haz clic en Variables y secretos.
    2. Haz clic en + Agregar variable para cada variable de entorno:
    Nombre de la variable Valor de ejemplo
    GCS_BUCKET duo-admin-logs
    GCS_PREFIX duo/admin
    STATE_KEY duo/admin/state.json
    DUO_IKEY DIXYZ...
    DUO_SKEY ****************
    DUO_API_HOSTNAME api-XXXXXXXX.duosecurity.com
  10. En la pestaña Variables y secretos, desplázate hacia abajo hasta Solicitudes:

    • Tiempo de espera de la solicitud: Ingresa 600 segundos (10 minutos).
  11. Ve a la pestaña Configuración en Contenedores:

    • En la sección Recursos, haz lo siguiente:
      • Memoria: Selecciona 512 MiB o más.
      • CPU: Selecciona 1.
    • Haz clic en Listo.
  12. Desplázate hasta Entorno de ejecución:

    • Selecciona Predeterminado (recomendado).
  13. En la sección Escalamiento de revisión, haz lo siguiente:

    • Cantidad mínima de instancias: Ingresa 0.
    • Cantidad máxima de instancias: Ingresa 100 (o ajusta según la carga esperada).
  14. Haz clic en Crear.

  15. Espera a que se cree el servicio (de 1 a 2 minutos).

  16. Después de crear el servicio, se abrirá automáticamente el editor de código intercalado.

Agrega el código de función

  1. Ingresa main en Punto de entrada de la función.
  2. En el editor de código intercalado, crea dos archivos:

    • Primer archivo: main.py:
    import functions_framework
    from google.cloud import storage
    import json
    import os
    import urllib3
    from datetime import datetime, timezone
    import hmac
    import hashlib
    import base64
    import email.utils
    import urllib.parse
    import time
    
    # Initialize HTTP client
    http = urllib3.PoolManager()
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch Duo Admin logs and write to GCS.
    
        Args:
            cloud_event: CloudEvent object containing Pub/Sub message
        """
    
        # Get environment variables
        bucket_name = os.environ.get('GCS_BUCKET')
        prefix = os.environ.get('GCS_PREFIX', 'duo/admin')
        state_key = os.environ.get('STATE_KEY', 'duo/admin/state.json')
    
        # Duo API credentials
        duo_ikey = os.environ.get('DUO_IKEY')
        duo_skey = os.environ.get('DUO_SKEY')
        duo_api_hostname = os.environ.get('DUO_API_HOSTNAME', '').strip()
    
        if not all([bucket_name, duo_ikey, duo_skey, duo_api_hostname]):
            print('Error: Missing required environment variables')
            return
    
        try:
            # Get GCS bucket
            bucket = storage_client.bucket(bucket_name)
    
            # Load state (last processed timestamp)
            state = load_state(bucket, state_key)
            now = int(time.time())
            mintime = state.get('mintime', now - 3600)
    
            print(f'Processing logs since {mintime}')
    
            # Fetch logs from Duo Admin API
            page = 0
            total = 0
            next_mintime = mintime
            max_seen_ts = mintime
    
            while True:
                page_num = 0
    
                data = duo_api_request(
                    duo_ikey, 
                    duo_skey, 
                    duo_api_hostname,
                    'GET',
                    '/admin/v1/logs/administrator',
                    {'mintime': mintime}
                )
    
                # Write page to GCS
                write_page(bucket, prefix, data, now, page)
                page += 1
    
                # Extract items
                resp = data.get('response')
                items = resp if isinstance(resp, list) else (resp.get('items') if isinstance(resp, dict) else [])
                items = items or []
    
                if not items:
                    break
    
                total += len(items)
    
                # Track the newest timestamp in this batch
                for it in items:
                    ts = epoch_from_item(it)
                    if ts and ts > max_seen_ts:
                        max_seen_ts = ts
    
                # Duo returns only the 1000 earliest events; page by advancing mintime
                if len(items) >= 1000 and max_seen_ts >= mintime:
                    mintime = max_seen_ts
                    next_mintime = max_seen_ts
                    continue
                else:
                    break
    
            # Save checkpoint: newest seen ts, or "now" if nothing new
            if max_seen_ts > next_mintime:
                save_state(bucket, state_key, {'mintime': max_seen_ts})
                next_state = max_seen_ts
            else:
                save_state(bucket, state_key, {'mintime': now})
                next_state = now
    
            print(f'Successfully processed {total} events across {page} pages, next_mintime: {next_state}')
    
        except Exception as e:
            print(f'Error processing logs: {str(e)}')
            raise
    
    def load_state(bucket, key):
        """Load state from GCS."""
        try:
            blob = bucket.blob(key)
            if blob.exists():
                state_data = blob.download_as_text()
                return json.loads(state_data)
        except Exception as e:
            print(f'Warning: Could not load state: {str(e)}')
        return {}
    
    def save_state(bucket, key, state):
        """Save state to GCS."""
        try:
            blob = bucket.blob(key)
            blob.upload_from_string(
                json.dumps(state),
                content_type='application/json'
            )
        except Exception as e:
            print(f'Warning: Could not save state: {str(e)}')
    
    def write_page(bucket, prefix, payload, when, page):
        """Write a page of logs to GCS."""
        try:
            timestamp_str = time.strftime('%Y/%m/%d', time.gmtime(when))
            key = f"{prefix}/{timestamp_str}/duo-admin-{page:05d}.json"
            blob = bucket.blob(key)
            blob.upload_from_string(
                json.dumps(payload, separators=(',', ':')),
                content_type='application/json'
            )
            print(f'Wrote page {page} to {key}')
        except Exception as e:
            print(f'Error writing page {page}: {str(e)}')
            raise
    
    def canon_params(params):
        """Canonicalize parameters for Duo API signature."""
        parts = []
        for k in sorted(params.keys()):
            v = params[k]
            if v is None:
                continue
            parts.append(f"{urllib.parse.quote(str(k), '~')}={urllib.parse.quote(str(v), '~')}")
        return "&".join(parts)
    
    def sign_request(method, host, path, params, ikey, skey):
        """Sign Duo API request."""
        now = email.utils.formatdate()
        canon = "\n".join([
            now,
            method.upper(),
            host.lower(),
            path,
            canon_params(params)
        ])
        sig = hmac.new(skey.encode('utf-8'), canon.encode('utf-8'), hashlib.sha1).hexdigest()
        auth = base64.b64encode(f"{ikey}:{sig}".encode()).decode()
        return {
            'Date': now,
            'Authorization': f'Basic {auth}'
        }
    
    def duo_api_request(ikey, skey, host, method, path, params, timeout=60, max_retries=5):
        """Make a signed request to Duo Admin API with retry logic."""
        assert host.startswith('api-') and host.endswith('.duosecurity.com'), \
            "DUO_API_HOSTNAME must be like api-XXXXXXXX.duosecurity.com"
    
        qs = canon_params(params)
        url = f"https://{host}{path}" + (f"?{qs}" if qs else "")
    
        attempt = 0
        backoff = 1.0
    
        while True:
            headers = sign_request(method, host, path, params, ikey, skey)
            headers['Accept'] = 'application/json'
    
            try:
                response = http.request(method.upper(), url, headers=headers, timeout=timeout)
                return json.loads(response.data.decode('utf-8'))
            except urllib3.exceptions.HTTPError as e:
                # Retry on 429 or 5xx
                if hasattr(e, 'status') and (e.status == 429 or 500 <= e.status <= 599) and attempt < max_retries:
                    time.sleep(backoff)
                    attempt += 1
                    backoff *= 2
                    continue
                raise
            except Exception as e:
                if attempt < max_retries:
                    time.sleep(backoff)
                    attempt += 1
                    backoff *= 2
                    continue
                raise
    
    def epoch_from_item(item):
        """Extract epoch timestamp from log item."""
        # Prefer numeric 'timestamp' (seconds); fallback to ISO8601 'ts'
        ts_num = item.get('timestamp')
        if isinstance(ts_num, (int, float)):
            return int(ts_num)
    
        ts_iso = item.get('ts')
        if isinstance(ts_iso, str):
            try:
                # Accept "...Z" or with offset
                return int(datetime.fromisoformat(ts_iso.replace('Z', '+00:00')).timestamp())
            except Exception:
                return None
        return None
    

    • Segundo archivo: requirements.txt:
    functions-framework==3.*
    google-cloud-storage==2.*
    urllib3>=2.0.0
    
  3. Haz clic en Implementar para guardar y, luego, implementar la función.

  4. Espera a que se complete la implementación (de 2 a 3 minutos).

Crea un trabajo de Cloud Scheduler

Cloud Scheduler publicará mensajes en el tema de Pub/Sub a intervalos regulares, lo que activará la función de Cloud Run.

  1. En Google Cloud Console, ve a Cloud Scheduler.
  2. Haz clic en Crear trabajo.
  3. Proporciona los siguientes detalles de configuración:

    Parámetro de configuración Valor
    Nombre duo-admin-collector-hourly
    Región Selecciona la misma región que la función de Cloud Run
    Frecuencia 0 * * * * (cada hora, en punto)
    Zona horaria Selecciona la zona horaria (se recomienda UTC)
    Tipo de objetivo Pub/Sub
    Tema Selecciona el tema (duo-admin-trigger).
    Cuerpo del mensaje {} (objeto JSON vacío)
  4. Haz clic en Crear.

Opciones de frecuencia de programación

  • Elige la frecuencia según el volumen de registros y los requisitos de latencia:

    Frecuencia Expresión cron Caso de uso
    Cada 5 minutos */5 * * * * Alto volumen y baja latencia
    Cada 15 minutos */15 * * * * Volumen medio
    Cada 1 hora 0 * * * * Estándar (recomendado)
    Cada 6 horas 0 */6 * * * Procesamiento por lotes de bajo volumen
    Diario 0 0 * * * Recopilación de datos históricos

Prueba el trabajo del programador

  1. En la consola de Cloud Scheduler, busca tu trabajo.
  2. Haz clic en Forzar ejecución para activar la tarea de forma manual.
  3. Espera unos segundos y ve a Cloud Run > Servicios > duo-admin-collector > Registros.
  4. Verifica que la función se haya ejecutado correctamente.
  5. Verifica el bucket de GCS para confirmar que se hayan escrito los registros.

Recupera la cuenta de servicio de Google SecOps

Google SecOps usa una cuenta de servicio única para leer datos de tu bucket de GCS. Debes otorgar acceso a tu bucket a esta cuenta de servicio.

Obtén el correo electrónico de la cuenta de servicio

  1. Ve a Configuración > Administración de datos > Feeds. Si estás en una plataforma solo de SIEM, ve a Configuración > Feeds.
  2. Haz clic en Agregar feed nuevo.
  3. Haz clic en Configura un feed único.
  4. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Duo Administrator Logs).
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona Registros de administrador de Duo como el Tipo de registro.
  7. Haz clic en Obtener cuenta de servicio. Se muestra un correo electrónico de cuenta de servicio único, por ejemplo:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Copia esta dirección de correo electrónico para usarla en el siguiente paso.

Otorga permisos de IAM a la cuenta de servicio de Google SecOps

La cuenta de servicio de Google SecOps necesita el rol de visualizador de objetos de Storage en tu bucket de GCS.

  1. Ve a Cloud Storage > Buckets.
  2. Haz clic en el nombre del bucket.
  3. Ve a la pestaña Permisos.
  4. Haz clic en Otorgar acceso.
  5. Proporciona los siguientes detalles de configuración:
    • Agregar entidades: Pega el correo electrónico de la cuenta de servicio de Google SecOps.
    • Asigna roles: Selecciona Visualizador de objetos de Storage.
  6. Haz clic en Guardar.

Configura un feed en Google SecOps para transferir registros de administrador de Duo

  1. Ve a Configuración > Administración de datos > Feeds. Si estás en una plataforma solo de SIEM, ve a Configuración > Feeds.
  2. Haz clic en Agregar feed nuevo.
  3. Haz clic en Configura un feed único.
  4. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Duo Administrator Logs).
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona Registros de administrador de Duo como el Tipo de registro.
  7. Haz clic en Siguiente.
  8. Especifica valores para los siguientes parámetros de entrada:

    • URL del bucket de almacenamiento: Ingresa el URI del bucket de GCS con la ruta de acceso del prefijo:

      gs://duo-admin-logs/duo/admin/
      
      • Reemplaza lo siguiente:

        • duo-admin-logs: Es el nombre de tu bucket de GCS.
        • duo/admin: Es el prefijo o la ruta de acceso de la carpeta opcional en la que se almacenan los registros (deja este campo vacío para la raíz).
      • Ejemplos:

        • Bucket raíz: gs://company-logs/
        • Con el prefijo: gs://company-logs/duo-logs/
        • Con la subcarpeta: gs://company-logs/duo/admin/
    • Opción de eliminación del código fuente: Selecciona la opción de eliminación según tu preferencia:

      • Nunca: Nunca borra ningún archivo después de las transferencias (se recomienda para las pruebas).
      • Borrar archivos transferidos: Borra los archivos después de que se transfirieron correctamente.
      • Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de que se transfirieron correctamente.

    • Antigüedad máxima del archivo: Incluye los archivos modificados en la última cantidad de días. El valor predeterminado es 180 días.

    • Espacio de nombres del recurso: Es el espacio de nombres del recurso.

    • Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.

  9. Haz clic en Siguiente.

  10. Revisa la configuración de tu feed de noticias nuevo en la pantalla Finalizar y, luego, haz clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
acción metadata.product_event_type Es el valor del campo de acción del registro sin procesar.
desc metadata.description Es el valor del campo desc del objeto de descripción del registro sin procesar.
description._status target.group.attribute.labels.value El valor del campo _status dentro del objeto de descripción del registro sin procesar, específicamente cuando se procesan acciones relacionadas con el grupo. Este valor se coloca dentro de un array "labels" con una "key" correspondiente de "status".
description.desc metadata.description El valor del campo desc del objeto de descripción del registro sin procesar.
description.email target.user.email_addresses Es el valor del campo de correo electrónico del objeto de descripción del registro sin procesar.
description.error security_result.summary Es el valor del campo de error del objeto de descripción del registro sin procesar.
description.factor extensions.auth.auth_details Es el valor del campo factor del objeto de descripción del registro sin procesar.
description.groups.0._status target.group.attribute.labels.value El valor del campo _status del primer elemento del array de grupos dentro del objeto de descripción del registro sin procesar. Este valor se coloca dentro de un array "labels" con una "key" correspondiente de "status".
description.groups.0.name target.group.group_display_name El valor del campo de nombre del primer elemento en el array de grupos dentro del objeto de descripción del registro sin procesar.
description.ip_address principal.ip Es el valor del campo ip_address del objeto de descripción del registro sin procesar.
description.name target.group.group_display_name Es el valor del campo de nombre del objeto de descripción del registro sin procesar.
description.realname target.user.user_display_name Es el valor del campo realname del objeto de descripción del registro sin procesar.
description.status target.user.attribute.labels.value Es el valor del campo de estado del objeto de descripción del registro sin procesar. Este valor se coloca dentro de un array "labels" con una "key" correspondiente de "status".
description.uname target.user.email_addresses o target.user.userid Es el valor del campo uname del objeto de descripción del registro sin procesar. Si coincide con un formato de dirección de correo electrónico, se asigna a email_addresses; de lo contrario, se asigna a userid.
host principal.hostname Es el valor del campo host del registro sin procesar.
isotimestamp metadata.event_timestamp.seconds Es el valor del campo isotimestamp del registro sin procesar, convertido a segundos de época.
objeto target.group.group_display_name Es el valor del campo de objeto del registro sin procesar.
timestamp metadata.event_timestamp.seconds Es el valor del campo de marca de tiempo del registro sin procesar.
nombre de usuario target.user.userid o principal.user.userid Si el campo de acción contiene "login", el valor se asigna a target.user.userid. De lo contrario, se asigna a principal.user.userid.
- extensions.auth.mechanism Se establece en "USERNAME_PASSWORD" si el campo de acción contiene "login".
- metadata.event_type Lo determina el analizador en función del campo de acción. Valores posibles: USER_LOGIN, GROUP_CREATION, USER_UNCATEGORIZED, GROUP_DELETION, USER_CREATION, GROUP_MODIFICATION, GENERIC_EVENT.
- metadata.product_name Siempre se establece en "DUO_ADMIN".
- metadata.product_version Siempre se establece en "MULTI-FACTOR_AUTHENTICATION".
- metadata.vendor_name Siempre se establece en "DUO_SECURITY".
- principal.user.user_role Se establece en "ADMINISTRATOR" si el campo eventtype contiene "admin".
- security_result.action Lo determina el analizador en función del campo de acción. Se establece en "BLOCK" si el campo de acción contiene "error"; de lo contrario, se establece en "ALLOW".
- target.group.attribute.labels.key Siempre se establece en "status" cuando se propagan las etiquetas target.group.attribute.labels.
- target.user.attribute.labels.key Siempre se establece en "status" cuando se completa target.user.attribute.labels.
description.role event.idm.read_only_udm.target.user.attribute.roles.name Asignado desde el registro de cambios
description.role event.idm.read_only_udm.principal.user.attribute.roles.name Asignado desde el registro de cambios
description.status event.idm.read_only_udm.security_result.description Asignado desde el registro de cambios
description.phone event.idm.read_only_udm.target.user.phone_numbers Asignado desde el registro de cambios
resource_name event.idm.read_only_udm.principal.resource.name Asignado desde el registro de cambios
app event.idm.read_only_udm.principal.application Asignado desde el registro de cambios
description.is_temporary_password event.idm.read_only_udm.additional.fields Asignado desde el registro de cambios
description.hardtoken event.idm.read_only_udm.additional.fields Asignado desde el registro de cambios
description.restricted_by_admin_units event.idm.read_only_udm.additional.fields Asignado desde el registro de cambios
description.webauthnkey" and "description.credential_name additional.fields Asignado desde el registro de cambios
description.owner_type principal.user.role_name Asignado desde el registro de cambios
description.owner_name principal.user.user_display_name Asignado desde el registro de cambios
description.owner_id principal.user.attribute.labels Asignado desde el registro de cambios
triage_event_uri metadata.url_back_to_product Asignado desde el registro de cambios
description.count", "description.valid_secs", "description.remaining_uses", "description.bypass", "description.bypass_code_ids.0", "description.user_id", "description.directory", and "description.users additional.fields Asignado desde el registro de cambios
description.os_version principal.platform_version Asignado desde el registro de cambios
description.lastname principal.user.last_name Asignado desde el registro de cambios
description.firstname principal.user.first_name Asignado desde el registro de cambios
description.name principal.user.user_display_name Asignado desde el registro de cambios
description.email principal.user.email_addresses Asignado desde el registro de cambios
description.phones.phone1.pname principal.user.user_display_name Asignado desde el registro de cambios
description.phones.phone1.number target.user.phone_numbers Asignado desde el registro de cambios
description.country_code", "description.manufacturer", "description.model", "description.biometrics_status", "description.tampered_status", "description.passcode_status", "description.phones.phone1.type", "description.phones.phone1.extension", "description.phones.phone1.notes", "description.phones.phone1.predelay", "description.phones.phone1.postdelay", "object", "actionlabel", "description.role", "description.subaccount_role", "description.administrative_units", "description.Users_added", "description.Users_modified", "description.Users_removed", "description.Users_seen", and "description.status additional.fields Asignado desde el registro de cambios

Registro de cambios

Consulta el registro de cambios de este analizador

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.