Coletar resultados do DomainTools Iris Investigate

Compatível com:

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

  1. Faça login no painel da API DomainTools. Somente a conta proprietária da API pode redefinir a chave de API.
  2. Na seção Minha conta, selecione o link Ver painel da API, localizado na guia Resumo da conta.
  3. Acesse a seção Nome de usuário da API para conseguir seu nome de usuário.
  4. Na mesma guia, localize a chave de API.
  5. Copie e salve a chave em um local seguro. Se você precisar de uma nova chave, selecione Redefinir chave de API.

  6. Observe o endpoint do Iris Investigate: https://api.domaintools.com/v1/iris-investigate/.

Criar um bucket do Google Cloud Storage

  1. Acesse o Console do Google Cloud.
  2. Selecione seu projeto ou crie um novo.
  3. No menu de navegação, acesse Cloud Storage > Buckets.
  4. Clique em Criar bucket.
  5. 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
  6. 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

  1. No Console do GCP, acesse IAM e administrador > Contas de serviço.
  2. Clique em Criar conta de serviço.
  3. 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.
  4. Clique em Criar e continuar.
  5. Na seção Conceder acesso a essa conta de serviço ao projeto, adicione os seguintes papéis:
    1. Clique em Selecionar papel.
    2. Pesquise e selecione Administrador de objetos do Storage.
    3. Clique em + Adicionar outro papel.
    4. Pesquise e selecione Invocador do Cloud Run.
    5. Clique em + Adicionar outro papel.
    6. Pesquise e selecione Invocador do Cloud Functions.
  6. Clique em Continuar.
  7. 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:

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket.
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. 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.
  6. 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.

  1. No Console do GCP, acesse Pub/Sub > Tópicos.
  2. Selecione Criar tópico.
  3. Informe os seguintes detalhes de configuração:
    • ID do tópico: insira domaintools-iris-trigger.
    • Não altere as outras configurações.
  4. 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.

  1. No console do GCP, acesse o Cloud Run.
  2. Clique em Criar serviço.
  3. Selecione Função (use um editor in-line para criar uma função).
  4. Na seção Configurar, forneça os seguintes detalhes de configuração:

    Configuração Valor
    Nome do serviço domaintools-iris-collector
    Regiã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.
  5. Na seção Acionador (opcional):

    1. Clique em + Adicionar gatilho.
    2. Selecione Cloud Pub/Sub.
    3. Em Selecionar um tópico do Cloud Pub/Sub, escolha o tópico do Pub/Sub (domaintools-iris-trigger).
    4. Clique em Salvar.
  6. Na seção Autenticação:

    1. Selecione Exigir autenticação.
    2. Confira o Identity and Access Management (IAM).
  7. Role a tela para baixo e abra Contêineres, rede, segurança.

  8. Acesse a guia Segurança:

    • Conta de serviço: selecione a conta de serviço (domaintools-iris-collector-sa).
  9. Acesse a guia Contêineres:

    1. Clique em Variáveis e secrets.
    2. Clique em + Adicionar variável para cada variável de ambiente:
    Nome da variável Valor de exemplo Descrição
    GCS_BUCKET domaintools-iris Nome do bucket do GCS em que os dados serão armazenados.
    GCS_PREFIX domaintools/iris/ Prefixo opcional do GCS (subpasta) para objetos.
    STATE_KEY domaintools/iris/state.json Chave opcional do arquivo de estado/checkpoint.
    DT_API_KEY DT-XXXXXXXXXXXXXXXXXXXX Chave de API do DomainTools.
    USE_MODE HASH Selecione o modo a ser usado: HASH, DOMAINS ou QUERY (apenas um fica ativo por vez).
    SEARCH_HASHES hash1;hash2;hash3 Obrigatório se USE_MODE=HASH. Lista separada por ponto e vírgula de hashes de pesquisa salvas da interface da Iris.
    DOMAINS example.com;domaintools.com Obrigatório se USE_MODE=DOMAINS. Lista de domínios separados por ponto e vírgula.
    QUERY_LIST ip=1.1.1.1;ip=8.8.8.8;domain=example.org Obrigatório se USE_MODE=QUERY. Lista de strings de consulta separadas por ponto e vírgula (k=v&k2=v2).
    PAGE_SIZE 500 Linhas por página (padrão: 500).
    MAX_PAGES 20 Número máximo de páginas por solicitação.
  10. Na seção Variáveis e secrets, role a tela para baixo até Solicitações:

    • Tempo limite da solicitação: insira 900 segundos (15 minutos).
  11. Acesse a guia Configurações:

    • Na seção Recursos:
      • Memória: selecione 512 MiB ou mais.
      • CPU: selecione 1.
  12. Na seção Escalonamento de revisão:

    • Número mínimo de instâncias: insira 0.
    • Número máximo de instâncias: insira 100 ou ajuste com base na carga esperada.
  13. Clique em Criar.

  14. Aguarde a criação do serviço (1 a 2 minutos).

  15. Depois que o serviço é criado, o editor de código inline é aberto automaticamente.

Adicionar código da função

  1. Insira main em Ponto de entrada da função.
  2. 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.*
    
  3. Clique em Implantar para salvar e implantar a função.

  4. 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.

  1. No Console do GCP, acesse o Cloud Scheduler.
  2. Clique em Criar job.
  3. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Nome domaintools-iris-1h
    Regiã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)
  4. 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

  1. No console do Cloud Scheduler, encontre seu job.
  2. Clique em Executar à força para acionar o job manualmente.
  3. Aguarde alguns segundos.
  4. Acesse Cloud Run > Serviços.
  5. Clique no nome da função (domaintools-iris-collector).
  6. Clique na guia Registros.
  7. Verifique se a função foi executada com sucesso. Procure o seguinte:

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

  9. Clique no nome do bucket.

  10. Navegue até a pasta de prefixo (domaintools/iris/).

  11. Verifique se os novos arquivos .json foram 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

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, DomainTools Iris Investigate).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Inteligência de ameaças do DomainTools como o Tipo de registro.
  7. 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.com
    
  8. Copie 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.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket.
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. 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.
  6. Clique em Salvar.

Configurar um feed no Google SecOps para ingerir resultados do DomainTools Iris Investigate

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, DomainTools Iris Investigate).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Inteligência de ameaças do DomainTools como o Tipo de registro.
  7. Clique em Próxima.
  8. 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/
    • 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_intel

    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.

  9. Clique em Próxima.

  10. 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.