Coletar registros de IOC personalizados do Mandiant Threat Intelligence

Compatível com:

Este documento explica como ingerir dados de IOC personalizados da Mandiant Threat Intelligence no Google Security Operations usando o Google Cloud Storage V2.

A Mandiant Threat Intelligence oferece indicadores de comprometimento (IOCs) com contexto, incluindo endereços IP, domínios, URLs, hashes de arquivos e endereços de e-mail. A plataforma oferece inteligência contra ameaças com base em investigações de resposta a incidentes na linha de frente, permitindo que as equipes de segurança identifiquem e priorizem ameaças direcionadas à organização.

Antes de começar

Verifique se você atende os seguintes pré-requisitos:

  • Uma instância do Google SecOps
  • Um projeto do GCP com a API Storage ativada
  • Permissões para criar e gerenciar intervalos 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
  • Assinatura ativa do Mandiant Advantage Threat Intelligence
  • Acesso privilegiado ao portal do Mandiant Advantage

Criar um bucket do Google Cloud Storage

  1. Acesse o Console do Google Cloud.
  2. Selecione um 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, mandiant-ioc-logs.
    Tipo de local Escolha de acordo com 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.

Coletar credenciais do Mandiant Advantage

Acessar o URL do site da Mandiant

  1. Faça login na sua instância do Mandiant Advantage.
  2. Anote o URL do site na barra de endereço do navegador.
    • O URL é: https://advantage.mandiant.com

Criar credenciais de API

  1. Faça login no Mandiant Advantage.
  2. Acesse Configurações.
  3. Role a tela para baixo até Acesso e chaves de API ou selecione essa opção no menu de navegação.
  4. Clique em Receber ID e chave secreta.
  5. Copie e salve as credenciais da API com segurança:
    • ID da chave: copie esse valor, também chamado de ID da chave de API ou chave pública.
    • Chave secreta: copie esse valor (também chamado de chave secreta da API ou chave privada).

Verifique as permissões

Para verificar se a conta tem as permissões necessárias:

  1. Faça login no Mandiant Advantage.
  2. Acesse Configurações.
  3. Revise as permissões do usuário em Informações do usuário.
  4. Verifique se você tem acesso ao módulo Threat Intelligence.
  5. Se você não conseguir acessar os dados de inteligência de ameaças, entre em contato com o administrador do Mandiant para conceder as permissões adequadas.

Testar o acesso à API

  • Teste suas credenciais antes de prosseguir com a integração:

    # Replace with your actual credentials
    API_KEY_ID="your-key-id"
    API_SECRET="your-key-secret"
    API_BASE="https://api.intelligence.mandiant.com"
    
    # Get OAuth token
    TOKEN=$(curl -s -X POST "${API_BASE}/token" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "grant_type=client_credentials" \
        -u "${API_KEY_ID}:${API_SECRET}" | jq -r '.access_token')
    
    # Test API access
    curl -v -H "Authorization: Bearer ${TOKEN}" \
        "${API_BASE}/v4/indicator?limit=1"
    

Se o teste for bem-sucedido, você vai receber uma resposta JSON com dados de indicadores. Se você receber um erro:

  • HTTP 401: verifique se o ID e o secret da chave de API estão corretos.
  • HTTP 403: verifique se a conta tem permissões de Threat Intelligence
  • HTTP 404: verifique se o URL base da API está correto.

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 mandiant-ioc-collector-sa (por exemplo, mandiant-ioc-collector-sa).
    • Descrição da conta de serviço: digite Service account for Cloud Run function to collect Mandiant IOC 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: gravar registros no bucket do GCS e gerenciar arquivos de estado - Invocador do Cloud Run: permitir que o Pub/Sub invoque a função - Invocador do Cloud Functions: permitir 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 (por exemplo, mandiant-ioc-logs).
  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, mandiant-ioc-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 mandiant-ioc-trigger (por exemplo, mandiant-ioc-trigger)
    • Não mude as outras configurações.
  4. Clique em Criar.

