Coletar registros de inteligência de ameaças do ESET

Compatível com:

Este documento explica como ingerir registros de inteligência de ameaças da ESET no Google Security Operations usando o Google Cloud Storage V2, uma função do Cloud Run e o Cloud Scheduler.

A ESET Threat Intelligence (ETI) oferece informações com base em evidências e conselhos práticos sobre ameaças atuais ou emergentes. Os serviços de ETI avisam sobre softwares ou atividades maliciosas que podem ameaçar sua organização ou os clientes dela. O serviço fornece dados de inteligência de ameaças por feeds TAXII 2.1 no formato STIX 2.1, incluindo IoC de APT, C&C e destinos de botnet, domínios, IPs, URLs, arquivos, URLs de phishing, ransomware e ameaças do Android maliciosos.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps
  • Um projeto do Google Cloud com as seguintes APIs ativadas:
    • API Cloud Storage
    • API Funções do Cloud Run
    • API Cloud Scheduler
    • API Cloud Pub/Sub
  • Permissões para criar e gerenciar buckets do Google Cloud Storage, funções do Cloud Run, tópicos do Pub/Sub e jobs do Cloud Scheduler
  • Permissões para gerenciar políticas do IAM em buckets do Google Cloud Storage
  • Uma assinatura ativa do ESET Threat Intelligence
  • Acesso ao portal de inteligência de ameaças da ESET em https://eti.eset.com

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, eset-ti-logs.
    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.

Coletar credenciais do TAXII de inteligência de ameaças da ESET

Para permitir que a função do Cloud Run recupere dados de inteligência de ameaças, ative os feeds do TAXII e gere credenciais do TAXII no portal da ETI.

Ativar feeds TAXII

  1. Faça login no portal do ESET Threat Intelligence em https://eti.eset.com.
  2. Acesse Feeds de dados no menu principal.
  3. Clique no ícone de três pontos ao lado do feed de dados que você quer ativar.
  4. Selecione Ativar feed.
  5. Repita as etapas 3 e 4 para cada feed que você quer ingerir no Google SecOps.

Gerar credenciais do TAXII

  1. No portal ESET Threat Intelligence, acesse Configurações de administrador > Credenciais de acesso.
  2. Clique em Gerar credenciais do TAXII.
  3. Na caixa de diálogo exibida, copie e salve os seguintes valores:

    • Nome de usuário: seu nome de usuário do TAXII
    • Senha: sua senha do TAXII

Registrar detalhes do feed TAXII

Depois de ativar os feeds e gerar as credenciais, registre as seguintes informações para cada feed que você quer ingerir:

  1. No portal de inteligência de ameaças da ESET, acesse Feeds de dados.
  2. Clique no ícone de três pontos ao lado de um feed ativado.
  3. Selecione Mostrar detalhes do feed de dados.
  4. No painel lateral, observe os seguintes valores:

    • Nome do feed TAXII: o identificador do feed (por exemplo, botnet stix 2.1)
    • ID do TAXII 2: o ID da coleção (por exemplo, 0abb06690b0b47e49cd7794396b76b20)
    • URL do feed TAXII 2: o URL completo da coleção.

