Recopila registros de auditoría a nivel del grupo de Snyk

Compatible con:

En este documento, se explica cómo transferir registros de auditoría a nivel del grupo de Snyk a Google Security Operations con Google Cloud Storage. Primero, el analizador limpia los campos innecesarios de los registros sin procesar. Luego, extrae información relevante, como detalles del usuario, tipo de evento y marcas de tiempo, y los transforma y asigna al esquema de UDM de Google SecOps para obtener una representación estandarizada del registro de seguridad.

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 servicios de Cloud Run, temas de Pub/Sub y trabajos de Cloud Scheduler
  • Acceso con privilegios a Snyk (administrador del grupo) y un token de API con acceso al grupo
  • Plan de Snyk Enterprise (los extremos de los registros de auditoría solo están disponibles en los planes Enterprise)

Recopila los requisitos previos de los registros de auditoría a nivel del grupo de Snyk (IDs, claves de API, IDs de organización, tokens)

  1. En Snyk, haz clic en tu avatar > Configuración de la cuenta > Token de API.
  2. Haz clic en Revocar y regenerar (o Generar) y copia el token.
  3. Guarda este token como la variable de entorno SNYK_API_TOKEN.
  4. En Snyk, cambia a tu grupo (selector en la esquina superior izquierda).
  5. Ve a Configuración del grupo.
  6. Copia el <GROUP_ID> de la URL: https://app.snyk.io/group/<GROUP_ID>/settings.
    • O bien usa la API de REST: GET https://api.snyk.io/rest/groups?version=2024-01-04 y elige id.
  7. Asegúrate de que el usuario del token tenga permiso de View Audit Logs (group.audit.read).

Verifica los permisos

Para verificar que la cuenta tenga los permisos necesarios, haz lo siguiente:

  1. Accede a Snyk.
  2. Cambia a tu grupo (selector en la esquina superior izquierda).
  3. Ve a Configuración del grupo.
  4. Si ves la opción Registros de auditoría en la navegación de la izquierda, tienes los permisos necesarios.
  5. Si no ves esta opción, comunícate con tu administrador para que te otorgue permiso de Ver registros de auditoría (group.audit.read).

Prueba el acceso a la API

  • Prueba tus credenciales antes de continuar con la integración:

    # Replace with your actual credentials
    SNYK_API_TOKEN="your-token-here"
    SNYK_GROUP_ID="your-group-id-here"
    SNYK_API_VERSION="2024-01-04"
    
    # Test API access
    curl -v -H "Authorization: token ${SNYK_API_TOKEN}" \
      "https://api.snyk.io/rest/groups/${SNYK_GROUP_ID}/audit_logs/search?version=${SNYK_API_VERSION}&size=10"
    

