Recopila los resultados de DomainTools Iris Investigate

Se admite en los siguientes sistemas operativos:

En este documento, se explica cómo transferir los resultados de DomainTools Iris Investigate a Google Security Operations con Google Cloud Storage. El analizador transforma los datos JSON sin procesar de la API de Iris de DomainTools en un formato estructurado que se ajusta al modelo de datos unificado (UDM) de Google SecOps. Extrae información relacionada con los detalles del dominio, la información de contacto, los riesgos de seguridad, los certificados SSL y otros atributos relevantes, y los asigna a los campos correspondientes del UDM para un análisis coherente y la inteligencia sobre amenazas.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Acceso con privilegios a la cuenta empresarial de DomainTools (acceso a la API de Iris Investigate)
  • 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

Obtén la clave y el extremo de la API de DomainTools

  1. Accede al panel de la API de DomainTools (solo la cuenta del propietario de la API puede restablecer la clave de API).
  2. En la sección Mi cuenta, selecciona el vínculo Ver panel de la API ubicado en la pestaña Resumen de la cuenta.
  3. Ve a la sección Nombre de usuario de la API para obtener tu nombre de usuario.
  4. En la misma pestaña, busca tu clave de API.
  5. Copia y guarda la clave en una ubicación segura. Si necesitas una clave nueva, selecciona Restablecer clave de API.

  6. Ten en cuenta el extremo de Iris Investigate: https://api.domaintools.com/v1/iris-investigate/.

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:

    Configuración Valor
    Asigna un nombre a tu bucket Ingresa un nombre global único (por ejemplo, domaintools-iris).
    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 Cloud Run Function

La Cloud Run Function 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 GCP 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 domaintools-iris-collector-sa.
    • Descripción de la cuenta de servicio: Ingresa Service account for Cloud Run function to collect DomainTools Iris Investigate 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 almacenamiento.
    3. Haz clic en + Agregar otra función.
    4. Busca y selecciona Invocador de Cloud Run.
    5. Haz clic en + Agregar otra función.
    6. Busca y selecciona Cloud Functions Invoker.
  6. Haz clic en Continuar.
  7. Haz clic en Listo.

Estos roles son necesarios para las siguientes acciones:

  • Administrador de objetos de almacenamiento: Escribe registros en el bucket de GCS y administra archivos de estado
  • Invocador de Cloud Run: Permite que Pub/Sub invoque la función
  • Cloud Functions Invoker: 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.
  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 (por ejemplo, domaintools-iris-collector-sa@PROJECT_ID.iam.gserviceaccount.com).
    • Asignar roles: Selecciona Administrador de objetos de Storage.
  6. Haz clic en Guardar.

