Recopilar resultados de DomainTools Iris Investigate

Disponible en:

En este documento se explica cómo ingerir resultados de DomainTools Iris Investigate en Google Security Operations mediante Amazon S3. El analizador transforma los datos JSON sin procesar de la API 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 de UDM correspondientes para realizar análisis coherentes y obtener información sobre las amenazas.

Antes de empezar

  • Instancia de Google SecOps
  • Acceso privilegiado a la cuenta de empresa de DomainTools (acceso a la API de Iris Investigate)
  • Acceso privilegiado a AWS (S3, IAM, Lambda y EventBridge)

Obtener la clave de API y el endpoint de DomainTools

  1. Inicia sesión en el panel de control 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, seleccione el enlace Ver panel de APIs, situado 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 un lugar seguro.
  6. Si necesitas una nueva clave, selecciona Restablecer clave de API.

  7. Tenga en cuenta el endpoint de Iris Investigate: https://api.domaintools.com/v1/iris-investigate/.

Configurar un segmento de AWS S3 y IAM para Google SecOps

  1. Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
  2. Guarda el nombre y la región del segmento para consultarlos más adelante (por ejemplo, domaintools-iris).
  3. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  4. Selecciona el Usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  7. Selecciona Servicio de terceros como Caso práctico.
  8. Haz clic en Siguiente.
  9. Opcional: añade una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más adelante.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. En la sección Políticas de permisos, haz clic en Añadir permisos.
  15. Selecciona Añadir permisos.
  16. Seleccione Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. Haz clic en Añadir permisos.

Configurar la política y el rol de gestión de identidades y accesos para las subidas de S3

  1. En la consola de AWS, ve a IAM > Policies > Create policy > pestaña JSON.
  2. Introduce la siguiente política:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutDomainToolsIrisObjects",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::domaintools-iris/*"
        }
      ]
    }
    
    • Sustituye domaintools-iris si has introducido otro nombre de segmento.
  3. Haz clic en Siguiente > Crear política.

  4. Ve a IAM > Roles > Crear rol > Servicio de AWS > Lambda.

  5. Adjunte la política que acaba de crear.

  6. Dale el nombre WriteDomainToolsIrisToS3Role al rol y haz clic en Crear rol.