Feeds do TAXII disponíveis

  • A ESET Threat Intelligence oferece os seguintes feeds do TAXII 2.1:

    Nome do feed Nome do feed TAXII Código da coleção
    Feed de ladrões de informações do Android androidinfostealer stix 2.1 9ee501cde0c44d6db4ae995fead1a7c8
    Feed de ameaças do Android androidthreats stix 2.1 daf3de8fab144552a1cb5af054ed07ee
    IoC de APT apt stix 2.1 97e3eb74ae5f46dd9e22f677a6938ee7
    Feed de botnet botnet stix 2.1 0abb06690b0b47e49cd7794396b76b20
    Botnet - C&C botnet.cc stix 2.1 d1923a526e8f400dbb301259240ee3d5
    Botnet - Meta botnet.target stix 2.1 61b6e4f9153e411ca7a9982a2c6ae788
    Feed de golpes de criptomoedas cryptoscam stix 2.1 2c183ce9551a43338c6cc2ed7c2a704d
    Feed de domínio domain stix 2.1 a34aa0a4f9de419582a883863503f9c4
    Feed de IoC de eCrime ecrime stix 2.1 08059376eac84ec4a076cfd682493f91
    Feed de IP ip stix 2.1 baaed2a92335418aa753fe944e13c23a
    Anexos de e-mail maliciosos emailattachments stix 2.1 c0d56cf7f81d482eb97fd46beaa4bae0
    Feed de arquivos maliciosos arquivo stix 2.1 ee6a153ed77e4ec3ab21e76cc2074b9f
    Feed de URL de phishing phishingurl stix 2.1 d0a6c0f962dd4dd2b3eeb96b18612584
    Feed de arquivos de adware de PUA puaadware stix 2.1 d1bfc81202fc4c6599326771ec2da41d
    Feed de arquivos de apps de uso duplo de PUA puadualapps stix 2.1 970a7d0039ac4668addf058cd9feb953
    Feed de ransomware ransomware stix 2.1 8d3490d688ce4a989aee9af5c680d8bf
    Feed de URLs de golpes scamurl stix 2.1 2130adc3c67c43f9a3664b187931375e
    Feed de smishing smishing stix 2.1 330ad7d0c736476babe5e49077b96c95
    Feed de golpes por SMS smsscam stix 2.1 6e20217a2e1246b8ab11be29f759f716
    Feed de URL url stix 2.1 1d3208c143be49da8130f5a66fd3a0fa

Criar uma conta de serviço para a função do Cloud Run

  1. No console do Google Cloud, 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 eset-ti-collector
    • Descrição da conta de serviço: insira Service account for ESET Threat Intelligence Cloud Run function to write STIX objects to GCS
  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 um papel, pesquise e selecione Administrador de objetos do Storage.
    2. Clique em Adicionar outro papel, pesquise e selecione Invocador do Cloud Run.
  6. Clique em Continuar.

  7. Clique em Concluído.

Conceder permissões do IAM no bucket do Google Cloud Storage

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (por exemplo, eset-ti-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, eset-ti-collector@PROJECT_ID.iam.gserviceaccount.com).
    • Atribuir papéis: selecione Administrador de objetos do Storage.
  6. Clique em Salvar.

Criar tópico Pub/Sub

O tópico do Pub/Sub aciona a função do Cloud Run quando uma mensagem é publicada pelo Cloud Scheduler.

  1. No console do Google Cloud, acesse Pub/Sub > Tópicos.
  2. Clique em Criar tópico.
  3. Informe os seguintes detalhes de configuração:
    • ID do tópico: insira eset-ti-trigger
    • Adicionar uma assinatura padrão: deixe selecionado
  4. Clique em Criar.