Crea un bucket de Google Cloud Storage

  1. Ve a Google Cloud Console.
  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 global único (por ejemplo, snyk-audit).
    Tipo de ubicación Elige según tus necesidades (región, birregional, 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 y ser invocada por Pub/Sub.

Crear 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 snyk-audit-collector-sa.
    • Descripción de la cuenta de servicio: Ingresa Service account for Cloud Run function to collect Snyk group-level audit logs.
  4. Haz clic en Crear y continuar.
  5. En la sección Otorga a esta cuenta de servicio acceso al proyecto, agrega los siguientes roles:
    1. Haz clic en Selecciona 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 las siguientes acciones:

  • 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 de tu bucket (por ejemplo, snyk-audit).
  3. Ve a la pestaña Permisos.
  4. Haz clic en Otorgar acceso.
  5. Proporciona los siguientes detalles de configuración:
    • Agregar entidades: Ingresa el correo electrónico de la cuenta de servicio (por ejemplo, snyk-audit-collector-sa@PROJECT_ID.iam.gserviceaccount.com).
    • 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 snyk-audit-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 Snyk 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 intercalado 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 snyk-audit-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 de Pub/Sub (snyk-audit-trigger).
    4. Haz clic en Guardar.
  6. En la sección Autenticación, haz lo siguiente:

    1. Selecciona Necesita autenticación.
    2. Verifica Identity and Access Management (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 (snyk-audit-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 snyk-audit
    GCS_PREFIX snyk/audit/
    STATE_KEY snyk/audit/state.json
    SNYK_GROUP_ID <your_group_id>
    SNYK_API_TOKEN xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    SNYK_API_BASE https://api.snyk.io (opcional)
    SNYK_API_VERSION 2024-01-04
    SIZE 100
    MAX_PAGES 20
    LOOKBACK_SECONDS 3600
    EVENTS (opcional) group.create,org.user.add
    EXCLUDE_EVENTS (opcional) api.access
  10. En la sección Variables y Secrets, 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 la sección Recursos, haz lo siguiente:
      • Memoria: Selecciona 512 MiB o más.
      • CPU: Selecciona 1.
  12. 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).
  13. Haz clic en Crear.

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

  15. 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 time
    import urllib.parse
    
    # 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 Snyk group-level audit 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', 'snyk/audit/')
        state_key = os.environ.get('STATE_KEY', 'snyk/audit/state.json')
    
        # Snyk API configuration
        api_base = os.environ.get('SNYK_API_BASE', 'https://api.snyk.io').rstrip('/')
        group_id = os.environ.get('SNYK_GROUP_ID', '').strip()
        api_token = os.environ.get('SNYK_API_TOKEN', '').strip()
        api_version = os.environ.get('SNYK_API_VERSION', '2024-01-04').strip()
    
        size = int(os.environ.get('SIZE', '100'))
        max_pages = int(os.environ.get('MAX_PAGES', '20'))
        lookback_seconds = int(os.environ.get('LOOKBACK_SECONDS', '3600'))
    
        events_csv = os.environ.get('EVENTS', '').strip()
        exclude_events_csv = os.environ.get('EXCLUDE_EVENTS', '').strip()
    
        if not all([bucket_name, group_id, api_token]):
            print('Error: Missing required environment variables')
            return
    
        try:
            # Get GCS bucket
            bucket = storage_client.bucket(bucket_name)
    
            # Load state (last cursor)
            state = load_state(bucket, state_key)
            cursor = state.get('cursor')
    
            print(f'Starting log collection with cursor: {cursor}')
    
            # Prepare headers for Snyk REST API
            headers = {
                'Authorization': f'token {api_token}',
                'Accept': 'application/vnd.api+json'
            }
    
            pages = 0
            total = 0
            last_cursor = cursor
    
            # Only for the very first run (no saved cursor), constrain the time window
            first_run_from_iso = None
            if not cursor and lookback_seconds > 0:
                first_run_from_iso = time.strftime(
                    '%Y-%m-%dT%H:%M:%SZ',
                    time.gmtime(time.time() - lookback_seconds)
                )
    
            while pages < max_pages:
                payload = fetch_page(
                    api_base, group_id, headers, api_version, size,
                    cursor, first_run_from_iso, events_csv, exclude_events_csv
                )
    
                # Write payload to GCS
                write_to_gcs(bucket, prefix, payload)
    
                # Extract items count
                data_obj = payload.get('data') or {}
                items = data_obj.get('items') or []
                if isinstance(items, list):
                    total += len(items)
    
                # Parse next cursor
                cursor = parse_next_cursor_from_links(payload.get('links'))
                pages += 1
    
                if not cursor:
                    break
    
                # After first page, disable from-filter
                first_run_from_iso = None
    
            # Save state
            if cursor and cursor != last_cursor:
                save_state(bucket, state_key, {'cursor': cursor})
    
            print(f'Successfully processed {total} events across {pages} pages. Next cursor: {cursor}')
    
        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_to_gcs(bucket, prefix, payload):
        """Write payload to GCS."""
        ts = time.strftime('%Y/%m/%d/%H%M%S', time.gmtime())
        key = f"{prefix.rstrip('/')}/{ts}-snyk-group-audit.json"
        blob = bucket.blob(key)
        blob.upload_from_string(
            json.dumps(payload, separators=(',', ':')),
            content_type='application/json'
        )
        print(f'Wrote payload to {key}')
    
    def parse_next_cursor_from_links(links):
        """Parse next cursor from links object."""
        if not links:
            return None
        nxt = links.get('next')
        if not nxt:
            return None
        try:
            q = urllib.parse.urlparse(nxt).query
            params = urllib.parse.parse_qs(q)
            cur = params.get('cursor')
            return cur[0] if cur else None
        except Exception:
            return None
    
    def as_list(csv_str):
        """Convert comma-separated string to list."""
        return [x.strip() for x in csv_str.split(',') if x.strip()]
    
    def fetch_page(api_base, group_id, headers, api_version, size, cursor, first_run_from_iso, events_csv, exclude_events_csv):
        """Fetch a single page from Snyk audit logs API."""
        base_path = f'/rest/groups/{group_id}/audit_logs/search'
        params = {
            'version': api_version,
            'size': size,
        }
    
        if cursor:
            params['cursor'] = cursor
        elif first_run_from_iso:
            params['from'] = first_run_from_iso
    
        events = as_list(events_csv)
        exclude_events = as_list(exclude_events_csv)
    
        if events and exclude_events:
            exclude_events = []
    
        if events:
            params['events'] = events
        if exclude_events:
            params['exclude_events'] = exclude_events
    
        url = f"{api_base}{base_path}?{urllib.parse.urlencode(params, doseq=True)}"
    
        response = http.request('GET', url, headers=headers, timeout=60.0)
    
        if response.status == 429 or response.status >= 500:
            retry_after = int(response.headers.get('Retry-After', '1'))
            time.sleep(max(1, retry_after))
            response = http.request('GET', url, headers=headers, timeout=60.0)
    
        if response.status != 200:
            raise Exception(f'API request failed with status {response.status}: {response.data.decode("utf-8")}')
    
        return json.loads(response.data.decode('utf-8'))
    
    • 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 publica mensajes en el tema de Pub/Sub a intervalos regulares, lo que activa 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 snyk-audit-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 de Pub/Sub (snyk-audit-trigger).
    Cuerpo del mensaje {}
  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 y volumen bajo
    Diario 0 0 * * * Recopilación de datos históricos

Prueba la integración

  1. En la consola de Cloud Scheduler, busca tu trabajo (snyk-audit-collector-hourly).
  2. Haz clic en Ejecutar forzosamente para activar el trabajo de forma manual.
  3. Espera unos segundos.
  4. Ve a Cloud Run > Servicios.
  5. Haz clic en el nombre de la función (snyk-audit-collector).
  6. Haz clic en la pestaña Registros.
  7. Verifica que la función se haya ejecutado correctamente. Busca los elementos que se indican a continuación:

    Starting log collection with cursor: None
    Page 1: Retrieved X events
    Wrote payload to snyk/audit/YYYY/MM/DD/HHMMSS-snyk-group-audit.json
    Successfully processed X events across Y pages. Next cursor: ...
    
  8. Ve a Cloud Storage > Buckets.

  9. Haz clic en el nombre de tu bucket (por ejemplo, snyk-audit).

  10. Navega a la carpeta del prefijo (snyk/audit/).

  11. Verifica que se haya creado un archivo .json nuevo con la marca de tiempo actual.

Si ves errores en los registros, haz lo siguiente:

  • HTTP 401: Verifica SNYK_API_TOKEN en las variables de entorno
  • HTTP 403: Verifica que el usuario del token tenga permiso de group.audit.read y que tu suscripción a Snyk sea un plan Enterprise.
  • HTTP 429: Limitación de frecuencia. La función volverá a intentarlo automáticamente con una espera exponencial.
  • Faltan variables de entorno: Verifica que estén configuradas todas las variables obligatorias (GCS_BUCKET, SNYK_GROUP_ID, SNYK_API_TOKEN).

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 de SIEM > 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, Snyk Group Audit Logs).
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona Snyk Group level audit Logs como el Tipo de registro.
  7. Haz clic en Obtener cuenta de servicio. Se muestra un correo electrónico único de la cuenta de servicio, 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 de tu bucket (por ejemplo, snyk-audit).
  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.
    • Asignar roles: Selecciona Visualizador de objetos de Storage.
  6. Haz clic en Guardar.

Configura un feed en Google SecOps para transferir registros de auditoría a nivel del grupo de Snyk

  1. Ve a Configuración de SIEM > 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, Snyk Group Audit Logs).
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona Snyk Group level audit Logs 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://snyk-audit/snyk/audit/
      
      • Reemplaza lo siguiente:

        • snyk-audit: Es el nombre de tu bucket de GCS.
        • snyk/audit/: Es el prefijo o la ruta de acceso a la carpeta en la que se almacenan los registros.
    • 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 cantidad de días especificada. El valor predeterminado es de 180 días.

    • Espacio de nombres del activo: snyk.group_audit

    • Etiquetas de transferencia: Agrégalas si lo deseas.

  9. Haz clic en Siguiente.

  10. Revisa la nueva configuración del feed 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
