Recopila los resultados de DomainTools Iris Investigate
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
- Accede al panel de la API de DomainTools (solo la cuenta del propietario de la API puede restablecer la clave de API).
- En la sección Mi cuenta, selecciona el vínculo Ver panel de la API ubicado en la pestaña Resumen de la cuenta.
- Ve a la sección Nombre de usuario de la API para obtener tu nombre de usuario.
- En la misma pestaña, busca tu clave de API.
- Copia y guarda la clave en una ubicación segura.
Si necesitas una clave nueva, selecciona Restablecer clave de API.
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
- Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Crea un bucket
- Guarda el Nombre y la Región del bucket para futuras referencias (por ejemplo,
domaintools-iris
). - Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
- Selecciona el usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- Haz clic en Crear clave de acceso en la sección Claves de acceso.
- Selecciona Servicio de terceros como el Caso de uso.
- Haz clic en Siguiente.
- Opcional: Agrega una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más adelante.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- Haz clic en Agregar permisos en la sección Políticas de permisos.
- Selecciona Agregar permisos.
- Selecciona Adjuntar políticas directamente.
- Busca y selecciona la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Agregar permisos.
Configura la política y el rol de IAM para las cargas de S3
- En la consola de AWS, ve a IAM > Políticas > Crear política > pestaña JSON.
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.
- Reemplaza
Haz clic en Siguiente > Crear política.
Ve a IAM > Roles > Crear rol > Servicio de AWS > Lambda.
Adjunta la política recién creada.
Asigna el nombre
WriteDomainToolsIrisToS3Role
al rol y haz clic en Crear rol.
Crea la función Lambda
- En la consola de AWS, ve a Lambda > Functions > Create function.
- Haz clic en Crear desde cero.
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
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))
Ve a Configuración > Variables de entorno > Editar > Agregar nueva variable de entorno.
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 Después de crear la función, permanece en su página (o abre Lambda > Functions > tu-función).
Selecciona la pestaña Configuración.
En el panel Configuración general, haz clic en Editar.
Cambia Tiempo de espera a 15 minutos (900 segundos) y haz clic en Guardar.
Crea una programación de EventBridge
- Ve a Amazon EventBridge > Scheduler > Create schedule.
- Proporciona los siguientes detalles de configuración:
- Programación recurrente: Frecuencia (
1 hour
). - Destino: Tu función Lambda.
- Nombre:
domaintools-iris-1h
.
- Programación recurrente: Frecuencia (
- Haz clic en Crear programación.
Opcional: Crea un usuario y claves de IAM de solo lectura para Google SecOps
- En la consola de AWS, ve a IAM > Usuarios y, luego, haz clic en Agregar usuarios.
- 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.
- Usuario: Ingresa un nombre único (por ejemplo,
- Adjunta una política de lectura mínima (personalizada): Usuarios > selecciona
secops-reader
> Permisos > Agregar permisos > Adjuntar políticas directamente > Crear política 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>" } ] }
Configura el nombre como
secops-reader-policy
.Ve a Crear política > busca o selecciona > Siguiente > Agregar permisos.
Ve a Credenciales de seguridad > Claves de acceso > Crear clave de acceso.
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
- Ve a SIEM Settings > Feeds.
- Haz clic en Agregar feed nuevo.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
DomainTools Iris Investigate
). - Selecciona Amazon S3 V2 como el Tipo de fuente.
- Selecciona DomainTools Threat Intelligence como el Tipo de registro.
- Haz clic en Siguiente.
- 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.
- URI de S3:
- Haz clic en Siguiente.
- 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.