Coletar resultados do DomainTools Iris Investigate
Este documento explica como ingerir resultados do DomainTools Iris Investigate no Google Security Operations usando o Google Cloud Storage. O analisador transforma dados JSON brutos da API Iris do DomainTools em um formato estruturado de acordo com o modelo de dados unificado (UDM) do Google SecOps. Ele extrai informações relacionadas a detalhes do domínio, informações de contato, riscos de segurança, certificados SSL e outros atributos relevantes, mapeando-os para os campos correspondentes do UDM para análise consistente e inteligência de ameaças.
Antes de começar
Verifique se você atende os seguintes pré-requisitos:
- Uma instância do Google SecOps
- Acesso privilegiado à conta corporativa do DomainTools (acesso à API do Iris Investigate)
- Um projeto do GCP com a API Cloud Storage ativada
- Permissões para criar e gerenciar buckets do GCS
- Permissões para gerenciar políticas do IAM em buckets do GCS
- Permissões para criar serviços do Cloud Run, tópicos do Pub/Sub e jobs do Cloud Scheduler
Receber a chave de API e o endpoint do DomainTools
- Faça login no painel da API DomainTools. Somente a conta proprietária da API pode redefinir a chave de API.
- Na seção Minha conta, selecione o link Ver painel da API, localizado na guia Resumo da conta.
- Acesse a seção Nome de usuário da API para conseguir seu nome de usuário.
- Na mesma guia, localize a chave de API.
Copie e salve a chave em um local seguro. Se você precisar de uma nova chave, selecione Redefinir chave de API.
Observe o endpoint do Iris Investigate:
https://api.domaintools.com/v1/iris-investigate/.
Criar um bucket do Google Cloud Storage
- Acesse o Console do Google Cloud.
- Selecione seu projeto ou crie um novo.
- No menu de navegação, acesse Cloud Storage > Buckets.
- Clique em Criar bucket.
Informe os seguintes detalhes de configuração:
Configuração Valor Nomeie seu bucket Insira um nome exclusivo globalmente, por exemplo, domaintools-iris.Tipo de local Escolha com base nas suas necessidades (região, birregional, multirregional) Local Selecione o local (por exemplo, us-central1).Classe de armazenamento Padrão (recomendado para registros acessados com frequência) Controle de acesso Uniforme (recomendado) Ferramentas de proteção Opcional: ativar o controle de versões de objetos ou a política de retenção Clique em Criar.
Criar uma conta de serviço para a função do Cloud Run
A função do Cloud Run precisa de uma conta de serviço com permissões para gravar no bucket do GCS e ser invocada pelo Pub/Sub.
Criar conta de serviço
- No Console do GCP, acesse IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
- Informe os seguintes detalhes de configuração:
- Nome da conta de serviço: insira
domaintools-iris-collector-sa. - Descrição da conta de serviço: insira
Service account for Cloud Run function to collect DomainTools Iris Investigate logs.
- Nome da conta de serviço: insira
- Clique em Criar e continuar.
- Na seção Conceder acesso a essa conta de serviço ao projeto, adicione os seguintes papéis:
- Clique em Selecionar papel.
- Pesquise e selecione Administrador de objetos do Storage.
- Clique em + Adicionar outro papel.
- Pesquise e selecione Invocador do Cloud Run.
- Clique em + Adicionar outro papel.
- Pesquise e selecione Invocador do Cloud Functions.
- Clique em Continuar.
- Clique em Concluído.
Esses papéis são necessários para:
- Administrador de objetos do Storage: grava registros em um bucket do GCS e gerencia arquivos de estado.
- Invocador do Cloud Run: permite que o Pub/Sub invoque a função
- Invocador do Cloud Functions: permite a invocação de funções
Conceder permissões do IAM no bucket do GCS
Conceda permissões de gravação à conta de serviço no bucket do GCS:
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket.
- Acesse a guia Permissões.
- Clique em Conceder acesso.
- Informe os seguintes detalhes de configuração:
- Adicionar principais: insira o e-mail da conta de serviço (por exemplo,
domaintools-iris-collector-sa@PROJECT_ID.iam.gserviceaccount.com). - Atribuir papéis: selecione Administrador de objetos do Storage.
- Adicionar principais: insira o e-mail da conta de serviço (por exemplo,
- Clique em Salvar.
Criar tópico Pub/Sub
Crie um tópico do Pub/Sub em que o Cloud Scheduler vai publicar e a função do Cloud Run vai se inscrever.
- No Console do GCP, acesse Pub/Sub > Tópicos.
- Selecione Criar tópico.
- Informe os seguintes detalhes de configuração:
- ID do tópico: insira
domaintools-iris-trigger. - Não altere as outras configurações.
- ID do tópico: insira
- Clique em Criar.
Criar uma função do Cloud Run para coletar registros
A função do Cloud Run é acionada por mensagens do Pub/Sub do Cloud Scheduler para buscar registros da API DomainTools Iris Investigate e gravá-los no GCS.
- No console do GCP, acesse o Cloud Run.
- Clique em Criar serviço.
- Selecione Função (use um editor in-line para criar uma função).
Na seção Configurar, forneça os seguintes detalhes de configuração:
Configuração Valor Nome do serviço domaintools-iris-collectorRegião Selecione a região que corresponde ao seu bucket do GCS (por exemplo, us-central1).Ambiente de execução Selecione Python 3.12 ou uma versão mais recente. Na seção Acionador (opcional):
- Clique em + Adicionar gatilho.
- Selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, escolha o tópico do Pub/Sub (
domaintools-iris-trigger). - Clique em Salvar.
Na seção Autenticação:
- Selecione Exigir autenticação.
- Confira o Identity and Access Management (IAM).
Role a tela para baixo e abra Contêineres, rede, segurança.
Acesse a guia Segurança:
- Conta de serviço: selecione a conta de serviço (
domaintools-iris-collector-sa).
- Conta de serviço: selecione a conta de serviço (
Acesse a guia Contêineres:
- Clique em Variáveis e secrets.
- Clique em + Adicionar variável para cada variável de ambiente:
Nome da variável Valor de exemplo Descrição GCS_BUCKETdomaintools-irisNome do bucket do GCS em que os dados serão armazenados. GCS_PREFIXdomaintools/iris/Prefixo opcional do GCS (subpasta) para objetos. STATE_KEYdomaintools/iris/state.jsonChave opcional do arquivo de estado/checkpoint. DT_API_KEYDT-XXXXXXXXXXXXXXXXXXXXChave de API do DomainTools. USE_MODEHASHSelecione o modo a ser usado: HASH,DOMAINSouQUERY(apenas um fica ativo por vez).SEARCH_HASHEShash1;hash2;hash3Obrigatório se USE_MODE=HASH. Lista separada por ponto e vírgula de hashes de pesquisa salvas da interface da Iris.DOMAINSexample.com;domaintools.comObrigatório se USE_MODE=DOMAINS. Lista de domínios separados por ponto e vírgula.QUERY_LISTip=1.1.1.1;ip=8.8.8.8;domain=example.orgObrigatório se USE_MODE=QUERY. Lista de strings de consulta separadas por ponto e vírgula (k=v&k2=v2).PAGE_SIZE500Linhas por página (padrão: 500). MAX_PAGES20Número máximo de páginas por solicitação. Na seção Variáveis e secrets, role a tela para baixo até Solicitações:
- Tempo limite da solicitação: insira
900segundos (15 minutos).
- Tempo limite da solicitação: insira
Acesse a guia Configurações:
- Na seção Recursos:
- Memória: selecione 512 MiB ou mais.
- CPU: selecione 1.
- Na seção Recursos:
Na seção Escalonamento de revisão:
- Número mínimo de instâncias: insira
0. - Número máximo de instâncias: insira
100ou ajuste com base na carga esperada.
- Número mínimo de instâncias: insira
Clique em Criar.
Aguarde a criação do serviço (1 a 2 minutos).
Depois que o serviço é criado, o editor de código inline é aberto automaticamente.
Adicionar código da função
- Insira main em Ponto de entrada da função.
No editor de código em linha, crie dois arquivos:
- Primeiro arquivo: main.py::
import functions_framework from google.cloud import storage import json import os import urllib.parse from urllib.request import Request, urlopen from urllib.error import HTTPError import time from datetime import datetime, timezone # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get("GCS_BUCKET", "").strip() GCS_PREFIX = os.environ.get("GCS_PREFIX", "domaintools/iris/").strip() STATE_KEY = os.environ.get("STATE_KEY", "domaintools/iris/state.json").strip() DT_API_KEY = os.environ.get("DT_API_KEY", "").strip() USE_MODE = os.environ.get("USE_MODE", "HASH").strip().upper() SEARCH_HASHES = [h.strip() for h in os.environ.get("SEARCH_HASHES", "").split(";") if h.strip()] DOMAINS = [d.strip() for d in os.environ.get("DOMAINS", "").split(";") if d.strip()] QUERY_LIST = [q.strip() for q in os.environ.get("QUERY_LIST", "").split(";") if q.strip()] PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "500")) MAX_PAGES = int(os.environ.get("MAX_PAGES", "20")) USE_NEXT = os.environ.get("USE_NEXT", "true").lower() == "true" HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60")) RETRIES = int(os.environ.get("HTTP_RETRIES", "2")) BASE_URL = "https://api.domaintools.com/v1/iris-investigate/" HDRS = { "X-Api-Key": DT_API_KEY, "Accept": "application/json", } def _http_post(url: str, body: dict) -> dict: """Make HTTP POST request with form-encoded body.""" req = Request(url, method="POST") for k, v in HDRS.items(): req.add_header(k, v) req.add_header("Content-Type", "application/x-www-form-urlencoded") encoded_body = urllib.parse.urlencode(body, doseq=True).encode('utf-8') attempt = 0 while True: try: with urlopen(req, data=encoded_body, timeout=HTTP_TIMEOUT) as r: return json.loads(r.read().decode("utf-8")) except HTTPError as e: if e.code in (429, 500, 502, 503, 504) and attempt < RETRIES: delay = int(e.headers.get("Retry-After", "2")) time.sleep(max(1, delay)) attempt += 1 continue raise def _write_page(bucket, obj: dict, label: str, page: int) -> str: ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime()) key = f"{GCS_PREFIX.rstrip('/')}/{ts}-{label}-p{page:05d}.json" blob = bucket.blob(key) blob.upload_from_string( json.dumps(obj, separators=(",", ":")), content_type="application/json" ) return key def _first_page_params() -> dict: params = {"page_size": str(PAGE_SIZE)} if USE_NEXT: params["next"] = "true" return params def _paginate(bucket, label: str, params: dict) -> tuple: pages = 0 total = 0 while pages < MAX_PAGES: data = _http_post(BASE_URL, params) _write_page(bucket, data, label, pages) resp = data.get("response") or {} results = resp.get("results") or [] total += len(results) pages += 1 next_url = resp.get("next") if isinstance(resp, dict) else None if next_url: parsed = urllib.parse.urlparse(next_url) params = dict(urllib.parse.parse_qsl(parsed.query)) continue if resp.get("has_more_results") and resp.get("position"): base = _first_page_params() base.pop("next", None) base["position"] = resp["position"] params = base continue break return pages, total def run_hashes(bucket, hashes: list) -> dict: agg_pages = agg_results = 0 for h in hashes: params = _first_page_params() params["search_hash"] = h p, r = _paginate(bucket, f"hash-{h}", params) agg_pages += p agg_results += r return {"pages": agg_pages, "results": agg_results} def run_domains(bucket, domains: list) -> dict: agg_pages = agg_results = 0 for d in domains: params = _first_page_params() params["domain"] = d p, r = _paginate(bucket, f"domain-{d}", params) agg_pages += p agg_results += r return {"pages": agg_pages, "results": agg_results} def run_queries(bucket, queries: list) -> dict: agg_pages = agg_results = 0 for q in queries: base = _first_page_params() for k, v in urllib.parse.parse_qsl(q, keep_blank_values=True): base.setdefault(k, v) p, r = _paginate(bucket, f"query-{q.replace('=', '-')}", base) agg_pages += p agg_results += r return {"pages": agg_pages, "results": agg_results} @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch DomainTools Iris Investigate results and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ if not GCS_BUCKET: print("Error: GCS_BUCKET environment variable not set") return try: bucket = storage_client.bucket(GCS_BUCKET) if USE_MODE == "HASH" and SEARCH_HASHES: res = run_hashes(bucket, SEARCH_HASHES) elif USE_MODE == "DOMAINS" and DOMAINS: res = run_domains(bucket, DOMAINS) elif USE_MODE == "QUERY" and QUERY_LIST: res = run_queries(bucket, QUERY_LIST) else: raise ValueError( "Invalid USE_MODE or missing parameters. Set USE_MODE to HASH | DOMAINS | QUERY " "and provide SEARCH_HASHES | DOMAINS | QUERY_LIST accordingly." ) print(f"Successfully processed: {json.dumps({'ok': True, 'mode': USE_MODE, **res})}") except Exception as e: print(f"Error processing DomainTools Iris data: {str(e)}") raise- Segundo arquivo: requirements.txt:
functions-framework==3.* google-cloud-storage==2.*Clique em Implantar para salvar e implantar a função.
Aguarde a conclusão da implantação (2 a 3 minutos).
Criar o job do Cloud Scheduler
O Cloud Scheduler vai publicar mensagens no tópico do Pub/Sub em intervalos regulares, acionando a função do Cloud Run.
- No Console do GCP, acesse o Cloud Scheduler.
- Clique em Criar job.
Informe os seguintes detalhes de configuração:
Configuração Valor Nome domaintools-iris-1hRegião Selecione a mesma região da função do Cloud Run Frequência 0 * * * *(a cada hora, na hora)Fuso horário Selecione o fuso horário (UTC recomendado) Tipo de destino Pub/Sub Tópico Selecione o tópico do Pub/Sub ( domaintools-iris-trigger).Corpo da mensagem {}(objeto JSON vazio)Clique em Criar.
Opções de frequência de programação
Escolha a frequência com base no volume de registros e nos requisitos de latência:
Frequência Expressão Cron Caso de uso A cada 5 minutos */5 * * * *Alto volume e baixa latência A cada 15 minutos */15 * * * *Volume médio A cada hora 0 * * * *Padrão (recomendado) A cada 6 horas 0 */6 * * *Baixo volume, processamento em lote Diário 0 0 * * *Coleta de dados históricos
Testar a integração
- No console do Cloud Scheduler, encontre seu job.
- Clique em Executar à força para acionar o job manualmente.
- Aguarde alguns segundos.
- Acesse Cloud Run > Serviços.
- Clique no nome da função (
domaintools-iris-collector). - Clique na guia Registros.
Verifique se a função foi executada com sucesso. Procure o seguinte:
Successfully processed: {"ok": true, "mode": "HASH", "pages": X, "results": Y}Acesse Cloud Storage > Buckets.
Clique no nome do bucket.
Navegue até a pasta de prefixo (
domaintools/iris/).Verifique se os novos arquivos
.jsonforam criados com o carimbo de data/hora atual.
Se você encontrar erros nos registros:
- HTTP 401: verifique as credenciais da API DomainTools nas variáveis de ambiente
- HTTP 403: verifique se a conta tem as permissões necessárias para a API Iris Investigate
- HTTP 429: limitação de taxa. A função vai tentar novamente automaticamente com espera.
- Variáveis de ambiente ausentes: verifique se todas as variáveis necessárias estão definidas.
- USE_MODE inválido: verifique se USE_MODE está definido como HASH, DOMAINS ou QUERY e se os parâmetros correspondentes foram fornecidos.
Recuperar a conta de serviço do Google SecOps
O Google SecOps usa uma conta de serviço exclusiva para ler dados do seu bucket do GCS. Você precisa conceder a essa conta de serviço acesso ao seu bucket.
Receber o e-mail da conta de serviço
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
DomainTools Iris Investigate). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione Inteligência de ameaças do DomainTools como o Tipo de registro.
Clique em Receber conta de serviço. Um e-mail exclusivo da conta de serviço é exibido, por exemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopie esse endereço de e-mail para usar na próxima etapa.
Conceder permissões do IAM à conta de serviço do Google SecOps
A conta de serviço do Google SecOps precisa do papel de Leitor de objetos do Storage no seu bucket do GCS.
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket.
- Acesse a guia Permissões.
- Clique em Conceder acesso.
- Informe os seguintes detalhes de configuração:
- Adicionar participantes: cole o e-mail da conta de serviço do Google SecOps.
- Atribuir papéis: selecione Leitor de objetos do Storage.
Clique em Salvar.
Configurar um feed no Google SecOps para ingerir resultados do DomainTools Iris Investigate
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
DomainTools Iris Investigate). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione Inteligência de ameaças do DomainTools como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
URL do bucket de armazenamento: insira o URI do bucket do GCS com o caminho do prefixo:
gs://domaintools-iris/domaintools/iris/Substitua:
domaintools-iris: o nome do bucket do GCS.domaintools/iris/: prefixo/caminho da pasta opcional onde os registros são armazenados (deixe em branco para a raiz).
Exemplos:
- Bucket raiz:
gs://domaintools-iris/ - Com prefixo:
gs://domaintools-iris/domaintools/iris/
- Bucket raiz:
Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:
- Nunca: nunca exclui arquivos após as transferências (recomendado para testes).
- Excluir arquivos transferidos: exclui os arquivos após a transferência bem-sucedida.
Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência bem-sucedida.
Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
Namespace do recurso:
domaintools.threat_intelRótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| ativo | principal.domain.status | Mapeado diretamente do campo "active" no registro bruto. |
| additional_whois_email.[].value | about.labels.additional_whois_email | Extraído da matriz "additional_whois_email" e adicionado como um rótulo no objeto "about". |
| adsense.value | about.labels.adsense | Extraído de "adsense.value" e adicionado como um rótulo no objeto "about". |
| admin_contact.city.value | principal.domain.admin.office_address.city | Mapeado diretamente do campo "admin_contact.city.value" no registro bruto. |
| admin_contact.country.value | principal.domain.admin.office_address.country_or_region | Mapeado diretamente do campo "admin_contact.country.value" no registro bruto. |
| admin_contact.email.[].value | principal.domain.admin.email_addresses | Extraído da matriz admin_contact.email e adicionado ao campo email_addresses. |
| admin_contact.fax.value | principal.domain.admin.attribute.labels.fax | Extraído de admin_contact.fax.value e adicionado como um rótulo com a chave "fax" no atributo "admin". |
| admin_contact.name.value | principal.domain.admin.user_display_name | Mapeado diretamente do campo "admin_contact.name.value" no registro bruto. |
| admin_contact.org.value | principal.domain.admin.company_name | Mapeado diretamente do campo "admin_contact.org.value" no registro bruto. |
| admin_contact.phone.value | principal.domain.admin.phone_numbers | Mapeado diretamente do campo "admin_contact.phone.value" no registro bruto. |
| admin_contact.postal.value | principal.domain.admin.attribute.labels.postal | Extraído de admin_contact.postal.value e adicionado como um rótulo com a chave "postal" no atributo do administrador. |
| admin_contact.state.value | principal.domain.admin.office_address.state | Mapeado diretamente do campo "admin_contact.state.value" no registro bruto. |
| admin_contact.street.value | principal.domain.admin.office_address.name | Mapeado diretamente do campo "admin_contact.street.value" no registro bruto. |
| alexa | about.labels.alexa | Mapeado diretamente do campo "alexa" no registro bruto e adicionado como um rótulo no objeto "about". |
| baidu_codes.[].value | about.labels.baidu_codes | Extraído da matriz "baidu_codes" e adicionado como um rótulo no objeto "about". |
| billing_contact.city.value | principal.domain.billing.office_address.city | Mapeado diretamente do campo "billing_contact.city.value" no registro bruto. |
| billing_contact.country.value | principal.domain.billing.office_address.country_or_region | Mapeado diretamente do campo "billing_contact.country.value" no registro bruto. |
| billing_contact.email.[].value | principal.domain.billing.email_addresses | Extraído da matriz "billing_contact.email" e adicionado ao campo "email_addresses". |
| billing_contact.fax.value | principal.domain.billing.attribute.labels.fax | Extraído de billing_contact.fax.value e adicionado como um rótulo com a chave "fax" no atributo de faturamento. |
| billing_contact.name.value | principal.domain.billing.user_display_name | Mapeado diretamente do campo "billing_contact.name.value" no registro bruto. |
| billing_contact.org.value | principal.domain.billing.company_name | Mapeado diretamente do campo "billing_contact.org.value" no registro bruto. |
| billing_contact.phone.value | principal.domain.billing.phone_numbers | Mapeado diretamente do campo "billing_contact.phone.value" no registro bruto. |
| billing_contact.postal.value | principal.domain.billing.attribute.labels.postal | Extraído de "billing_contact.postal.value" e adicionado como um marcador com a chave "postal" no atributo de faturamento. |
| billing_contact.state.value | principal.domain.billing.office_address.state | Mapeado diretamente do campo "billing_contact.state.value" no registro bruto. |
| billing_contact.street.value | principal.domain.billing.office_address.name | Mapeado diretamente do campo "billing_contact.street.value" no registro bruto. |
| create_date.value | principal.domain.creation_time | Convertido para o formato de carimbo de data/hora do campo "create_date.value" no registro bruto. |
| data_updated_timestamp | principal.domain.audit_update_time | Convertido para o formato de carimbo de data/hora do campo "data_updated_timestamp" no registro bruto. |
| domínio | principal.hostname | Mapeado diretamente do campo "domain" no registro bruto. |
| domain_risk.components.[].evidence | security_result.detection_fields.evidence | Extraído da matriz domain_risk.components.[].evidence e adicionado como um campo de detecção com a chave "evidence" no objeto security_result. |
| domain_risk.components.[].name | security_result.category_details | Mapeado diretamente do campo "domain_risk.components.[].name" no registro bruto. |
| domain_risk.components.[].risk_score | security_result.risk_score | Mapeado diretamente do campo "domain_risk.components.[].risk_score" no registro bruto. |
| domain_risk.components.[].threats | security_result.threat_name | O primeiro elemento da matriz domain_risk.components.[].threats é mapeado para security_result.threat_name. |
| domain_risk.components.[].threats | security_result.detection_fields.threats | Os elementos restantes da matriz domain_risk.components.[].threats são adicionados como campos de detecção com a chave "threats" no objeto security_result. |
| domain_risk.risk_score | security_result.risk_score | Mapeado diretamente do campo "domain_risk.risk_score" no registro bruto. |
| email_domain.[].value | about.labels.email_domain | Extraído da matriz "email_domain" e adicionado como um rótulo no objeto "about". |
| expiration_date.value | principal.domain.expiration_time | Convertido para o formato de carimbo de data/hora do campo "expiration_date.value" no registro bruto. |
| fb_codes.[].value | about.labels.fb_codes | Extraído da matriz fb_codes e adicionado como um rótulo no objeto "about". |
| first_seen.value | principal.domain.first_seen_time | Convertido para o formato de carimbo de data/hora do campo "first_seen.value" no registro bruto. |
| ga4.[].value | about.labels.ga4 | Extraído da matriz ga4 e adicionado como um rótulo no objeto "about". |
| google_analytics.value | about.labels.google_analytics | Extraído de google_analytics.value e adicionado como um rótulo no objeto "about". |
| gtm_codes.[].value | about.labels.gtm_codes | Extraído da matriz gtm_codes e adicionado como um rótulo no objeto "about". |
| hotjar_codes.[].value | about.labels.hotjar_codes | Extraído da matriz "hotjar_codes" e adicionado como um rótulo no objeto "about". |
| ip.[].address.value | principal.ip | O primeiro elemento da matriz "ip" é mapeado para "principal.ip". |
| ip.[].address.value | about.labels.ip_address | Os elementos restantes da matriz "ip" são adicionados como rótulos com a chave "ip_address" no objeto "about". |
| ip.[].asn.[].value | network.asn | O primeiro elemento da primeira matriz ip.asn é mapeado para network.asn. |
| ip.[].asn.[].value | about.labels.asn | Os elementos restantes das matrizes ip.asn são adicionados como rótulos com a chave "asn" no objeto "about". |
| ip.[].country_code.value | principal.location.country_or_region | O country_code.value do primeiro elemento na matriz ip é mapeado para principal.location.country_or_region. |
| ip.[].country_code.value | about.location.country_or_region | O country_code.value dos elementos restantes na matriz ip é mapeado para about.location.country_or_region. |
| ip.[].isp.value | principal.labels.isp | O isp.value do primeiro elemento na matriz ip é mapeado para principal.labels.isp. |
| ip.[].isp.value | about.labels.isp | O isp.value dos elementos restantes na matriz ip é mapeado para about.labels.isp. |
| matomo_codes.[].value | about.labels.matomo_codes | Extraído da matriz matomo_codes e adicionado como um rótulo no objeto "about". |
| monitor_domain | about.labels.monitor_domain | Mapeado diretamente do campo "monitor_domain" no registro bruto e adicionado como um rótulo no objeto "about". |
| monitoring_domain_list_name | about.labels.monitoring_domain_list_name | Mapeado diretamente do campo "monitoring_domain_list_name" no registro bruto e adicionado como um rótulo no objeto "about". |
| mx.[].domain.value | about.domain.name | Mapeado diretamente do campo "mx.[].domain.value" no registro bruto. |
| mx.[].host.value | about.hostname | Mapeado diretamente do campo "mx.[].host.value" no registro bruto. |
| mx.[].ip.[].value | about.ip | Extraído da matriz mx.[].ip e adicionado ao campo "ip". |
| mx.[].priority | about.security_result.priority_details | Mapeado diretamente do campo "mx.[].priority" no registro bruto. |
| name_server.[].domain.value | about.labels.name_server_domain | Extraído de name_server.[].domain.value e adicionado como um rótulo com a chave "name_server_domain" no objeto "about". |
| name_server.[].host.value | principal.domain.name_server | Extraído de name_server.[].host.value e adicionado ao campo name_server. |
| name_server.[].host.value | about.domain.name_server | Extraído de name_server.[].host.value e adicionado ao campo name_server. |
| name_server.[].ip.[].value | about.labels.ip | Extraído da matriz name_server.[].ip e adicionado como um rótulo com a chave "ip" no objeto "about". |
| popularity_rank | about.labels.popularity_rank | Mapeado diretamente do campo "popularity_rank" no registro bruto e adicionado como um rótulo no objeto "about". |
| redirect.value | about.labels.redirect | Extraído de "redirect.value" e adicionado como um rótulo no objeto "about". |
| redirect_domain.value | about.labels.redirect_domain | Extraído de redirect_domain.value e adicionado como um rótulo no objeto "about". |
| registrant_contact.city.value | principal.domain.registrant.office_address.city | Mapeado diretamente do campo "registrant_contact.city.value" no registro bruto. |
| registrant_contact.country.value | principal.domain.registrant.office_address.country_or_region | Mapeado diretamente do campo "registrant_contact.country.value" no registro bruto. |
| registrant_contact.email.[].value | principal.domain.registrant.email_addresses | Extraído da matriz registrant_contact.email e adicionado ao campo email_addresses. |
| registrant_contact.fax.value | principal.domain.registrant.attribute.labels.fax | Extraído de registrant_contact.fax.value e adicionado como um rótulo com a chave "fax" no atributo do registrante. |
| registrant_contact.name.value | principal.domain.registrant.user_display_name | Mapeado diretamente do campo "registrant_contact.name.value" no registro bruto. |
| registrant_contact.org.value | principal.domain.registrant.company_name | Mapeado diretamente do campo "registrant_contact.org.value" no registro bruto. |
| registrant_contact.phone.value | principal.domain.registrant.phone_numbers | Mapeado diretamente do campo "registrant_contact.phone.value" no registro bruto. |
| registrant_contact.postal.value | principal.domain.registrant.attribute.labels.postal | Extraído de registrant_contact.postal.value e adicionado como um marcador com a chave "postal" no atributo do registrante. |
| registrant_contact.state.value | principal.domain.registrant.office_address.state | Mapeado diretamente do campo "registrant_contact.state.value" no registro bruto. |
| registrant_contact.street.value | principal.domain.registrant.office_address.name | Mapeado diretamente do campo "registrant_contact.street.value" no registro bruto. |
| registrant_name.value | about.labels.registrant_name | Extraído de registrant_name.value e adicionado como um rótulo no objeto "about". |
| registrant_org.value | about.labels.registrant_org | Extraído de registrant_org.value e adicionado como um rótulo no objeto "about". |
| registrar.value | principal.domain.registrar | Mapeado diretamente do campo "registrar.value" no registro bruto. |
| registrar_status | about.labels.registrar_status | Extraído da matriz "registrar_status" e adicionado como um rótulo no objeto "about". |
| server_type | network.tls.client.server_name | Mapeado diretamente do campo "server_type" no registro bruto. |
| soa_email.[].value | principal.user.email_addresses | Extraído da matriz soa_email e adicionado ao campo email_addresses. |
| spf_info | about.labels.spf_info | Mapeado diretamente do campo "spf_info" no registro bruto e adicionado como um rótulo no objeto "about". |
| ssl_email.[].value | about.labels.ssl_email | Extraído da matriz "ssl_email" e adicionado como um rótulo no objeto "about". |
| ssl_info.[].alt_names.[].value | about.labels.alt_names | Extraído da matriz ssl_info.[].alt_names e adicionado como um rótulo no objeto "about". |
| ssl_info.[].common_name.value | about.labels.common_name | Extraído de ssl_info.[].common_name.value e adicionado como um rótulo no objeto "about". |
| ssl_info.[].duration.value | about.labels.duration | Extraído de ssl_info.[].duration.value e adicionado como um rótulo no objeto "about". |
| ssl_info.[].email.[].value | about.labels.ssl_info_email | Extraído da matriz ssl_info.[].email e adicionado como um rótulo com a chave "ssl_info_email" no objeto "about". |
| ssl_info.[].hash.value | network.tls.server.certificate.sha1 | O hash.value do primeiro elemento na matriz ssl_info é mapeado para network.tls.server.certificate.sha1. |
| ssl_info.[].hash.value | about.labels.hash | O hash.value dos elementos restantes na matriz ssl_info é mapeado para about.labels.hash. |
| ssl_info.[].issuer_common_name.value | network.tls.server.certificate.issuer | O issuer_common_name.value do primeiro elemento na matriz ssl_info é mapeado para network.tls.server.certificate.issuer. |
| ssl_info.[].issuer_common_name.value | about.labels.issuer_common_name | O issuer_common_name.value dos elementos restantes na matriz ssl_info é mapeado para about.labels.issuer_common_name. |
| ssl_info.[].not_after.value | network.tls.server.certificate.not_after | O not_after.value do primeiro elemento na matriz ssl_info é convertido para o formato de carimbo de data/hora e mapeado para network.tls.server.certificate.not_after. |
| ssl_info.[].not_after.value | about.labels.not_after | O not_after.value dos elementos restantes na matriz ssl_info é mapeado para about.labels.not_after. |
| ssl_info.[].not_before.value | network.tls.server.certificate.not_before | O not_before.value do primeiro elemento na matriz ssl_info é convertido para o formato de carimbo de data/hora e mapeado para network.tls.server.certificate.not_before. |
| ssl_info.[].not_before.value | about.labels.not_before | O not_before.value dos elementos restantes na matriz ssl_info é mapeado para about.labels.not_before. |
| ssl_info.[].organization.value | network.organization_name | O organization.value do primeiro elemento na matriz ssl_info é mapeado para network.organization_name. |
| ssl_info.[].organization.value | about.labels.organization | O organization.value dos elementos restantes na matriz ssl_info é mapeado para about.labels.organization. |
| ssl_info.[].subject.value | about.labels.subject | Extraído de ssl_info.[].subject.value e adicionado como um rótulo no objeto "about". |
| statcounter_project_codes.[].value | about.labels.statcounter_project_codes | Extraído da matriz "statcounter_project_codes" e adicionado como um rótulo no objeto "about". |
| statcounter_security_codes.[].value | about.labels.statcounter_security_codes | Extraído da matriz statcounter_security_codes e adicionado como um rótulo no objeto "about". |
| tags.[].label | about.file.tags | Extraído de tags.[].label e adicionado ao campo "tags". |
| tags.[].scope | security_result.detection_fields.scope | Extraído de tags.[].scope e adicionado como um campo de detecção com a chave "scope" no objeto security_result. |
| tags.[].tagged_at | security_result.detection_fields.tagged_at | Extraído de tags.[].tagged_at e adicionado como um campo de detecção com a chave "tagged_at" no objeto security_result. |
| technical_contact.city.value | principal.domain.tech.office_address.city | Mapeado diretamente do campo "technical_contact.city.value" no registro bruto. |
| technical_contact.country.value | principal.domain.tech.office_address.country_or_region | Mapeado diretamente do campo "technical_contact.country.value" no registro bruto. |
| technical_contact.email.[].value | principal.domain.tech.email_addresses | Extraído da matriz technical_contact.email e adicionado ao campo email_addresses. |
| technical_contact.fax.value | principal.domain.tech.attribute.labels.fax | Extraído de technical_contact.fax.value e adicionado como um rótulo com a chave "fax" no atributo técnico. |
| technical_contact.name.value | principal.domain.tech.user_display_name | Mapeado diretamente do campo "technical_contact.name.value" no registro bruto. |
| technical_contact.org.value | principal.domain.tech.company_name | Mapeado diretamente do campo "technical_contact.org.value" no registro bruto. |
| technical_contact.phone.value | principal.domain.tech.phone_numbers | Mapeado diretamente do campo "technical_contact.phone.value" no registro bruto. |
| technical_contact.postal.value | principal.domain.tech.attribute.labels.postal | Extraído de technical_contact.postal.value e adicionado como um rótulo com a chave "postal" no atributo técnico. |
| technical_contact.state.value | principal.domain.tech.office_address.state | Mapeado diretamente do campo "technical_contact.state.value" no registro bruto. |
| technical_contact.street.value | principal.domain.tech.office_address.name | Mapeado diretamente do campo "technical_contact.street.value" no registro bruto. |
| tld | about.labels.tld | Mapeado diretamente do campo "tld" no registro bruto e adicionado como um rótulo no objeto "about". |
| timestamp | about.labels.timestamp | Mapeado diretamente do campo de carimbo de data/hora no registro bruto e adicionado como um rótulo no objeto "about". |
| website_response | principal.network.http.response_code | Mapeado diretamente do campo "website_response" no registro bruto. |
| website_title | about.labels.website_title | Mapeado diretamente do campo "website_title" no registro bruto e adicionado como um rótulo no objeto "about". |
| whois_url | principal.domain.whois_server | Mapeado diretamente do campo "whois_url" no registro bruto. |
| yandex_codes.[].value | about.labels.yandex_codes | Extraído da matriz yandex_codes e adicionado como um rótulo no objeto "about". |
| edr.client.hostname | Definido como o valor do campo "domain". | |
| edr.client.ip_addresses | Definido como o valor do primeiro elemento na matriz "ip", especificamente ip.[0].address.value. | |
| edr.raw_event_name | Definido como "STATUS_UPDATE" se "principal.hostname" estiver presente. Caso contrário, definido como "GENERIC_EVENT". | |
| metadata.event_timestamp | Copiado do campo "create_time" de nível superior no registro bruto. | |
| metadata.event_type | Definido como "STATUS_UPDATE" se "principal.hostname" estiver presente. Caso contrário, definido como "GENERIC_EVENT". | |
| metadata.log_type | Defina como "DOMAINTOOLS_THREATINTEL". | |
| metadata.product_name | Defina como "DOMAINTOOLS". | |
| metadata.vendor_name | Defina como "DOMAINTOOLS". |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.