Criar a função do Cloud Run

  1. No console do Google Cloud, acesse Funções do Cloud Run.
  2. Clique em Criar função.
  3. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Ambiente 2ª geração
    Nome da função eset-ti-collector
    Região Selecione a mesma região do seu bucket do GCS.
    Tipo de gatilho Cloud Pub/Sub
    Tópico do Pub/Sub eset-ti-trigger
    Memória alocada 512 MiB
    Tempo limite 540 segundos
    Conta de serviço do ambiente de execução eset-ti-collector
  4. Clique em Próxima.

  5. Defina Ambiente de execução como Python 3.12.

  6. Defina o Ponto de entrada como main.

  7. No arquivo requirements.txt, adicione as seguintes dependências:

    functions-framework==3.*
    google-cloud-storage==2.*
    urllib3==2.*
    
  8. No arquivo main.py, cole o seguinte código:

    import functions_framework
    import json
    import os
    import logging
    import time
    import urllib3
    from datetime import datetime, timedelta, timezone
    from google.cloud import storage
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    HTTP = urllib3.PoolManager(retries=False)
    storage_client = storage.Client()
    
    API_ROOT = "https://taxii.eset.com/taxii2/643f4eb5-f8b7-46a3-a606-6d61d5ce223a"
    TAXII_CONTENT_TYPE = "application/taxii+json;version=2.1"
    
    def _load_state(bucket_name: str, state_key: str, lookback_hours: int) -> str:
        """Return ISO8601 checkpoint (UTC)."""
        try:
            bucket = storage_client.bucket(bucket_name)
            blob = bucket.blob(state_key)
            if blob.exists():
                state_data = blob.download_as_text()
                state = json.loads(state_data)
                ts = state.get("last_poll_time")
                if ts:
                    logger.info(f"Loaded state: {ts}")
                    return ts
        except Exception as e:
            logger.warning(f"State read error: {e}")
        default_ts = (
            datetime.now(timezone.utc) - timedelta(hours=lookback_hours)
        ).strftime("%Y-%m-%dT%H:%M:%S.000Z")
        logger.info(f"No previous state found, using lookback: {default_ts}")
        return default_ts
    
    def _save_state(bucket_name: str, state_key: str, ts: str) -> None:
        """Persist the checkpoint to GCS."""
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(state_key)
        blob.upload_from_string(
            json.dumps({"last_poll_time": ts}),
            content_type="application/json",
        )
        logger.info(f"Saved state: {ts}")
    
    def _fetch_objects(
        username: str,
        password: str,
        collection_id: str,
        added_after: str,
        max_records: int,
    ) -> list:
        """Query TAXII 2.1 collection objects with pagination."""
        url = f"{API_ROOT}/collections/{collection_id}/objects/"
        headers = urllib3.make_headers(basic_auth=f"{username}:{password}")
        headers["Accept"] = TAXII_CONTENT_TYPE
        headers["User-Agent"] = "Chronicle-ESET-TI-GCS/1.0"
    
        all_objects = []
        params = {"added_after": added_after}
    
        while True:
            qs = "&".join(f"{k}={v}" for k, v in params.items())
            request_url = f"{url}?{qs}" if qs else url
    
            for attempt in range(3):
                try:
                    resp = HTTP.request("GET", request_url, headers=headers)
                    break
                except Exception as e:
                    wait = 2 ** (attempt + 1)
                    logger.warning(f"Request error: {e}, retrying in {wait}s")
                    time.sleep(wait)
            else:
                raise RuntimeError("Exceeded retry budget for TAXII API")
    
            if resp.status == 401:
                raise RuntimeError("Authentication failed: check TAXII credentials")
            if resp.status == 404:
                raise RuntimeError(
                    f"Collection not found: {collection_id}"
                )
            if resp.status not in (200, 206):
                raise RuntimeError(
                    f"TAXII API error {resp.status}: {resp.data[:500]}"
                )
    
            body = json.loads(resp.data.decode("utf-8"))
            objects = body.get("objects", [])
            all_objects.extend(objects)
            logger.info(
                f"Fetched {len(objects)} objects (total: {len(all_objects)})"
            )
    
            if len(all_objects) >= max_records:
                logger.info(f"Reached max_records limit: {max_records}")
                all_objects = all_objects[:max_records]
                break
    
            more = body.get("more", False)
            next_param = body.get("next")
            if more and next_param:
                params = {"added_after": added_after, "next": next_param}
            else:
                break
    
        return all_objects
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """Cloud Run function entry point triggered by Pub/Sub."""
        bucket_name = os.environ["GCS_BUCKET"]
        prefix = os.environ.get("GCS_PREFIX", "eset-ti")
        state_key = os.environ.get("STATE_KEY", "eset-ti/state.json")
        username = os.environ["TAXII_USERNAME"]
        password = os.environ["TAXII_PASSWORD"]
        collection_id = os.environ["COLLECTION_ID"]
        max_records = int(os.environ.get("MAX_RECORDS", "10000"))
        lookback_hours = int(os.environ.get("LOOKBACK_HOURS", "48"))
    
        try:
            last_poll = _load_state(bucket_name, state_key, lookback_hours)
            objects = _fetch_objects(
                username, password, collection_id, last_poll, max_records
            )
    
            if not objects:
                logger.info("No new STIX objects found")
                return "No new objects", 200
    
            now_str = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
            blob_path = (
                f"{prefix}/eset_ti_{collection_id}_{now_str}.json"
            )
            ndjson_body = "\n".join(
                json.dumps(obj, separators=(",", ":")) for obj in objects
            )
    
            bucket = storage_client.bucket(bucket_name)
            blob = bucket.blob(blob_path)
            blob.upload_from_string(
                ndjson_body, content_type="application/x-ndjson"
            )
    
            new_poll_time = datetime.now(timezone.utc).strftime(
                "%Y-%m-%dT%H:%M:%S.000Z"
            )
            _save_state(bucket_name, state_key, new_poll_time)
    
            msg = (
                f"Wrote {len(objects)} STIX objects to "
                f"gs://{bucket_name}/{blob_path}"
            )
            logger.info(msg)
            return msg, 200
    
        except Exception as e:
            logger.error(f"Error collecting ESET TI: {e}")
            raise
    
  9. Clique em Implantar.

  10. Aguarde a implantação da função. O status muda para uma marca de seleção verde quando a implantação é concluída.