Crear la función Lambda

  1. En la consola de AWS, ve a Lambda > Funciones > Crear función.
  2. Haz clic en Crear desde cero.
  3. Proporciona los siguientes detalles de configuración:

    Ajuste Valor
    Nombre domaintools_iris_to_s3
    Tiempo de ejecución Python 3.13
    Arquitectura x86_64
    Rol de ejecución WriteDomainToolsIrisToS3Role
  4. Una vez creada la función, abra la pestaña Código, elimine el stub e introduzca el siguiente código (domaintools_iris_to_s3.py):

    #!/usr/bin/env python3
    # Lambda: Pull DomainTools Iris Investigate results to S3 (no transform)
    
    import os, json, time, urllib.parse
    from urllib.request import Request, urlopen
    from urllib.error import HTTPError
    import boto3
    
    # --- Environment ---
    S3_BUCKET    = os.environ["S3_BUCKET"].strip()
    S3_PREFIX    = os.environ.get("S3_PREFIX", "domaintools/iris/").strip()
    STATE_KEY    = os.environ.get("STATE_KEY", "domaintools/iris/state.json").strip()
    
    DT_API_KEY   = os.environ["DT_API_KEY"].strip()
    DT_API_SECRET= os.environ.get("DT_API_SECRET", "").strip()  # optional if your account uses key-only auth
    
    USE_MODE     = os.environ.get("USE_MODE", "HASH").strip().upper()  # HASH | DOMAINS | QUERY
    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",
    }
    if DT_API_SECRET:
        HDRS["X-Api-Secret"] = DT_API_SECRET
    
    s3 = boto3.client("s3")
    
    # --- HTTP helpers ---
    
    def _http_get(url: str) -> dict:
        req = Request(url, method="GET")
        for k, v in HDRS.items():
            req.add_header(k, v)
        attempt = 0
        while True:
            try:
                with urlopen(req, 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 _build_url(params: dict) -> str:
        return BASE_URL + ("?" + urllib.parse.urlencode(params, doseq=True) if params else "")
    
    # --- S3 helpers ---
    
    def _write_page(obj: dict, label: str, page: int) -> str:
        ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime())
        key = f"{S3_PREFIX.rstrip('/')}/{ts}-{label}-p{page:05d}.json"
        s3.put_object(
            Bucket=S3_BUCKET, Key=key,
            Body=json.dumps(obj, separators=(",", ":")).encode("utf-8"),
            ContentType="application/json",
        )
        return key
    
    # --- Iris paging ---
    
    def _first_page_params() -> dict:
        params: dict[str, object] = {"page_size": str(PAGE_SIZE)}
        if USE_NEXT:
            params["next"] = "true"
        return params
    
    def _paginate(label: str, params: dict) -> tuple[int, int]:
        pages = 0
        total = 0
        url = _build_url(params)
        while pages < MAX_PAGES:
            data = _http_get(url)
            _write_page(data, label, pages)
    
            resp = data.get("response") or {}
            results = resp.get("results") or []
            total += len(results)
            pages += 1
    
            # Prefer `next` absolute URL if present
            next_url = resp.get("next") if isinstance(resp, dict) else None
            if next_url:
                url = next_url
                continue
    
            # Fallback: position pager when `next=true` not used/supported
            if resp.get("has_more_results") and resp.get("position"):
                base = _first_page_params()
                base.pop("next", None)
                base["position"] = resp["position"]
                url = _build_url(base)
                continue
    
            break
        return pages, total
    
    # --- Mode runners ---
    
    def run_hashes(hashes: list[str]) -> dict:
        agg_pages = agg_results = 0
        for h in hashes:
            params = _first_page_params()
            params["search_hash"] = h
            p, r = _paginate(f"hash-{h}", params)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    def run_domains(domains: list[str]) -> dict:
        agg_pages = agg_results = 0
        for d in domains:
            params = _first_page_params()
            # DomainTools accepts `domain` as a filter in Investigate search
            params["domain"] = d
            p, r = _paginate(f"domain-{d}", params)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    def run_queries(queries: list[str]) -> dict:
        agg_pages = agg_results = 0
        for q in queries:
            # Merge arbitrary k=v pairs from the query string
            base = _first_page_params()
            for k, v in urllib.parse.parse_qsl(q, keep_blank_values=True):
                base.setdefault(k, v)
            p, r = _paginate(f"query-{q.replace('=','-')}", base)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    # --- Entry point ---
    
    def lambda_handler(event=None, context=None):
        if USE_MODE == "HASH" and SEARCH_HASHES:
            res = run_hashes(SEARCH_HASHES)
        elif USE_MODE == "DOMAINS" and DOMAINS:
            res = run_domains(DOMAINS)
        elif USE_MODE == "QUERY" and QUERY_LIST:
            res = run_queries(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.")
    
        return {"ok": True, "mode": USE_MODE, **res}
    
    if __name__ == "__main__":
        print(json.dumps(lambda_handler(), indent=2))
    
  5. Ve a Configuración > Variables de entorno > Editar > Añadir nueva variable de entorno.

  6. Introduce las siguientes variables de entorno y sustituye los valores por los tuyos:

    Clave Valor de ejemplo Descripción
    S3_BUCKET domaintools-iris Nombre del segmento de S3 en el que se almacenarán los datos.
    S3_PREFIX domaintools/iris/ Prefijo de S3 opcional (subcarpeta) para los objetos.
    STATE_KEY domaintools/iris/state.json Clave de archivo de estado o punto de control opcional.
    DT_API_KEY DT-XXXXXXXXXXXXXXXXXXXX Clave de API de DomainTools.
    DT_API_SECRET YYYYYYYYYYYYYYYYYYYYYYYY Secreto de la API de DomainTools (si procede).
    USE_MODE HASH | DOMAINS | QUERY Selecciona el modo que quieras usar (solo puede haber uno activo a la vez).
    SEARCH_HASHES hash1;hash2;hash3 Obligatorio si USE_MODE=HASH. Lista separada por punto y coma de los hashes de las búsquedas guardadas de la interfaz de usuario 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 (500 de forma predeterminada).
    MAX_PAGES 20 Número máximo de páginas por solicitud
  7. Una vez creada la función, permanece en su página (o abre Lambda > Funciones > tu-función).

  8. Seleccione la pestaña Configuración.

  9. En el panel Configuración general, haz clic en Editar.

  10. Cambia Tiempo de espera a 15 minutos (900 segundos) y haz clic en Guardar.

Crear una programación de EventBridge

  1. Ve a Amazon EventBridge > Scheduler > Create schedule (Amazon EventBridge > Programador > Crear programación).
  2. Proporcione los siguientes detalles de configuración:
    • Programación periódica: Precio (1 hour).
    • Destino: tu función Lambda.
    • Nombre: domaintools-iris-1h.
  3. Haz clic en Crear programación.

Opcional: Crear un usuario y claves de gestión de identidades y accesos de solo lectura para Google SecOps

  1. En la consola de AWS, vaya a IAM > Usuarios y, a continuación, haga clic en Añadir usuarios.
  2. Proporcione los siguientes detalles de configuración:
    • Usuario: introduce un nombre único (por ejemplo, secops-reader).
    • Tipo de acceso: selecciona Clave de acceso - Acceso programático.
    • Haz clic en Crear usuario.
  3. Asigna una política de lectura mínima (personalizada): Usuarios > selecciona secops-reader > Permisos > Añadir permisos > Asignar políticas directamente > Crear política.
  4. En el editor de JSON, introduce la siguiente política:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::<your-bucket>/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::<your-bucket>"
        }
      ]
    }
    
  5. Asigna el nombre secops-reader-policy.

  6. Ve a Crear política > busca o selecciona > Siguiente > Añadir permisos.

  7. Ve a Credenciales de seguridad > Claves de acceso > Crear clave de acceso.

  8. Descarga el archivo CSV (estos valores se introducen en el feed).