Criar uma função do Cloud Run para coletar registros

A função do Cloud Run será acionada por mensagens do Pub/Sub do Cloud Scheduler para buscar dados de IOC da API Mandiant Threat Intelligence 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 mandiant-ioc-collector (por exemplo, mandiant-ioc-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 (por exemplo, mandiant-ioc-trigger).
    4. Clique em Salvar.
  6. Na seção Autenticação:

    1. Selecione Exigir autenticação.
    2. Confira o Identity and Access Management (IAM).
  1. Role a tela para baixo e expanda Contêineres, rede, segurança.
  2. Acesse a guia Segurança:
    • Conta de serviço: selecione a conta de serviço (por exemplo, mandiant-ioc-collector-sa).
  3. 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 mandiant-ioc-logs Nome do bucket do GCS
    GCS_PREFIX mandiant-ioc Prefixo para arquivos de registro
    STATE_KEY mandiant-ioc/state.json Caminho do arquivo de estado
    API_BASE https://api.intelligence.mandiant.com URL base da API
    API_KEY_ID your-key-id ID da chave de API do Mandiant
    API_SECRET your-key-secret Chave secreta da API Mandiant
    MAX_RECORDS 1000 Máximo de registros por execução
    PAGE_SIZE 100 Registros por página
    LOOKBACK_HOURS 24 Período de lookback inicial
  4. Na seção Variáveis e secrets, role a tela para baixo até Solicitações:

    • Tempo limite da solicitação: insira 600 segundos (10 minutos)
  5. Acesse a guia Configurações:

    • Na seção Recursos:
      • Memória: selecione 512 MiB ou mais.
      • CPU: selecione 1
  6. 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.
  7. Clique em Criar.

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

  9. Depois que o serviço for criado, o editor de código inline será aberto automaticamente.

Adicionar código da função

  1. Insira main no campo Ponto de entrada.
  2. No editor de código em linha, crie dois arquivos:

    • main.py:

      import functions_framework
      from google.cloud import storage
      import json
      import os
      import urllib3
      from datetime import datetime, timezone, timedelta
      import time
      import base64
      
      # Initialize HTTP client with timeouts
      http = urllib3.PoolManager(
          timeout=urllib3.Timeout(connect=5.0, read=30.0),
          retries=False,
      )
      
      # Initialize Storage client
      storage_client = storage.Client()
      
      # Environment variables
      GCS_BUCKET = os.environ.get('GCS_BUCKET')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'mandiant-ioc')
      STATE_KEY = os.environ.get('STATE_KEY', 'mandiant-ioc/state.json')
      API_BASE = os.environ.get('API_BASE', 'https://api.intelligence.mandiant.com')
      API_KEY_ID = os.environ.get('API_KEY_ID')
      API_SECRET = os.environ.get('API_SECRET')
      MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '1000'))
      PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '100'))
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24'))
      
      def to_unix_seconds(dt: datetime) -> int:
          """Convert datetime to Unix epoch seconds."""
          if dt.tzinfo is None:
              dt = dt.replace(tzinfo=timezone.utc)
          dt = dt.astimezone(timezone.utc)
          return int(dt.timestamp())
      
      def parse_datetime(value: str) -> datetime:
          """Parse ISO datetime string to datetime object."""
          if value.endswith("Z"):
              value = value[:-1] + "+00:00"
          return datetime.fromisoformat(value)
      
      @functions_framework.cloud_event
      def main(cloud_event):
          """
          Cloud Run function triggered by Pub/Sub to fetch Mandiant IOC data and write to GCS.
      
          Args:
              cloud_event: CloudEvent object containing Pub/Sub message
          """
      
          if not all([GCS_BUCKET, API_BASE, API_KEY_ID, API_SECRET]):
              print('Error: Missing required environment variables')
              return
      
          try:
              # Get GCS bucket
              bucket = storage_client.bucket(GCS_BUCKET)
      
              # Load state
              state = load_state(bucket, STATE_KEY)
      
              # Determine time window
              now = datetime.now(timezone.utc)
              last_time = None
      
              if isinstance(state, dict) and state.get("last_event_time"):
                  try:
                      last_time = parse_datetime(state["last_event_time"])
                      # Overlap by 2 minutes to catch any delayed events
                      last_time = last_time - timedelta(minutes=2)
                  except Exception as e:
                      print(f"Warning: Could not parse last_event_time: {e}")
      
              if last_time is None:
                  last_time = now - timedelta(hours=LOOKBACK_HOURS)
      
              print(f"Fetching IOCs from {last_time.isoformat()} to {now.isoformat()}")
      
              # Convert to Unix timestamps
              start_epoch = to_unix_seconds(last_time)
              end_epoch = to_unix_seconds(now)
      
              # Fetch IOCs
              records, newest_event_time = fetch_iocs(
                  api_base=API_BASE,
                  api_key_id=API_KEY_ID,
                  api_secret=API_SECRET,
                  start_epoch=start_epoch,
                  end_epoch=end_epoch,
                  page_size=PAGE_SIZE,
                  max_records=MAX_RECORDS,
              )
      
              if not records:
                  print("No new IOC records found.")
                  save_state(bucket, STATE_KEY, now.isoformat())
                  return
      
              # Write to GCS as NDJSON
              timestamp = now.strftime('%Y%m%d_%H%M%S')
              object_key = f"{GCS_PREFIX}/iocs_{timestamp}.ndjson"
              blob = bucket.blob(object_key)
      
              ndjson = '\n'.join([json.dumps(record, ensure_ascii=False) for record in records]) + '\n'
              blob.upload_from_string(ndjson, content_type='application/x-ndjson')
      
              print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}")
      
              # Update state with newest event time
              if newest_event_time:
                  save_state(bucket, STATE_KEY, newest_event_time)
              else:
                  save_state(bucket, STATE_KEY, now.isoformat())
      
              print(f"Successfully processed {len(records)} records")
      
          except Exception as e:
              print(f'Error processing IOCs: {str(e)}')
              raise
      
      def load_state(bucket, key):
          """Load state from GCS."""
          try:
              blob = bucket.blob(key)
              if blob.exists():
                  state_data = blob.download_as_text()
                  return json.loads(state_data)
          except Exception as e:
              print(f"Warning: Could not load state: {e}")
      
          return {}
      
      def save_state(bucket, key, last_event_time_iso: str):
          """Save the last event timestamp to GCS state file."""
          try:
              state = {'last_event_time': last_event_time_iso}
              blob = bucket.blob(key)
              blob.upload_from_string(
                  json.dumps(state, indent=2),
                  content_type='application/json'
              )
              print(f"Saved state: last_event_time={last_event_time_iso}")
          except Exception as e:
              print(f"Warning: Could not save state: {e}")
      
      def get_oauth_token(api_base: str, api_key_id: str, api_secret: str) -> str:
          """Get OAuth 2.0 access token from Mandiant API."""
          token_url = f"{api_base}/token"
      
          # Create Basic Auth header
          auth_string = f"{api_key_id}:{api_secret}"
          auth_bytes = auth_string.encode('utf-8')
          auth_b64 = base64.b64encode(auth_bytes).decode('utf-8')
      
          headers = {
              'Authorization': f'Basic {auth_b64}',
              'Content-Type': 'application/x-www-form-urlencoded',
              'Accept': 'application/json'
          }
      
          body = 'grant_type=client_credentials'
      
          try:
              response = http.request('POST', token_url, body=body, headers=headers)
      
              if response.status != 200:
                  print(f"Token request failed: {response.status}")
                  print(f"Response: {response.data.decode('utf-8')}")
                  raise Exception(f"Failed to get OAuth token: HTTP {response.status}")
      
              token_data = json.loads(response.data.decode('utf-8'))
              return token_data['access_token']
      
          except Exception as e:
              print(f"Error getting OAuth token: {e}")
              raise
      
      def fetch_iocs(api_base: str, api_key_id: str, api_secret: str, start_epoch: int, end_epoch: int, page_size: int, max_records: int):
          """
          Fetch IOCs from Mandiant Threat Intelligence API with pagination and rate limiting.
      
          Args:
              api_base: API base URL
              api_key_id: Mandiant API Key ID
              api_secret: Mandiant API Secret
              start_epoch: Start time in Unix epoch seconds
              end_epoch: End time in Unix epoch seconds
              page_size: Number of records per page
              max_records: Maximum total records to fetch
      
          Returns:
              Tuple of (records list, newest_event_time ISO string)
          """
          # Get OAuth token
          access_token = get_oauth_token(api_base, api_key_id, api_secret)
      
          endpoint = f"{api_base}/v4/indicator"
      
          headers = {
              'Authorization': f'Bearer {access_token}',
              'Accept': 'application/json',
              'Content-Type': 'application/json',
              'User-Agent': 'GoogleSecOps-MandiantCollector/1.0'
          }
      
          records = []
          newest_time = None
          page_num = 0
          backoff = 1.0
          next_url = None
      
          while True:
              page_num += 1
      
              if len(records) >= max_records:
                  print(f"Reached max_records limit ({max_records})")
                  break
      
              # Build request URL
              if next_url:
                  # Use next URL from pagination
                  url = next_url
              else:
                  # First request with time filtering
                  params = []
                  params.append(f"start_epoch={start_epoch}")
                  params.append(f"end_epoch={end_epoch}")
                  params.append(f"limit={min(page_size, max_records - len(records))}")
                  url = f"{endpoint}?{'&'.join(params)}"
      
              try:
                  response = http.request('GET', url, headers=headers)
      
                  # Handle rate limiting with exponential backoff
                  if response.status == 429:
                      retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
                      print(f"Rate limited (429). Retrying after {retry_after}s...")
                      time.sleep(retry_after)
                      backoff = min(backoff * 2, 30.0)
                      continue
      
                  backoff = 1.0
      
                  if response.status != 200:
                      print(f"HTTP Error: {response.status}")
                      response_text = response.data.decode('utf-8')
                      print(f"Response body: {response_text}")
                      return [], None
      
                  data = json.loads(response.data.decode('utf-8'))
      
                  # Extract results
                  page_results = data.get('indicators', [])
      
                  if not page_results:
                      print(f"No more results (empty page)")
                      break
      
                  print(f"Page {page_num}: Retrieved {len(page_results)} IOCs")
                  records.extend(page_results)
      
                  # Track newest event time
                  for ioc in page_results:
                      try:
                          # Extract last_updated timestamp
                          event_time = ioc.get('last_updated')
                          if event_time:
                              if newest_time is None or parse_datetime(event_time) > parse_datetime(newest_time):
                                  newest_time = event_time
                      except Exception as e:
                          print(f"Warning: Could not parse event time: {e}")
      
                  # Check for next page
                  next_url = data.get('next')
                  if not next_url:
                      print("No more pages (no next URL)")
                      break
      
              except Exception as e:
                  print(f"Error fetching IOCs: {e}")
                  return [], None
      
          print(f"Retrieved {len(records)} total records from {page_num} pages")
          return records, newest_time
      
    • requirements.txt:

      functions-framework==3.*
      google-cloud-storage==2.*
      urllib3>=2.0.0
      
  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 mandiant-ioc-collector-hourly (por exemplo, mandiant-ioc-collector-hourly)
    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 (por exemplo, mandiant-ioc-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 atualização de IOCs 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
    Diariamente 0 0 * * * Coleta de dados históricos

Testar a integração

  1. No console do Cloud Scheduler, encontre seu job (por exemplo, mandiant-ioc-collector-hourly).
  2. Clique em Forçar execução para acionar o job manualmente.
  3. Aguarde alguns segundos.
  4. Acesse Cloud Run > Serviços.
  5. Clique no nome da função (por exemplo, mandiant-ioc-collector).
  6. Clique na guia Registros.
  7. Verifique se a função foi executada com sucesso. Procure:

    Fetching IOCs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00
    Page 1: Retrieved X IOCs
    Wrote X records to gs://bucket-name/mandiant-ioc/iocs_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X records
    
  8. Acesse Cloud Storage > Buckets.

  9. Clique no nome do bucket (por exemplo, mandiant-ioc-logs).

  10. Navegue até a pasta de prefixo (por exemplo, mandiant-ioc/).

  11. Verifique se um novo arquivo .ndjson foi criado com o carimbo de data/hora atual.

Se você encontrar erros nos registros:

  • HTTP 401: verifique o ID e o secret da chave de API nas variáveis de ambiente
  • HTTP 403: verifique se a conta tem permissões de Threat Intelligence
  • HTTP 429: limitação de taxa. A função vai tentar de novo automaticamente com espera.
  • Variáveis de ambiente ausentes: verifique se todas as variáveis necessárias estão definidas.
  • Falha na solicitação de token: verifique se as credenciais da API estão corretas e não expiraram.

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, Mandiant Custom IOC).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione IOC personalizada do Mandiant como o Tipo de registro.
  7. Clique em Receber conta de serviço. Um e-mail exclusivo da conta de serviço será 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.

  9. Clique em Próxima.

  10. 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://mandiant-ioc-logs/mandiant-ioc/
      
      • Substitua:
        • mandiant-ioc-logs: o nome do bucket do GCS.
        • mandiant-ioc: prefixo/caminho da pasta onde os registros de IOC são armazenados.
    • 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 nos últimos dias. O padrão é 180 dias.

    • Namespace do recurso: o namespace do recurso

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

  11. Clique em Próxima.

  12. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Conceder permissões do IAM à conta de serviço do Google SecOps