Configure as variáveis de ambiente

  1. Depois que a função for implantada, acesse Funções do Cloud Run > eset-ti-collector.
  2. Clique em Editar e implantar nova revisão.
  3. Clique na guia Variáveis e secrets ou expanda Ambiente de execução, build, conexões e configurações de segurança para a 1ª geração.
  4. Adicione as seguintes variáveis de ambiente:

    Chave Valor de exemplo
    GCS_BUCKET eset-ti-logs
    GCS_PREFIX eset-ti
    STATE_KEY eset-ti/state.json
    TAXII_USERNAME Seu nome de usuário do TAXII no portal da ETI
    TAXII_PASSWORD Sua senha do TAXII no portal da ETI
    COLLECTION_ID 0abb06690b0b47e49cd7794396b76b20
    MAX_RECORDS 10000
    LOOKBACK_HOURS 48
  5. Clique em Implantar.

Criar o job do Cloud Scheduler

O Cloud Scheduler publica uma mensagem no tópico do Pub/Sub de acordo com uma programação, acionando a função do Cloud Run para pesquisar novos objetos STIX na ESET Threat Intelligence.

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

    Configuração Valor
    Nome eset-ti-poll
    Região Selecione a mesma região da função.
    Frequência 0 */1 * * * (a cada hora)
    Fuso horário Selecione seu fuso horário (por exemplo, UTC).
  4. Clique em Continuar.

  5. Na seção Configurar a execução:

    • Tipo de destino: selecione Pub/Sub.
    • Tema: selecione eset-ti-trigger
    • Corpo da mensagem: insira {"poll": true}.
  6. Clique em Criar.

Verificar a função do Cloud Run

  1. No Cloud Scheduler, localize o job eset-ti-poll.
  2. Clique em Forçar execução para acionar uma execução imediata.
  3. Acesse Funções do Cloud Run > eset-ti-collector > Registros.
  4. Verifique se a função foi executada com sucesso conferindo entradas de registro como:

    Fetched 250 objects (total: 250)
    Wrote 250 STIX objects to gs://eset-ti-logs/eset-ti/eset_ti_0abb06690b0b47e49cd7794396b76b20_20250115_103000.json
    
  5. Acesse Cloud Storage > Buckets > eset-ti-logs.

  6. Navegue até o prefixo eset-ti/.

  7. Verifique se os arquivos NDJSON estão sendo criados com objetos STIX.

Recuperar a conta de serviço do Google SecOps e configurar o feed

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, ESET Threat Intelligence - Botnet).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione ESET Threat Intelligence 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://eset-ti-logs/eset-ti/
      
    • 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 (por exemplo, ESET_IOC).

  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 Google Cloud Storage.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (por exemplo, eset-ti-logs).
  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.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
quando metadata.event_timestamp Carimbo de data/hora em que o evento ocorreu
metadata.event_type Tipo de evento (por exemplo, USER_LOGIN, NETWORK_CONNECTION)
ID da mensagem metadata.id Identificador exclusivo do evento
protocolo network.ip_protocol Protocolo IP (por exemplo, TCP, UDP)
deviceName principal.hostname Nome do host de origem
srcAddr principal.ip Endereço IP de origem da conexão.
srcPort principal.port Número da porta de origem
ação security_result.action Ação realizada pelo produto de segurança (por exemplo, ALLOW, BLOCK)
dstAddr target.ip Endereço IP de destino
dstPort target.port Número da porta de destino
metadata.product_name Nome do produto
metadata.vendor_name Nome do fornecedor/empresa

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