Coletar registros de inteligência de ameaças do ESET
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.
- 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, 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 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
- Faça login no portal do ESET Threat Intelligence em https://eti.eset.com.
- Acesse Feeds de dados no menu principal.
- Clique no ícone de três pontos ao lado do feed de dados que você quer ativar.
- Selecione Ativar feed.
Repita as etapas 3 e 4 para cada feed que você quer ingerir no Google SecOps.
Gerar credenciais do TAXII
- No portal ESET Threat Intelligence, acesse Configurações de administrador > Credenciais de acesso.
- Clique em Gerar credenciais do TAXII.
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:
- No portal de inteligência de ameaças da ESET, acesse Feeds de dados.
- Clique no ícone de três pontos ao lado de um feed ativado.
- Selecione Mostrar detalhes do feed de dados.
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.
- Nome do feed TAXII: o identificador do feed (por exemplo,
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
- No console do Google Cloud, 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
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
- 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 um papel, pesquise e selecione Administrador de objetos do Storage.
- Clique em Adicionar outro papel, pesquise e selecione Invocador do Cloud Run.
Clique em Continuar.
Clique em Concluído.
Conceder permissões do IAM no bucket do Google Cloud Storage
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
eset-ti-logs). - 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,
eset-ti-collector@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
O tópico do Pub/Sub aciona a função do Cloud Run quando uma mensagem é publicada pelo Cloud Scheduler.
- No console do Google Cloud, acesse Pub/Sub > Tópicos.
- Clique em Criar tópico.
- Informe os seguintes detalhes de configuração:
- ID do tópico: insira
eset-ti-trigger - Adicionar uma assinatura padrão: deixe selecionado
- ID do tópico: insira
- Clique em Criar.
Criar a função do Cloud Run
- No console do Google Cloud, acesse Funções do Cloud Run.
- Clique em Criar função.
Informe os seguintes detalhes de configuração:
Configuração Valor Ambiente 2ª geração Nome da função eset-ti-collectorRegião Selecione a mesma região do seu bucket do GCS. Tipo de gatilho Cloud Pub/Sub Tópico do Pub/Sub eset-ti-triggerMemória alocada 512 MiB Tempo limite 540 segundos Conta de serviço do ambiente de execução eset-ti-collectorClique em Próxima.
Defina Ambiente de execução como Python 3.12.
Defina o Ponto de entrada como
main.No arquivo
requirements.txt, adicione as seguintes dependências:functions-framework==3.* google-cloud-storage==2.* urllib3==2.*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}") raiseClique em Implantar.
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
- Depois que a função for implantada, acesse Funções do Cloud Run > eset-ti-collector.
- Clique em Editar e implantar nova revisão.
- 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.
Adicione as seguintes variáveis de ambiente:
Chave Valor de exemplo GCS_BUCKETeset-ti-logsGCS_PREFIXeset-tiSTATE_KEYeset-ti/state.jsonTAXII_USERNAMESeu nome de usuário do TAXII no portal da ETI TAXII_PASSWORDSua senha do TAXII no portal da ETI COLLECTION_ID0abb06690b0b47e49cd7794396b76b20MAX_RECORDS10000LOOKBACK_HOURS48Clique 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.
- No console do Google Cloud, acesse o Cloud Scheduler.
- Clique em Criar job.
Informe os seguintes detalhes de configuração:
Configuração Valor Nome eset-ti-pollRegiã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).Clique em Continuar.
Na seção Configurar a execução:
- Tipo de destino: selecione Pub/Sub.
- Tema: selecione
eset-ti-trigger - Corpo da mensagem: insira
{"poll": true}.
Clique em Criar.
Verificar a função do Cloud Run
- No Cloud Scheduler, localize o job
eset-ti-poll. - Clique em Forçar execução para acionar uma execução imediata.
- Acesse Funções do Cloud Run > eset-ti-collector > Registros.
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.jsonAcesse Cloud Storage > Buckets > eset-ti-logs.
Navegue até o prefixo
eset-ti/.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
- 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,
ESET Threat Intelligence - Botnet). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione ESET Threat Intelligence como o Tipo de registro.
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.comCopie esse endereço de e-mail para usar na próxima etapa.
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://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).
Clique em Próxima.
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.
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
eset-ti-logs). - 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.
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.