content.url principal.url Se asigna directamente desde el campo content.url en el registro sin procesar.
creada metadata.event_timestamp Se analiza a partir del campo created en el registro sin procesar con el formato ISO8601.
evento metadata.product_event_type Se asigna directamente desde el campo de evento en el registro sin procesar.
groupId principal.user.group_identifiers Se asigna directamente desde el campo groupId en el registro sin procesar.
orgId principal.user.attribute.labels.key Se establece en "orgId".
orgId principal.user.attribute.labels.value Se asigna directamente desde el campo orgId en el registro sin procesar.
userid principal.user.userid Se asigna directamente desde el campo userId en el registro sin procesar.
N/A metadata.event_type Está codificado como "USER_UNCATEGORIZED" en el código del analizador.
N/A metadata.log_type Está codificado como "SNYK_SDLC" en el código del analizador.
N/A metadata.product_name Está codificado como "SNYK SDLC" en el código del analizador.
N/A metadata.vendor_name Está codificado como "SNYK_SDLC" en el código del analizador.
jsonapi_version event.idm.read_only_udm.metadata.product_version Se asignó desde el registro de cambios
data_type event.idm.read_only_udm.additional.fields Se asignó desde el registro de cambios
file event.idm.read_only_udm.additional.fields Se asignó desde el registro de cambios
requestId event.idm.read_only_udm.additional.fields Se asignó desde el registro de cambios
type event.idm.read_only_udm.additional.fields Se asignó desde el registro de cambios
hostname event.idm.read_only_udm.principal.hostname Se asignó desde el registro de cambios
projectName event.idm.read_only_udm.principal.resource.name Se asignó desde el registro de cambios
target_remote_url event.idm.read_only_udm.target.url Se asignó desde el registro de cambios
targetFile event.idm.read_only_udm.target.file.full_path Se asignó desde el registro de cambios
project_id event.idm.read_only_udm.target.user.attribute.labels Se asignó desde el registro de cambios
field_check event.idm.read_only_udm.principal.resource.attribute.labels Se asignó desde el registro de cambios
group_id event.idm.read_only_udm.principal.user.group_identifiers Se asignó desde el registro de cambios
org_id event.idm.read_only_udm.principal.user.attribute.labels Se asignó desde el registro de cambios
user_id event.idm.read_only_udm.principal.user.userid Se asignó desde el registro de cambios
event event.idm.read_only_udm.metadata.product_event_type Se asignó desde el registro de cambios
created event.idm.read_only_udm.metadata.event_timestamp Se asignó desde el registro de cambios
snyk_request_id additional.fields Se asignó desde el registro de cambios
http_method_details network.http.method_details Se asignó 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.