A conta de serviço do Google SecOps precisa do papel Leitor de objetos do Storage no seu bucket do GCS.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (por exemplo, mandiant-ioc-logs).
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. Informe os seguintes detalhes de configuração:
    • Adicionar principais: 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.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
associated_hashes.value entity.file.md5 Valor de associated_hashes.value se hash.type == "md5", caso contrário, de value se type == "md5"
valor entity.file.md5
associated_hashes.value entity.file.sha1 Valor de associated_hashes.value se hash.type == "sha1", caso contrário, de value se type == "sha1"
valor entity.file.sha1
associated_hashes.value entity.file.sha256 Valor de associated_hashes.value se hash.type == "sha256", caso contrário, de value se type == "sha256"
valor entity.file.sha256
valor entity.hostname O valor é copiado diretamente se type == "fqdn"
valor entity.ip O valor é copiado diretamente se type == "ipv4"
threat_rating.threat_score entity.labels Objetos de rótulo mesclados com a chave "threat_score" e o valor de threat_rating.threat_score, a chave "mscore" e o valor de mscore, a chave "is_exclusive" e o valor de is_exclusive, a chave "is_publishable" e o valor de ispublishable, e para cada campo misp, a chave "misp" e o valor de misp.
mscore entity.labels
is_exclusive entity.labels
is_publishable entity.labels
misp.akamai entity.labels
misp.alexa entity.labels
misp.alexa_1M entity.labels
misp.amazon-aws entity.labels
misp.apple entity.labels
misp.automated-malware-analysis entity.labels
misp.bank-website entity.labels
misp.captive-portals entity.labels
misp.censys-scanning entity.labels
misp.cisco_1M entity.labels
misp.cisco_top1000 entity.labels
misp.cisco_top10k entity.labels
misp.cisco_top20k entity.labels
misp.cisco_top5k entity.labels
misp.cloudflare entity.labels
misp.common-contact-emails entity.labels
misp.common-ioc-false-positive entity.labels
misp.covid entity.labels
misp.covid-19-cyber-threat-coalition-whitelist entity.labels
misp.covid-19-krassi-whitelist entity.labels
misp.crl-hostname entity.labels
misp.crl-ip entity.labels
misp.dax30 entity.labels
misp.digitalside entity.labels
misp.disposable-email entity.labels
misp.dynamic-dns entity.labels
misp.eicar.com entity.labels
misp.empty-hashes entity.labels
misp.fastly entity.labels
misp.findip-host entity.labels
misp.google entity.labels
misp.google-chrome-crux-1million entity.labels
misp.google-gcp entity.labels
misp.google-gmail-sending-ips entity.labels
misp.googlebot entity.labels
misp.ipv6-linklocal entity.labels
misp.majestic_million entity.labels
misp.majestic_million_1M entity.labels
misp.microsoft entity.labels
misp.microsoft-attack-simulator entity.labels
misp.microsoft-azure entity.labels
misp.microsoft-azure-appid entity.labels
misp.microsoft-azure-china entity.labels
misp.microsoft-azure-germany entity.labels
misp.microsoft-azure-us-gov entity.labels
misp.microsoft-office365 entity.labels
misp.microsoft-office365-cn entity.labels
misp.microsoft-office365-ip entity.labels
misp.microsoft-win10-connection-endpoints entity.labels
misp.moz-top500 entity.labels
misp.mozilla-CA entity.labels
misp.mozilla-IntermediateCA entity.labels
misp.multicast entity.labels
misp.nioc-filehash entity.labels
misp.openai-gptbot entity.labels
misp.ovh-cluster entity.labels
misp.parking-domain entity.labels
misp.parking-domain-ns entity.labels
misp.phone_numbers entity.labels
misp.public-dns-hostname entity.labels
misp.public-dns-v4 entity.labels
misp.public-dns-v6 entity.labels
misp.public-ipfs-gateways entity.labels
misp.rfc1918 entity.labels
misp.rfc3849 entity.labels
misp.rfc5735 entity.labels
misp.rfc6598 entity.labels
misp.rfc6761 entity.labels
misp.second-level-tlds entity.labels
misp.security-provider-blogpost entity.labels
misp.sinkholes entity.labels
misp.smtp-receiving-ips entity.labels
misp.smtp-sending-ips entity.labels
misp.stackpath entity.labels
misp.tenable-cloud-ipv4 entity.labels
misp.tenable-cloud-ipv6 entity.labels
misp.ti-falsepositives entity.labels
misp.tlds entity.labels
misp.tranco entity.labels
misp.tranco10k entity.labels
misp.umbrella-blockpage-hostname entity.labels
misp.umbrella-blockpage-v4 entity.labels
misp.umbrella-blockpage-v6 entity.labels
misp.university_domains entity.labels
misp.url-shortener entity.labels
misp.vpn-ipv4 entity.labels
misp.vpn-ipv6 entity.labels
misp.whats-my-ip entity.labels
misp.wikimedia entity.labels
misp.zscaler entity.labels
valor entity.url O valor é copiado diretamente se type == "url"
last_seen event.ioc.active_timerange.end Data analisada de "last_seen" usando ISO8601
first_seen event.ioc.active_timerange.start Data analisada de first_seen usando ISO8601
sources.0.category event.ioc.categorization Unido da matriz sources.0.category com separador de vírgula
threat_rating.threat_score event.ioc.confidence_score Valor copiado diretamente
valor event.ioc.domain_and_ports.domain O valor é copiado diretamente se type == "fqdn"
event.ioc.feed_name event.ioc.feed_name Defina como "Mandiant".
valor event.ioc.ip_and_ports.ip_address Convertido para ipaddress se type == "ipv4"
tipo metadata.entity_type Definido como FILE se associated_hashes.type estiver em md5 sha1 sha256, DOMAIN_NAME se type == "fqdn", IP_ADDRESS se type == "ipv4", URL se type == "url", FILE se type estiver em md5 sha1 sha256, UNKNOWN_ENTITYTYPE caso contrário.
associated_hashes.type metadata.entity_type
custom_ioc_expire_date metadata.interval.end_time Data analisada de custom_ioc_expire_date usando ISO8601 se o tipo estiver em fqdn ipv4 url
first_seen metadata.interval.start_time Data analisada de "first_seen" usando ISO8601 ou UNIX
ID metadata.product_entity_id Valor copiado diretamente
threat_det metadata.threat Mesclado de threat_det
attributed_associations threat_det.associations Objetos merged threat_association de attributed_associations e associations, com campos definidos de association.id, name, type, region_code.country_or_region, associated_actors, alias, role, first_reference_time, last_reference_time, industries_affected
associações threat_det.associations
de alta fidelidade threat_det.campaigns Merged campaign.name from campaigns array
categoria threat_det.category_details Unido da matriz de categoria
threat_rating.confidence_level threat_det.confidence Definido como LOW_CONFIDENCE se corresponder a baixo, MEDIUM_CONFIDENCE se médio, HIGH_CONFIDENCE se alto, caso contrário, UNKNOWN_CONFIDENCE
threat_rating.confidence_score threat_det.confidence_details Valor de threat_rating.confidence_score convertido em string ou de mscore se threat_rating.confidence_score estiver vazio.
mscore threat_det.confidence_details
first_seen threat_det.first_discovered_time Data de "first_seen" se não estiver vazia, caso contrário, de "firstSeen", usando ISO8601 ou UNIX.
firstSeen threat_det.first_discovered_time
first_seen threat_det.last_updated_time Data analisada de "first_seen" usando ISO8601 ou UNIX
threat_rating.threat_score threat_det.risk_score Convertido para ponto flutuante de "threat_rating.threat_score" se não estiver vazio. Caso contrário, de "mscore".
mscore threat_det.risk_score
threat_rating.severity_level threat_det.severity Defina como LOW se for baixa, MEDIUM se for média, HIGH se for alta ou UNKNOWN_SEVERITY
threat_det.threat_feed_name threat_det.threat_feed_name Defina como "Mandiant".
valor threat_det.url_back_to_product Definido como "https://advantage.mandiant.com/search?query=%{value}" se o tipo for fqdn ipv4 url md5
verdict_simple.timestamp threat_det.verdict_info Mesclado de "verdict_info_simple" depois de definir "verdict_time" do carimbo de data/hora, "verdict_response" do veredito se for malicioso e "verdict_type" de "verdict_source".
verdict_simple.verdict threat_det.verdict_info
verdict_simple.verdict_source threat_det.verdict_info
metadata.product_name metadata.product_name Definido como "MANDIANT_CUSTOM_IOC"
metadata.vendor_name metadata.vendor_name Definido como "MANDIANT_CUSTOM_IOC"
threat.threat_feed_name Mandiant Mapeado do registro de mudanças
threat_rating.threat_score entity.entity.labels Mapeado do registro de mudanças
threat_rating.severity_level threat.severity Mapeado do registro de mudanças
threat_rating.confidence_level threat.confidence Mapeado do registro de mudanças
verdict_simple.timestamp verdict_info.verdict_time Mapeado do registro de mudanças
category threat.category_details Mapeado do registro de mudanças
threat_rating.confidence_score threat.confidence_details Mapeado do registro de mudanças
threat_rating.threat_score threat.risk_score Mapeado do registro de mudanças

Registro de alterações

Ver o registro de alterações deste analisador

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.