Crear 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 GCP Console, ve a Pub/Sub > Temas.
  2. Haz clic en Crear un tema.
  3. Proporciona los siguientes detalles de configuración:
    • ID del tema: Ingresa domaintools-iris-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 los mensajes de Pub/Sub de Cloud Scheduler para recuperar registros de la API de DomainTools Iris Investigate y escribirlos en GCS.

  1. En GCP 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:

    Configuración Valor
    Nombre del servicio domaintools-iris-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 (domaintools-iris-trigger).
    4. Haz clic en Guardar.
  6. En la sección Autenticación, haz lo siguiente:

    1. Selecciona Solicitar 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 (domaintools-iris-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 Descripción
    GCS_BUCKET domaintools-iris Nombre del bucket de GCS en el que se almacenarán los datos.
    GCS_PREFIX domaintools/iris/ Prefijo de GCS opcional (subcarpeta) para los objetos.
    STATE_KEY domaintools/iris/state.json Es la clave del archivo de estado o punto de control opcional.
    DT_API_KEY DT-XXXXXXXXXXXXXXXXXXXX Clave de API de DomainTools.
    USE_MODE HASH Selecciona el modo que deseas usar: HASH, DOMAINS o QUERY (solo uno está activo a la vez).
    SEARCH_HASHES hash1;hash2;hash3 Obligatorio si USE_MODE=HASH. Lista de hashes de búsquedas guardadas separados por punto y coma desde la IU de Iris.
    DOMAINS example.com;domaintools.com Obligatorio si USE_MODE=DOMAINS. Lista de dominios separados por punto y coma.
    QUERY_LIST ip=1.1.1.1;ip=8.8.8.8;domain=example.org Obligatorio si USE_MODE=QUERY. Lista de cadenas de consulta separadas por punto y coma (k=v&k2=v2).
    PAGE_SIZE 500 Filas por página (el valor predeterminado es 500).
    MAX_PAGES 20 Cantidad máxima de páginas por solicitud.
  10. En la sección Variables y Secrets, desplázate hacia abajo hasta Solicitudes:

    • Tiempo de espera de la solicitud: Ingresa 900 segundos (15 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 Ajuste de escala 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.

Agregar 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 urllib.parse
    from urllib.request import Request, urlopen
    from urllib.error import HTTPError
    import time
    from datetime import datetime, timezone
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    # Environment variables
    GCS_BUCKET = os.environ.get("GCS_BUCKET", "").strip()
    GCS_PREFIX = os.environ.get("GCS_PREFIX", "domaintools/iris/").strip()
    STATE_KEY = os.environ.get("STATE_KEY", "domaintools/iris/state.json").strip()
    DT_API_KEY = os.environ.get("DT_API_KEY", "").strip()
    USE_MODE = os.environ.get("USE_MODE", "HASH").strip().upper()
    SEARCH_HASHES = [h.strip() for h in os.environ.get("SEARCH_HASHES", "").split(";") if h.strip()]
    DOMAINS = [d.strip() for d in os.environ.get("DOMAINS", "").split(";") if d.strip()]
    QUERY_LIST = [q.strip() for q in os.environ.get("QUERY_LIST", "").split(";") if q.strip()]
    PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "500"))
    MAX_PAGES = int(os.environ.get("MAX_PAGES", "20"))
    USE_NEXT = os.environ.get("USE_NEXT", "true").lower() == "true"
    HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60"))
    RETRIES = int(os.environ.get("HTTP_RETRIES", "2"))
    
    BASE_URL = "https://api.domaintools.com/v1/iris-investigate/"
    HDRS = {
        "X-Api-Key": DT_API_KEY,
        "Accept": "application/json",
    }
    
    def _http_post(url: str, body: dict) -> dict:
        """Make HTTP POST request with form-encoded body."""
        req = Request(url, method="POST")
        for k, v in HDRS.items():
            req.add_header(k, v)
        req.add_header("Content-Type", "application/x-www-form-urlencoded")
    
        encoded_body = urllib.parse.urlencode(body, doseq=True).encode('utf-8')
    
        attempt = 0
        while True:
            try:
                with urlopen(req, data=encoded_body, timeout=HTTP_TIMEOUT) as r:
                    return json.loads(r.read().decode("utf-8"))
            except HTTPError as e:
                if e.code in (429, 500, 502, 503, 504) and attempt < RETRIES:
                    delay = int(e.headers.get("Retry-After", "2"))
                    time.sleep(max(1, delay))
                    attempt += 1
                    continue
                raise
    
    def _write_page(bucket, obj: dict, label: str, page: int) -> str:
        ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime())
        key = f"{GCS_PREFIX.rstrip('/')}/{ts}-{label}-p{page:05d}.json"
        blob = bucket.blob(key)
        blob.upload_from_string(
            json.dumps(obj, separators=(",", ":")),
            content_type="application/json"
        )
        return key
    
    def _first_page_params() -> dict:
        params = {"page_size": str(PAGE_SIZE)}
        if USE_NEXT:
            params["next"] = "true"
        return params
    
    def _paginate(bucket, label: str, params: dict) -> tuple:
        pages = 0
        total = 0
    
        while pages < MAX_PAGES:
            data = _http_post(BASE_URL, params)
            _write_page(bucket, data, label, pages)
            resp = data.get("response") or {}
            results = resp.get("results") or []
            total += len(results)
            pages += 1
    
            next_url = resp.get("next") if isinstance(resp, dict) else None
            if next_url:
                parsed = urllib.parse.urlparse(next_url)
                params = dict(urllib.parse.parse_qsl(parsed.query))
                continue
    
            if resp.get("has_more_results") and resp.get("position"):
                base = _first_page_params()
                base.pop("next", None)
                base["position"] = resp["position"]
                params = base
                continue
            break
        return pages, total
    
    def run_hashes(bucket, hashes: list) -> dict:
        agg_pages = agg_results = 0
        for h in hashes:
            params = _first_page_params()
            params["search_hash"] = h
            p, r = _paginate(bucket, f"hash-{h}", params)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    def run_domains(bucket, domains: list) -> dict:
        agg_pages = agg_results = 0
        for d in domains:
            params = _first_page_params()
            params["domain"] = d
            p, r = _paginate(bucket, f"domain-{d}", params)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    def run_queries(bucket, queries: list) -> dict:
        agg_pages = agg_results = 0
        for q in queries:
            base = _first_page_params()
            for k, v in urllib.parse.parse_qsl(q, keep_blank_values=True):
                base.setdefault(k, v)
            p, r = _paginate(bucket, f"query-{q.replace('=', '-')}", base)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch DomainTools Iris Investigate results and write to GCS.
    
        Args:
            cloud_event: CloudEvent object containing Pub/Sub message
        """
    
        if not GCS_BUCKET:
            print("Error: GCS_BUCKET environment variable not set")
            return
    
        try:
            bucket = storage_client.bucket(GCS_BUCKET)
    
            if USE_MODE == "HASH" and SEARCH_HASHES:
                res = run_hashes(bucket, SEARCH_HASHES)
            elif USE_MODE == "DOMAINS" and DOMAINS:
                res = run_domains(bucket, DOMAINS)
            elif USE_MODE == "QUERY" and QUERY_LIST:
                res = run_queries(bucket, QUERY_LIST)
            else:
                raise ValueError(
                    "Invalid USE_MODE or missing parameters. Set USE_MODE to HASH | DOMAINS | QUERY "
                    "and provide SEARCH_HASHES | DOMAINS | QUERY_LIST accordingly."
                )
    
            print(f"Successfully processed: {json.dumps({'ok': True, 'mode': USE_MODE, **res})}")
    
        except Exception as e:
            print(f"Error processing DomainTools Iris data: {str(e)}")
            raise
    
    • Segundo archivo: requirements.txt:
    functions-framework==3.*
    google-cloud-storage==2.*
    
  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 GCP Console, ve a Cloud Scheduler.
  2. Haz clic en Crear trabajo.
  3. Proporciona los siguientes detalles de configuración:

    Configuración Valor
    Nombre domaintools-iris-1h
    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 orientación Pub/Sub
    Tema Selecciona el tema de Pub/Sub (domaintools-iris-trigger).
    Cuerpo del mensaje {} (objeto JSON vacío)
  4. Haz clic en Crear.

Opciones de frecuencia de programación

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

    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 (opción recomendada)
    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.
  2. Haz clic en Forzar ejecución para activar el trabajo de forma manual.
  3. Espera unos segundos.
  4. Ve a Cloud Run > Servicios.
  5. Haz clic en el nombre de tu función (domaintools-iris-collector).
  6. Haz clic en la pestaña Registros.
  7. Verifica que la función se haya ejecutado correctamente. Busca lo siguiente:

    Successfully processed: {"ok": true, "mode": "HASH", "pages": X, "results": Y}
    
  8. Ve a Cloud Storage > Buckets.

  9. Haz clic en el nombre de tu bucket.

  10. Navega a la carpeta del prefijo (domaintools/iris/).

  11. Verifica que se hayan creado archivos .json nuevos con la marca de tiempo actual.

Si ves errores en los registros, haz lo siguiente:

  • HTTP 401: Verifica las credenciales de la API de DomainTools en las variables de entorno.
  • HTTP 403: Verifica que la cuenta tenga los permisos necesarios para la API de Iris Investigate
  • 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 requeridas.
  • USE_MODE no válido: Verifica que USE_MODE esté configurado como HASH, DOMAINS o QUERY, y que se proporcionen los parámetros correspondientes.

Recupera la cuenta de servicio de Google SecOps

Las Operaciones de seguridad de Google usan 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, DomainTools Iris Investigate).
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona DomainTools Threat Intelligence 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 almacenamiento en tu bucket de GCS.

  1. Ve a Cloud Storage > Buckets.
  2. Haz clic en el nombre de tu bucket.
  3. Ve a la pestaña Permisos.
  4. Haz clic en Otorgar acceso.
  5. Proporciona los siguientes detalles de configuración:
    • Agregar principales: 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 los resultados de DomainTools Iris Investigate

  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, DomainTools Iris Investigate).
  5. Selecciona Google Cloud Storage V2 como el Tipo de fuente.
  6. Selecciona DomainTools Threat Intelligence 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://domaintools-iris/domaintools/iris/
      
      • Reemplaza lo siguiente:

        • domaintools-iris: Es el nombre de tu bucket de GCS.
        • domaintools/iris/: Es el prefijo o la ruta de carpeta opcionales en los que se almacenan los registros (déjalo vacío para la raíz).
      • Ejemplos:

        • Bucket raíz: gs://domaintools-iris/
        • Con prefijo: gs://domaintools-iris/domaintools/iris/
    • Opción de borrado de la fuente: Selecciona la opción de borrado 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 la transferencia exitosa.
      • Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de la transferencia exitosa.

    • 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: domaintools.threat_intel

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

  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
activo principal.domain.status Se asigna directamente desde el campo activo en el registro sin procesar.
additional_whois_email.[].value about.labels.additional_whois_email Se extrae del array additional_whois_email y se agrega como una etiqueta en el objeto about.
adsense.value about.labels.adsense Se extrae de adsense.value y se agrega como una etiqueta en el objeto about.
admin_contact.city.value principal.domain.admin.office_address.city Se asigna directamente desde el campo admin_contact.city.value en el registro sin procesar.
admin_contact.country.value principal.domain.admin.office_address.country_or_region Se asigna directamente desde el campo admin_contact.country.value en el registro sin procesar.
admin_contact.email.[].value principal.domain.admin.email_addresses Se extrajo del array admin_contact.email y se agregó al campo email_addresses.
admin_contact.fax.value principal.domain.admin.attribute.labels.fax Se extrae de admin_contact.fax.value y se agrega como una etiqueta con la clave "fax" en el atributo admin.
admin_contact.name.value principal.domain.admin.user_display_name Se asigna directamente desde el campo admin_contact.name.value en el registro sin procesar.
admin_contact.org.value principal.domain.admin.company_name Se asigna directamente desde el campo admin_contact.org.value en el registro sin procesar.
admin_contact.phone.value principal.domain.admin.phone_numbers Se asigna directamente desde el campo admin_contact.phone.value en el registro sin procesar.
admin_contact.postal.value principal.domain.admin.attribute.labels.postal Se extrae de admin_contact.postal.value y se agrega como una etiqueta con la clave "postal" en el atributo admin.
admin_contact.state.value principal.domain.admin.office_address.state Se asigna directamente desde el campo admin_contact.state.value en el registro sin procesar.
admin_contact.street.value principal.domain.admin.office_address.name Se asigna directamente desde el campo admin_contact.street.value en el registro sin procesar.
Alexa about.labels.alexa Se asigna directamente desde el campo alexa en el registro sin procesar y se agrega como una etiqueta en el objeto about.
baidu_codes.[].value about.labels.baidu_codes Se extrae del array baidu_codes y se agrega como una etiqueta en el objeto about.
billing_contact.city.value principal.domain.billing.office_address.city Se asigna directamente desde el campo billing_contact.city.value en el registro sin procesar.
billing_contact.country.value principal.domain.billing.office_address.country_or_region Se asigna directamente desde el campo billing_contact.country.value en el registro sin procesar.
billing_contact.email.[].value principal.domain.billing.email_addresses Se extrajo del array billing_contact.email y se agregó al campo email_addresses.
billing_contact.fax.value principal.domain.billing.attribute.labels.fax Se extrae de billing_contact.fax.value y se agrega como una etiqueta con la clave "fax" en el atributo de facturación.
billing_contact.name.value principal.domain.billing.user_display_name Se asigna directamente desde el campo billing_contact.name.value en el registro sin procesar.
billing_contact.org.value principal.domain.billing.company_name Se asigna directamente desde el campo billing_contact.org.value en el registro sin procesar.
billing_contact.phone.value principal.domain.billing.phone_numbers Se asigna directamente desde el campo billing_contact.phone.value en el registro sin procesar.
billing_contact.postal.value principal.domain.billing.attribute.labels.postal Se extrae de billing_contact.postal.value y se agrega como una etiqueta con la clave "postal" en el atributo de facturación.
billing_contact.state.value principal.domain.billing.office_address.state Se asigna directamente desde el campo billing_contact.state.value en el registro sin procesar.
billing_contact.street.value principal.domain.billing.office_address.name Se asigna directamente desde el campo billing_contact.street.value en el registro sin procesar.
create_date.value principal.domain.creation_time Se convirtió al formato de marca de tiempo desde el campo create_date.value en el registro sin procesar.
data_updated_timestamp principal.domain.audit_update_time Se convirtió al formato de marca de tiempo desde el campo data_updated_timestamp en el registro sin procesar.
dominio principal.hostname Se asigna directamente desde el campo de dominio en el registro sin procesar.
domain_risk.components.[].evidence security_result.detection_fields.evidence Se extrae del array domain_risk.components.[].evidence y se agrega como un campo de detección con la clave "evidence" en el objeto security_result.
domain_risk.components.[].name security_result.category_details Se asigna directamente desde el campo domain_risk.components.[].name en el registro sin procesar.
domain_risk.components.[].risk_score security_result.risk_score Se asigna directamente desde el campo domain_risk.components.[].risk_score en el registro sin procesar.
domain_risk.components.[].threats security_result.threat_name El primer elemento del array domain_risk.components.[].threats se asigna a security_result.threat_name.
domain_risk.components.[].threats security_result.detection_fields.threats Los elementos restantes del array domain_risk.components.[].threats se agregan como campos de detección con la clave "threats" en el objeto security_result.
domain_risk.risk_score security_result.risk_score Se asigna directamente desde el campo domain_risk.risk_score en el registro sin procesar.
email_domain.[].value about.labels.email_domain Se extrae del array email_domain y se agrega como una etiqueta en el objeto about.
expiration_date.value principal.domain.expiration_time Se convirtió al formato de marca de tiempo desde el campo expiration_date.value en el registro sin procesar.
fb_codes.[].value about.labels.fb_codes Se extrae del array fb_codes y se agrega como una etiqueta en el objeto about.
first_seen.value principal.domain.first_seen_time Se convirtió al formato de marca de tiempo desde el campo first_seen.value en el registro sin procesar.
ga4.[].value about.labels.ga4 Se extrae del array de GA4 y se agrega como una etiqueta en el objeto about.
google_analytics.value about.labels.google_analytics Se extrae de google_analytics.value y se agrega como una etiqueta en el objeto about.
gtm_codes.[].value about.labels.gtm_codes Se extrae del array gtm_codes y se agrega como una etiqueta en el objeto about.
hotjar_codes.[].value about.labels.hotjar_codes Se extrae del array hotjar_codes y se agrega como una etiqueta en el objeto about.
ip.[].address.value principal.ip El primer elemento del array de IP se asigna a principal.ip.
ip.[].address.value about.labels.ip_address Los elementos restantes del array ip se agregan como etiquetas con la clave "ip_address" en el objeto about.
ip.[].asn.[].value network.asn El primer elemento del primer array ip.asn se asigna a network.asn.
ip.[].asn.[].value about.labels.asn Los elementos restantes de los arrays ip.asn se agregan como etiquetas con la clave "asn" en el objeto about.
ip.[].country_code.value principal.location.country_or_region El valor de country_code del primer elemento del array ip se asigna a principal.location.country_or_region.
ip.[].country_code.value about.location.country_or_region El valor country_code de los elementos restantes del array ip se asigna a about.location.country_or_region.
ip.[].isp.value principal.labels.isp El valor de isp del primer elemento del array de IP se asigna a principal.labels.isp.
ip.[].isp.value about.labels.isp El valor isp de los elementos restantes del array ip se asigna a about.labels.isp.
matomo_codes.[].value about.labels.matomo_codes Se extrae del array matomo_codes y se agrega como una etiqueta en el objeto about.
monitor_domain about.labels.monitor_domain Se asigna directamente desde el campo monitor_domain en el registro sin procesar y se agrega como una etiqueta en el objeto about.
monitoring_domain_list_name about.labels.monitoring_domain_list_name Se asigna directamente desde el campo monitoring_domain_list_name en el registro sin procesar y se agrega como una etiqueta en el objeto about.
mx.[].domain.value about.domain.name Se asigna directamente desde el campo mx.[].domain.value en el registro sin procesar.
mx.[].host.value about.hostname Se asigna directamente desde el campo mx.[].host.value en el registro sin procesar.
mx.[].ip.[].value about.ip Se extrae del array mx.[].ip y se agrega al campo ip.
mx.[].priority about.security_result.priority_details Se asigna directamente desde el campo mx.[].priority en el registro sin procesar.
name_server.[].domain.value about.labels.name_server_domain Se extrae de name_server.[].domain.value y se agrega como una etiqueta con la clave "name_server_domain" en el objeto about.
name_server.[].host.value principal.domain.name_server Se extrae de name_server.[].host.value y se agrega al campo name_server.
name_server.[].host.value about.domain.name_server Se extrae de name_server.[].host.value y se agrega al campo name_server.
name_server.[].ip.[].value about.labels.ip Se extrae del array ip de name_server[] y se agrega como una etiqueta con la clave "ip" en el objeto about.
popularity_rank about.labels.popularity_rank Se asigna directamente desde el campo popularity_rank en el registro sin procesar y se agrega como una etiqueta en el objeto about.
redirect.value about.labels.redirect Se extrae de redirect.value y se agrega como una etiqueta en el objeto about.
redirect_domain.value about.labels.redirect_domain Se extrae de redirect_domain.value y se agrega como una etiqueta en el objeto about.
registrant_contact.city.value principal.domain.registrant.office_address.city Se asigna directamente desde el campo registrant_contact.city.value en el registro sin procesar.
registrant_contact.country.value principal.domain.registrant.office_address.country_or_region Se asigna directamente desde el campo registrant_contact.country.value en el registro sin procesar.
registrant_contact.email.[].value principal.domain.registrant.email_addresses Se extrajo del array registrant_contact.email y se agregó al campo email_addresses.
registrant_contact.fax.value principal.domain.registrant.attribute.labels.fax Se extrae de registrant_contact.fax.value y se agrega como una etiqueta con la clave "fax" en el atributo de registrante.
registrant_contact.name.value principal.domain.registrant.user_display_name Se asigna directamente desde el campo registrant_contact.name.value en el registro sin procesar.
registrant_contact.org.value principal.domain.registrant.company_name Se asigna directamente desde el campo registrant_contact.org.value en el registro sin procesar.
registrant_contact.phone.value principal.domain.registrant.phone_numbers Se asigna directamente desde el campo registrant_contact.phone.value en el registro sin procesar.
registrant_contact.postal.value principal.domain.registrant.attribute.labels.postal Se extrae de registrant_contact.postal.value y se agrega como una etiqueta con la clave "postal" en el atributo del registrante.
registrant_contact.state.value principal.domain.registrant.office_address.state Se asigna directamente desde el campo registrant_contact.state.value en el registro sin procesar.
registrant_contact.street.value principal.domain.registrant.office_address.name Se asigna directamente desde el campo registrant_contact.street.value en el registro sin procesar.
registrant_name.value about.labels.registrant_name Se extrae de registrant_name.value y se agrega como una etiqueta en el objeto about.
registrant_org.value about.labels.registrant_org Se extrae de registrant_org.value y se agrega como una etiqueta en el objeto about.
registrar.value principal.domain.registrar Se asigna directamente desde el campo registrar.value en el registro sin procesar.
registrar_status about.labels.registrar_status Se extrae del array registrar_status y se agrega como una etiqueta en el objeto about.
server_type network.tls.client.server_name Se asigna directamente desde el campo server_type en el registro sin procesar.
soa_email.[].value principal.user.email_addresses Se extrajo del array soa_email y se agregó al campo email_addresses.
spf_info about.labels.spf_info Se asigna directamente desde el campo spf_info en el registro sin procesar y se agrega como una etiqueta en el objeto about.
ssl_email.[].value about.labels.ssl_email Se extrae del array ssl_email y se agrega como una etiqueta en el objeto about.
ssl_info.[].alt_names.[].value about.labels.alt_names Se extrae del array ssl_info.[].alt_names y se agrega como una etiqueta en el objeto about.
ssl_info.[].common_name.value about.labels.common_name Se extrae de ssl_info.[].common_name.value y se agrega como una etiqueta en el objeto about.
ssl_info.[].duration.value about.labels.duration Se extrae de ssl_info.[].duration.value y se agrega como una etiqueta en el objeto about.
ssl_info.[].email.[].value about.labels.ssl_info_email Se extrae del array ssl_info.[].email y se agrega como una etiqueta con la clave "ssl_info_email" en el objeto about.
ssl_info.[].hash.value network.tls.server.certificate.sha1 El hash.value del primer elemento del array ssl_info se asigna a network.tls.server.certificate.sha1.
ssl_info.[].hash.value about.labels.hash El hash.value de los elementos restantes en el array ssl_info se asigna a about.labels.hash.
ssl_info.[].issuer_common_name.value network.tls.server.certificate.issuer El issuer_common_name.value del primer elemento del array ssl_info se asigna a network.tls.server.certificate.issuer.
ssl_info.[].issuer_common_name.value about.labels.issuer_common_name El valor de issuer_common_name de los elementos restantes en el array ssl_info se asigna a about.labels.issuer_common_name.
ssl_info.[].not_after.value network.tls.server.certificate.not_after El valor not_after del primer elemento del array ssl_info se convierte al formato de marca de tiempo y se asigna a network.tls.server.certificate.not_after.
ssl_info.[].not_after.value about.labels.not_after El valor de not_after de los elementos restantes del array ssl_info se asigna a about.labels.not_after.
ssl_info.[].not_before.value network.tls.server.certificate.not_before El valor not_before del primer elemento del array ssl_info se convierte al formato de marca de tiempo y se asigna a network.tls.server.certificate.not_before.
ssl_info.[].not_before.value about.labels.not_before El valor de not_before de los elementos restantes del array ssl_info se asigna a about.labels.not_before.
ssl_info.[].organization.value network.organization_name El organization.value del primer elemento del array ssl_info se asigna a network.organization_name.
ssl_info.[].organization.value about.labels.organization El valor organization.value de los elementos restantes del array ssl_info se asigna a about.labels.organization.
ssl_info.[].subject.value about.labels.subject Se extrae de ssl_info.[].subject.value y se agrega como una etiqueta en el objeto about.
statcounter_project_codes.[].value about.labels.statcounter_project_codes Se extrae del array statcounter_project_codes y se agrega como una etiqueta en el objeto about.
statcounter_security_codes.[].value about.labels.statcounter_security_codes Se extrae del array statcounter_security_codes y se agrega como una etiqueta en el objeto about.
tags.[].label about.file.tags Se extrae de tags.[].label y se agrega al campo tags.
tags.[].scope security_result.detection_fields.scope Se extrae de tags.[].scope y se agrega como un campo de detección con la clave "scope" en el objeto security_result.
tags.[].tagged_at security_result.detection_fields.tagged_at Se extrajo de tags.[].tagged_at y se agregó como un campo de detección con la clave "tagged_at" en el objeto security_result.
technical_contact.city.value principal.domain.tech.office_address.city Se asigna directamente desde el campo technical_contact.city.value en el registro sin procesar.
technical_contact.country.value principal.domain.tech.office_address.country_or_region Se asigna directamente desde el campo technical_contact.country.value en el registro sin procesar.
technical_contact.email.[].value principal.domain.tech.email_addresses Se extrajo del array technical_contact.email y se agregó al campo email_addresses.
technical_contact.fax.value principal.domain.tech.attribute.labels.fax Se extrajo de technical_contact.fax.value y se agregó como una etiqueta con la clave "fax" en el atributo técnico.
technical_contact.name.value principal.domain.tech.user_display_name Se asigna directamente desde el campo technical_contact.name.value en el registro sin procesar.
technical_contact.org.value principal.domain.tech.company_name Se asigna directamente desde el campo technical_contact.org.value en el registro sin procesar.
technical_contact.phone.value principal.domain.tech.phone_numbers Se asigna directamente desde el campo technical_contact.phone.value en el registro sin procesar.
technical_contact.postal.value principal.domain.tech.attribute.labels.postal Se extrae de technical_contact.postal.value y se agrega como una etiqueta con la clave "postal" en el atributo técnico.
technical_contact.state.value principal.domain.tech.office_address.state Se asigna directamente desde el campo technical_contact.state.value en el registro sin procesar.
technical_contact.street.value principal.domain.tech.office_address.name Se asigna directamente desde el campo technical_contact.street.value en el registro sin procesar.
tld about.labels.tld Se asigna directamente desde el campo tld en el registro sin procesar y se agrega como una etiqueta en el objeto about.
timestamp about.labels.timestamp Se asigna directamente desde el campo de marca de tiempo en el registro sin procesar y se agrega como una etiqueta en el objeto about.
website_response principal.network.http.response_code Se asigna directamente desde el campo website_response en el registro sin procesar.
website_title about.labels.website_title Se asigna directamente desde el campo website_title en el registro sin procesar y se agrega como una etiqueta en el objeto about.
whois_url principal.domain.whois_server Se asigna directamente desde el campo whois_url en el registro sin procesar.
yandex_codes.[].value about.labels.yandex_codes Se extrae del array yandex_codes y se agrega como una etiqueta en el objeto about.
edr.client.hostname Se establece en el valor del campo de dominio.
edr.client.ip_addresses Se establece en el valor del primer elemento del array de IP, específicamente ip.[0].address.value.
edr.raw_event_name Se establece en "STATUS_UPDATE" si principal.hostname está presente; de lo contrario, se establece en "GENERIC_EVENT".
metadata.event_timestamp Se copió del campo create_time de nivel superior en el registro sin procesar.
metadata.event_type Se establece en "STATUS_UPDATE" si principal.hostname está presente; de lo contrario, se establece en "GENERIC_EVENT".
metadata.log_type Se establece en "DOMAINTOOLS_THREATINTEL".
metadata.product_name Se debe establecer en "DOMAINTOOLS".
metadata.vendor_name Se debe establecer en "DOMAINTOOLS".

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