Configurar un feed en Google SecOps para ingerir resultados de DomainTools Iris Investigate

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir feed.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, DomainTools Iris Investigate).
  4. Selecciona Amazon S3 V2 como Tipo de fuente.
  5. Seleccione DomainTools Threat Intelligence como Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifique los valores de los siguientes parámetros de entrada:
    • URI de S3: s3://domaintools-iris/domaintools/iris/
    • Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras.
    • Antigüedad máxima de los archivos: 180 días de forma predeterminada.
    • ID de clave de acceso: clave de acceso de usuario con acceso al bucket de S3.
    • Clave de acceso secreta: clave secreta del usuario con acceso al bucket de S3.
    • Espacio de nombres del recurso: domaintools.threat_intel
    • Etiquetas de ingestión: etiqueta que se aplicará a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
activa principal.domain.status Se asigna directamente desde el campo active del registro sin procesar.
additional_whois_email.[].value about.labels.additional_whois_email Se extrae de la matriz additional_whois_email y se añade como etiqueta en el objeto about.
adsense.value about.labels.adsense Se extrae de adsense.value y se añade como 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 del 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 del registro sin procesar.
admin_contact.email.[].value principal.domain.admin.email_addresses Se ha extraído de la matriz admin_contact.email y se ha añadido al campo email_addresses.
admin_contact.fax.value principal.domain.admin.attribute.labels.fax Se ha extraído de admin_contact.fax.value y se ha añadido como 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 del registro sin procesar.
admin_contact.org.value principal.domain.admin.company_name Se asigna directamente desde el campo admin_contact.org.value del registro sin procesar.
admin_contact.phone.value principal.domain.admin.phone_numbers Se asigna directamente desde el campo admin_contact.phone.value del registro sin procesar.
admin_contact.postal.value principal.domain.admin.attribute.labels.postal Se ha extraído de admin_contact.postal.value y se ha añadido como 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 del registro sin procesar.
admin_contact.street.value principal.domain.admin.office_address.name Se asigna directamente desde el campo admin_contact.street.value del registro sin procesar.
alexa about.labels.alexa Se asigna directamente desde el campo alexa del registro sin procesar y se añade como etiqueta en el objeto about.
baidu_codes.[].value about.labels.baidu_codes Se extrae de la matriz baidu_codes y se añade como 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 del 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 del registro sin procesar.
billing_contact.email.[].value principal.domain.billing.email_addresses Se ha extraído de la matriz billing_contact.email y se ha añadido al campo email_addresses.
billing_contact.fax.value principal.domain.billing.attribute.labels.fax Se ha extraído de billing_contact.fax.value y se ha añadido como etiqueta con la clave "fax" en el atributo billing.
billing_contact.name.value principal.domain.billing.user_display_name Se asigna directamente desde el campo billing_contact.name.value del registro sin procesar.
billing_contact.org.value principal.domain.billing.company_name Se asigna directamente desde el campo billing_contact.org.value del registro sin procesar.
billing_contact.phone.value principal.domain.billing.phone_numbers Se asigna directamente desde el campo billing_contact.phone.value del registro sin procesar.
billing_contact.postal.value principal.domain.billing.attribute.labels.postal Se ha extraído de billing_contact.postal.value y se ha añadido como etiqueta con la clave "postal" en el atributo billing.
billing_contact.state.value principal.domain.billing.office_address.state Se asigna directamente desde el campo billing_contact.state.value del registro sin procesar.
billing_contact.street.value principal.domain.billing.office_address.name Se asigna directamente desde el campo billing_contact.street.value del registro sin procesar.
create_date.value principal.domain.creation_time Se ha convertido al formato de marca de tiempo a partir del campo create_date.value del registro sin procesar.
data_updated_timestamp principal.domain.audit_update_time Se ha convertido al formato de marca de tiempo a partir del campo data_updated_timestamp del registro sin procesar.
dominio principal.hostname Se asigna directamente desde el campo domain del registro sin procesar.
domain_risk.components.[].evidence security_result.detection_fields.evidence Se ha extraído de la matriz domain_risk.components.[].evidence y se ha añadido como 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 del registro sin procesar.
domain_risk.components.[].risk_score security_result.risk_score Se asigna directamente desde el campo domain_risk.components.[].risk_score del registro sin procesar.
domain_risk.components.[].threats security_result.threat_name El primer elemento de la matriz domain_risk.components.[].threats se asigna a security_result.threat_name.
domain_risk.components.[].threats security_result.detection_fields.threats Los elementos restantes de la matriz domain_risk.components.[].threats se añaden 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 del registro sin procesar.
email_domain.[].value about.labels.email_domain Se extrae de la matriz email_domain y se añade como etiqueta en el objeto about.
expiration_date.value principal.domain.expiration_time Se ha convertido al formato de marca de tiempo a partir del campo expiration_date.value del registro sin procesar.
fb_codes.[].value about.labels.fb_codes Se extrae de la matriz fb_codes y se añade como etiqueta en el objeto about.
first_seen.value principal.domain.first_seen_time Se ha convertido al formato de marca de tiempo a partir del campo first_seen.value del registro sin procesar.
ga4.[].value about.labels.ga4 Se extrae de la matriz ga4 y se añade como etiqueta en el objeto about.
google_analytics.value about.labels.google_analytics Se extrae de google_analytics.value y se añade como etiqueta en el objeto about.
gtm_codes.[].value about.labels.gtm_codes Se extrae de la matriz gtm_codes y se añade como etiqueta en el objeto about.
hotjar_codes.[].value about.labels.hotjar_codes Se extrae de la matriz hotjar_codes y se añade como etiqueta en el objeto about.
ip.[].address.value principal.ip El primer elemento de la matriz ip se asigna a principal.ip.
ip.[].address.value about.labels.ip_address Los elementos restantes de la matriz ip se añaden 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 las matrices ip.asn se añaden como etiquetas con la clave "asn" en el objeto about.
ip.[].country_code.value principal.location.country_or_region El country_code.value del primer elemento de la matriz ip se asigna a principal.location.country_or_region.
ip.[].country_code.value about.location.country_or_region El country_code.value de los elementos restantes de la matriz ip se asigna a about.location.country_or_region.
ip.[].isp.value principal.labels.isp El isp.value del primer elemento de la matriz ip se asigna a principal.labels.isp.
ip.[].isp.value about.labels.isp El isp.value de los elementos restantes de la matriz ip se asigna a about.labels.isp.
matomo_codes.[].value about.labels.matomo_codes Se extrae de la matriz matomo_codes y se añade como etiqueta en el objeto about.
monitor_domain about.labels.monitor_domain Se asigna directamente desde el campo monitor_domain del registro sin procesar y se añade como 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 del registro sin procesar y se añade como etiqueta en el objeto about.
mx.[].domain.value about.domain.name Se asigna directamente desde el campo mx.[].domain.value del registro sin procesar.
mx.[].host.value about.hostname Se asigna directamente desde el campo mx.[].host.value del registro sin procesar.
mx.[].ip.[].value about.ip Se ha extraído de la matriz mx.[].ip y se ha añadido al campo ip.
mx.[].priority about.security_result.priority_details Se asigna directamente desde el campo mx.[].priority del registro sin procesar.
name_server.[].domain.value about.labels.name_server_domain Se extrae de name_server.[].domain.value y se añade como etiqueta con la clave "name_server_domain" en el objeto about.
name_server.[].host.value principal.domain.name_server Se ha extraído de name_server.[].host.value y se ha añadido al campo name_server.
name_server.[].host.value about.domain.name_server Se ha extraído de name_server.[].host.value y se ha añadido al campo name_server.
name_server.[].ip.[].value about.labels.ip Se extrae de la matriz name_server.[].ip y se añade 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 del registro sin procesar y se añade como etiqueta en el objeto about.
redirect.value about.labels.redirect Se extrae de redirect.value y se añade como etiqueta en el objeto about.
redirect_domain.value about.labels.redirect_domain Se extrae de redirect_domain.value y se añade como 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 del 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 del registro sin procesar.
registrant_contact.email.[].value principal.domain.registrant.email_addresses Se ha extraído de la matriz registrant_contact.email y se ha añadido al campo email_addresses.
registrant_contact.fax.value principal.domain.registrant.attribute.labels.fax Se ha extraído de registrant_contact.fax.value y se ha añadido como etiqueta con la clave "fax" en el atributo registrant.
registrant_contact.name.value principal.domain.registrant.user_display_name Se asigna directamente desde el campo registrant_contact.name.value del registro sin procesar.
registrant_contact.org.value principal.domain.registrant.company_name Se asigna directamente desde el campo registrant_contact.org.value del registro sin procesar.
registrant_contact.phone.value principal.domain.registrant.phone_numbers Se asigna directamente desde el campo registrant_contact.phone.value del registro sin procesar.
registrant_contact.postal.value principal.domain.registrant.attribute.labels.postal Se ha extraído de registrant_contact.postal.value y se ha añadido como etiqueta con la clave "postal" en el atributo registrant.
registrant_contact.state.value principal.domain.registrant.office_address.state Se asigna directamente desde el campo registrant_contact.state.value del registro sin procesar.
registrant_contact.street.value principal.domain.registrant.office_address.name Se asigna directamente desde el campo registrant_contact.street.value del registro sin procesar.
registrant_name.value about.labels.registrant_name Se extrae de registrant_name.value y se añade como etiqueta en el objeto about.
registrant_org.value about.labels.registrant_org Se extrae de registrant_org.value y se añade como etiqueta en el objeto about.
registrar.value principal.domain.registrar Se asigna directamente desde el campo registrar.value del registro sin procesar.
registrar_status about.labels.registrar_status Se extrae de la matriz registrar_status y se añade como etiqueta en el objeto about.
server_type network.tls.client.server_name Se asigna directamente desde el campo server_type del registro sin procesar.
soa_email.[].value principal.user.email_addresses Se ha extraído de la matriz soa_email y se ha añadido al campo email_addresses.
spf_info about.labels.spf_info Se asigna directamente desde el campo spf_info del registro sin procesar y se añade como etiqueta en el objeto about.
ssl_email.[].value about.labels.ssl_email Se extrae de la matriz ssl_email y se añade como etiqueta en el objeto about.
ssl_info.[].alt_names.[].value about.labels.alt_names Se extrae de la matriz ssl_info.[].alt_names y se añade como etiqueta en el objeto about.
ssl_info.[].common_name.value about.labels.common_name Se extrae de ssl_info.[].common_name.value y se añade como etiqueta en el objeto about.
ssl_info.[].duration.value about.labels.duration Se extrae de ssl_info.[].duration.value y se añade como etiqueta en el objeto about.
ssl_info.[].email.[].value about.labels.ssl_info_email Se ha extraído de la matriz ssl_info.[].email y se ha añadido como 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 de la matriz ssl_info se asigna a network.tls.server.certificate.sha1.
ssl_info.[].hash.value about.labels.hash El hash.value de los elementos restantes de la matriz 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 de la matriz ssl_info se asigna a network.tls.server.certificate.issuer.
ssl_info.[].issuer_common_name.value about.labels.issuer_common_name El issuer_common_name.value de los elementos restantes de la matriz ssl_info se asigna a about.labels.issuer_common_name.
ssl_info.[].not_after.value network.tls.server.certificate.not_after El not_after.value del primer elemento de la matriz 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 not_after.value de los elementos restantes de la matriz ssl_info se asigna a about.labels.not_after.
ssl_info.[].not_before.value network.tls.server.certificate.not_before El not_before.value del primer elemento de la matriz 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 not_before.value de los elementos restantes de la matriz ssl_info se asigna a about.labels.not_before.
ssl_info.[].organization.value network.organization_name El organization.value del primer elemento de la matriz ssl_info se asigna a network.organization_name.
ssl_info.[].organization.value about.labels.organization El organization.value de los elementos restantes de la matriz ssl_info se asigna a about.labels.organization.
ssl_info.[].subject.value about.labels.subject Se extrae de ssl_info.[].subject.value y se añade como etiqueta en el objeto about.
statcounter_project_codes.[].value about.labels.statcounter_project_codes Se extrae de la matriz statcounter_project_codes y se añade como etiqueta en el objeto about.
statcounter_security_codes.[].value about.labels.statcounter_security_codes Se extrae de la matriz statcounter_security_codes y se añade como etiqueta en el objeto about.
tags.[].label about.file.tags Se ha extraído de tags.[].label y se ha añadido al campo tags.
tags.[].scope security_result.detection_fields.scope Se ha extraído de tags.[].scope y se ha añadido como campo de detección con la clave "scope" en el objeto security_result.
tags.[].tagged_at security_result.detection_fields.tagged_at Se ha extraído de tags.[].tagged_at y se ha añadido como 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 del 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 del registro sin procesar.
technical_contact.email.[].value principal.domain.tech.email_addresses Se ha extraído de la matriz technical_contact.email y se ha añadido al campo email_addresses.
technical_contact.fax.value principal.domain.tech.attribute.labels.fax Se ha extraído de technical_contact.fax.value y se ha añadido como etiqueta con la clave "fax" en el atributo tech.
technical_contact.name.value principal.domain.tech.user_display_name Se asigna directamente desde el campo technical_contact.name.value del registro sin procesar.
technical_contact.org.value principal.domain.tech.company_name Se asigna directamente desde el campo technical_contact.org.value del registro sin procesar.
technical_contact.phone.value principal.domain.tech.phone_numbers Se asigna directamente desde el campo technical_contact.phone.value del registro sin procesar.
technical_contact.postal.value principal.domain.tech.attribute.labels.postal Se ha extraído de technical_contact.postal.value y se ha añadido como etiqueta con la clave "postal" en el atributo tech.
technical_contact.state.value principal.domain.tech.office_address.state Se asigna directamente desde el campo technical_contact.state.value del registro sin procesar.
technical_contact.street.value principal.domain.tech.office_address.name Se asigna directamente desde el campo technical_contact.street.value del registro sin procesar.
tld about.labels.tld Se asigna directamente desde el campo tld del registro sin procesar y se añade como etiqueta en el objeto about.
timestamp about.labels.timestamp Se asigna directamente desde el campo timestamp del registro sin procesar y se añade como etiqueta en el objeto about.
website_response principal.network.http.response_code Se asigna directamente desde el campo website_response del registro sin procesar.
website_title about.labels.website_title Se asigna directamente desde el campo website_title del registro sin procesar y se añade como etiqueta en el objeto about.
whois_url principal.domain.whois_server Se asigna directamente desde el campo whois_url del registro sin procesar.
yandex_codes.[].value about.labels.yandex_codes Se extrae de la matriz yandex_codes y se añade como etiqueta en el objeto about.
edr.client.hostname Se asigna el valor del campo domain.
edr.client.ip_addresses Se asigna el valor del primer elemento de la matriz ip, concretamente ip.[0].address.value.
edr.raw_event_name Se define como "STATUS_UPDATE" si principal.hostname está presente. De lo contrario, se define como "GENERIC_EVENT".
metadata.event_timestamp Copiado del campo create_time de nivel superior del registro sin procesar.
metadata.event_type Se define como "STATUS_UPDATE" si principal.hostname está presente. De lo contrario, se define como "GENERIC_EVENT".
metadata.log_type Se le asigna el valor "DOMAINTOOLS_THREATINTEL".
metadata.product_name Asigna el valor "DOMAINTOOLS".
metadata.vendor_name Asigna el valor "DOMAINTOOLS".

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.