Recopila los resultados de DomainTools Iris Investigate

Compatible con:

En este documento, se explica cómo transferir los resultados de DomainTools Iris Investigate a Google Security Operations con Amazon S3. 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

  • Instancia de Google SecOps
  • Acceso con privilegios a la cuenta empresarial de DomainTools (acceso a la API de Iris Investigate)
  • Acceso con privilegios a AWS (S3, IAM, Lambda, EventBridge)

Obtén la clave de API y el extremo 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.
  6. Si necesitas una clave nueva, selecciona Restablecer clave de API.

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

Configura el bucket de AWS S3 y el IAM para Google SecOps

  1. Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Crea un bucket
  2. Guarda el Nombre y la Región del bucket para futuras referencias (por ejemplo, domaintools-iris).
  3. Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. Haz clic en Crear clave de acceso en la sección Claves de acceso.
  7. Selecciona Servicio de terceros como el Caso de uso.
  8. Haz clic en Siguiente.
  9. Opcional: Agrega 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. Haz clic en Agregar permisos en la sección Políticas de permisos.
  15. Selecciona Agregar permisos.
  16. Selecciona Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. Haz clic en Agregar permisos.

Configura la política y el rol de IAM para las cargas de S3

  1. En la consola de AWS, ve a IAM > Políticas > Crear política > pestaña JSON.
  2. Ingresa la siguiente política:

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

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

  5. Adjunta la política recién creada.

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

Crea la función Lambda

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

    Configuración Valor
    Nombre domaintools_iris_to_s3
    Tiempo de ejecución Python 3.13
    Arquitectura x86_64
    Rol de ejecución WriteDomainToolsIrisToS3Role
  4. Después de crear la función, abre la pestaña Code, borra el código auxiliar y, luego, ingresa 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 > Agregar nueva variable de entorno.

  6. Ingresa las siguientes variables de entorno y reemplaza los valores por los tuyos:

    Clave Valor de ejemplo Descripción
    S3_BUCKET domaintools-iris Nombre del bucket 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 Es la clave opcional del archivo de estado o punto de control.
    DT_API_KEY DT-XXXXXXXXXXXXXXXXXXXX Es la clave de API de DomainTools.
    DT_API_SECRET YYYYYYYYYYYYYYYYYYYYYYYY Secreto de la API de DomainTools (si corresponde)
    USE_MODE HASH | DOMAINS | QUERY Selecciona el modo que quieres usar (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. Es una 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
  7. Después de crear la función, permanece en su página (o abre Lambda > Functions > tu-función).

  8. Selecciona 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.

Crea una programación de EventBridge

  1. Ve a Amazon EventBridge > Scheduler > Create schedule.
  2. Proporciona los siguientes detalles de configuración:
    • Programación recurrente: Frecuencia (1 hour).
    • Destino: Tu función Lambda.
    • Nombre: domaintools-iris-1h.
  3. Haz clic en Crear programación.

Opcional: Crea un usuario y claves de IAM de solo lectura para Google SecOps

  1. En la consola de AWS, ve a IAM > Usuarios y, luego, haz clic en Agregar usuarios.
  2. Proporciona los siguientes detalles de configuración:
    • Usuario: Ingresa un nombre único (por ejemplo, secops-reader).
    • Tipo de acceso: Selecciona Clave de acceso: Acceso programático.
    • Haz clic en Crear usuario.
  3. Adjunta una política de lectura mínima (personalizada): Usuarios > selecciona secops-reader > Permisos > Agregar permisos > Adjuntar políticas directamente > Crear política
  4. En el editor de JSON, ingresa 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. Configura el nombre como secops-reader-policy.

  6. Ve a Crear política > busca o selecciona > Siguiente > Agregar permisos.

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

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

Configura un feed en Google SecOps para transferir los resultados de DomainTools Iris Investigate

  1. Ve a SIEM Settings > Feeds.
  2. Haz clic en Agregar feed nuevo.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, DomainTools Iris Investigate).
  4. Selecciona Amazon S3 V2 como el Tipo de fuente.
  5. Selecciona DomainTools Threat Intelligence como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:
    • URI de S3: s3://domaintools-iris/domaintools/iris/
    • Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
    • Antigüedad máxima del archivo: 180 días de forma predeterminada
    • ID de clave de acceso: Clave de acceso del 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 activo: domaintools.threat_intel
    • Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. 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 active 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 extrajo de admin_contact.fax.value y se agregó 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 extrajo de billing_contact.fax.value y se agregó como una 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 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 billing.
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 domain 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 "amenazas" 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 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 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 country_code.value del primer elemento del array 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 en el array ip se asigna a about.location.country_or_region.
ip.[].isp.value principal.labels.isp El isp.value del primer elemento del array ip se asigna a principal.labels.isp.
ip.[].isp.value about.labels.isp El isp.value de los elementos restantes en el 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 extrajo del array mx.[].ip y se agregó 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 extrajo de name_server.[].host.value y se agregó al campo name_server.
name_server.[].host.value about.domain.name_server Se extrajo de name_server.[].host.value y se agregó al campo name_server.
name_server.[].ip.[].value about.labels.ip Se extrae del array name_server.[].ip 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 extrajo de registrant_contact.fax.value y se agregó como una 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 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 registrant.
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 issuer_common_name.value 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 not_after.value 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 not_after.value de los elementos restantes en el array 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 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 not_before.value de los elementos restantes en el 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 organization.value de los elementos restantes en el 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 extrajo de tags.[].label y se agregó al campo tags.
tags.[].scope security_result.detection_fields.scope Se extrajo de tags.[].scope y se agregó 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 tech.
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 tech.
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 timestamp 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 domain.
edr.client.ip_addresses Se establece en el valor del primer elemento del array 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.