Catálogo de fontes
Esta página descreve as nove fontes de enriquecimento disponíveis hoje. A lista não é fixa no código do console, a tela em Enriquece → Enriquecimento → Catálogo sempre reflete exatamente o que a sua instalação tem registrado, então use GET /api/collectors/enrichment/enrichers (ou a própria tela) como fonte da verdade se este texto ficar desatualizado.
Tabela do cliente (chave exata), table_exact
| Modo | por evento |
| Egresso | nenhum |
| Tipos de chave | ip, domain, url, file_hash, cve, mac, user, container_id |
| Requer configuração externa? | Não |
Casa a chave do evento contra a sua própria tabela, por igualdade exata. É o enricher genérico: como você define os campos da tabela livremente, ele serve para qualquer contexto que você já tenha em planilha ou export de outro sistema, usuário → departamento, hostname → dono, hash → veredito interno, CVE → prioridade de patch da sua empresa.
Os campos que ele devolve são exatamente os que você colocou em cada linha da tabela, não há uma lista fixa.
Tabela do cliente (CIDR, prefixo mais específico), table_cidr
| Modo | por evento |
| Egresso | nenhum |
| Tipos de chave | ip |
| Requer configuração externa? | Não |
Casa um IP contra a sua tabela de faixas de rede (CIDR), sempre pelo prefixo mais específico. Se a tabela tem 10.0.0.0/16 e 10.0.5.0/24, um evento com IP 10.0.5.7 recebe o resultado do /24, não o do /16. É a fonte certa para plano de endereçamento corporativo, inventário de rede exportado de uma ferramenta de gestão, ou listas de bloqueio distribuídas em CIDR.
Veja o passo a passo completo em Como enriquecer um evento.
GeoIP / ASN (MaxMind), geoip
| Modo | por evento |
| Egresso | nenhum |
| Tipos de chave | ip |
| Requer configuração externa? | Sim, uma base .mmdb montada no worker |
País, cidade, coordenadas e ASN a partir de uma base MaxMind (GeoLite2-City, GeoLite2-Country ou GeoLite2-ASN, gratuitas com conta; ou as GeoIP2 comerciais). Não faz rede nenhuma: o arquivo é aberto por mmap e a consulta custa microssegundos, por isso é a fonte certa para alimentar a detecção em voo (_centralops.enrichment.geo.country_iso ne "BR" é uma regra válida).
A licença da MaxMind não permite redistribuir o arquivo. Baixe-o com a sua conta, monte o diretório no worker (ENRICH_GEOIP_DIR, padrão /var/lib/centralops/geoip) e, na fonte, informe só o nome do arquivo (file: GeoLite2-City.mmdb) e o kind (city, country ou asn). Um caminho com diretório é recusado. Para cidade e ASN no mesmo evento, crie duas fontes, uma por base.
| Campo | Descrição |
|---|---|
country_iso / country_name / continent_code | País (city, country) |
city / subdivision / subdivision_iso | Cidade e estado (city) |
latitude / longitude / accuracy_radius_km | Coordenadas aproximadas (city) |
timezone | Fuso IANA (city) |
asn / asn_org | Autonomous System e sua organização (asn) |
TAXII 2.1, taxii
TAXII 2.1 é padrão OASIS, e MISP, OpenCTI, Anomali, ThreatConnect e EclecticIQ falam todos ele. Se a sua plataforma expõe uma coleção TAXII, este enricher a consome sem precisar de conector específico. Suporte a STIX/TAXII 2.1 é critério de avaliação padrão de TIP no mercado.
| Modo | por evento |
| Egresso | interno (buscamos a lista; nada do seu ambiente sai) |
| Tipos de chave | ip, domain, url, file_hash, mac |
| Requer configuração externa? | Sim, URL do servidor, id da coleção e credencial |
Baixa periodicamente uma coleção TAXII e a materializa como tabela local. Por rodar por evento, alimenta as regras de detecção em pipeline.
Quando usar este em vez do conector do OpenCTI: sempre que a plataforma não for OpenCTI, ou quando você quiser evitar acoplamento à API interna dele. O conector do OpenCTI fala GraphQL, que é a API deles e mudou de schema entre 5.x e 6.x. Em compensação, ele traz campos próprios (score do OpenCTI, marcações TLP resolvidas) que o TAXII entrega de forma menos completa, porque as dependências dentro do bundle nem sempre vêm resolvidas.
Campos que devolve:
| Campo | Descrição |
|---|---|
kind | Tipo de chave normalizado |
stix_id | Id do Indicator STIX |
indicator_name | Nome do indicador |
confidence | Confiança 0 a 100 |
valid_from / valid_until | Janela de validade |
kill_chain_phases | Fases, ex.: command-and-control |
labels | Rótulos STIX, ex.: malicious-activity |
has_markings | Há marcação (TLP) a respeitar |
created / modified | Datas do objeto STIX |
source | Sempre "taxii" |
Configuração:
| Campo | Obrigatório | O que é |
|---|---|---|
url | Sim | Só o endereço base, ex.: https://tip.exemplo |
api_root | Não (padrão /taxii2/) | Caminho da api-root. Varia por plataforma (/taxii2/, /api/v21/) |
collection | Sim | Id da coleção a consumir |
auth_mode | Não (padrão bearer) | bearer, basic ou none. O padrão OASIS sugere basic; plataformas comerciais costumam usar bearer |
username | Só para basic | O usuário. A senha é a credencial da fonte |
min_confidence | Não (padrão 0) | Piso de confiança do indicador |
page_size / max_pages | Não | Paginação e teto por carga |
url e api_root são campos separadosO guard de egresso do projeto recusa URL com caminho, de propósito, e é ele que aplica a allowlist de host e CIDR. Como a api-root do TAXII sempre tem caminho, juntar os dois exigiria afrouxar o guard justamente no campo que viaja com a credencial no header Authorization. Separados, a base passa pela allowlist e o caminho é validado à parte.
O que é descartado na carga, e por quê:
- Indicador revogado ou fora da validade. Intel vencida é a maior fonte de falso positivo num feed, e filtrar aqui evita depender de alguém lembrar de escrever a condição em toda regra nova. Cada descarte é contado por motivo (
expired,revoked,low_confidence,unsupported_pattern) no registro de carga da aba Execução e na métricacollector_enrich_indicators_skipped_total; e um indicador que vence depois da carga deixa de casar no ato (reason="expired_at_lookup"), sem esperar a próxima carga. - Indicador abaixo do
min_confidence. - Padrão STIX composto (
AND/OR). Casar um evento contra ele exigiria avaliar a expressão inteira; avaliar só o primeiro termo daria hit errado em silêncio. - Objetos que não são
indicator. O filtromatch[type]=indicatorroda no servidor, então malware, campanhas e relacionamentos nem trafegam.
OpenCTI, opencti
Este enricher precisa saber o endereço da sua instância e ter uma credencial. Isso é uma fonte configurada: crie uma em Enriquecimento → Fontes, e depois a regra da política só cita o nome dela. A credencial vai uma única vez, o servidor a cifra, e nem a API nem a tela a devolvem, o que você vê depois é só "credencial cadastrada".
| Modo | por evento |
| Egresso | interno (a instância é sua) |
| Tipos de chave | ip, domain, url, file_hash, mac |
| Requer configuração externa? | Sim. URL da sua instância + token de API |
Sincroniza periodicamente os indicadores (observáveis) da sua instância própria do OpenCTI para uma tabela local, e casa a chave do evento contra ela. Por rodar por evento, o resultado alimenta as regras de detecção em pipeline, diferente de uma consulta remota, que chegaria tarde demais para isso. Como a instância é sua, nenhum dado do seu ambiente sai para fora.
Campos que devolve:
| Campo | Descrição |
|---|---|
score | Score do OpenCTI (0 a 100) |
entity_type | Tipo do observável (IPv4-Addr, Domain-Name, StixFile, ...) |
kind | Tipo de chave normalizado (ip, domain, url, file_hash, mac) |
opencti_id | Id interno do observável no OpenCTI |
created_at / updated_at | Datas de criação e última atualização |
markings | Marcações TLP/PAP |
labels | Rótulos atribuídos no OpenCTI |
created_by | Quem reportou o indicador (o feed ou o analista) |
source | Sempre "opencti", indica de onde veio o dado |
Configuração:
| Campo | Obrigatório | O que é |
|---|---|---|
url | Sim | Endereço base da sua instância, ex.: https://opencti.interno |
preset | Não (padrão ip) | O que buscar. Veja a tabela abaixo |
page_size | Não (padrão 500) | Itens por página ao sincronizar |
max_pages | Não (padrão 40) | Teto de páginas por atualização. Protege contra uma instância muito grande drenar o ciclo inteiro |
min_score | Não (padrão 0) | Só traz indicadores com score igual ou acima deste valor |
A credencial não aparece aqui: ela é um campo próprio da fonte configurada, não da configuração.
Escolha o preset pelo tipo de indicador
O preset filtra no servidor do OpenCTI. Uma tabela de IP não baixa hashes e URLs para descartar depois, o que muda bastante o tempo de sincronização numa base grande.
| Preset | Traz |
|---|---|
ip | IPv4-Addr e IPv6-Addr |
domain | Domain-Name e Hostname |
url | Url |
file_hash | StixFile e Artifact (SHA-256, MD5, ...) |
mac | Mac-Addr |
all_observables | Todos os tipos acima numa tabela só |
indicators | Indicadores STIX em vez de observáveis. Veja abaixo |
O preset indicators é o que muda o jogo
Um observável responde "esse IP está na base". Um indicador responde "esse IP é C2 conhecido, ativo, com confiança 80". A diferença aparece em quatro campos extras:
| Campo | Por que importa |
|---|---|
valid_until e revoked | Indicador expirado ou revogado é descartado na carga, e o descarte é contado por motivo no registro de carga. Um indicador que vence depois da carga deixa de casar no ato (expired_at_lookup). Intel vencida é a maior fonte de falso positivo em feed de threat intel: sem esse corte, o alerta dispara por um IP que foi C2 há dois anos e hoje pertence a uma CDN |
confidence | Separa o que um analista marcou como confiável do que entrou por importação automática |
detection | O indicador foi marcado como acionável para detecção |
kill_chain_phases | A fase (command-and-control, delivery, exfiltration). É o que transforma um hit em contexto acionável no SIEM |
Indicadores com padrão STIX composto (AND/OR) são pulados de propósito: casar um evento contra eles exigiria avaliar a expressão inteira, e uma avaliação parcial daria hit errado em silêncio.
O schema GraphQL do OpenCTI mudou entre as versões 5.x e 6.x. Se a sincronização não trouxer nada, esse é o primeiro lugar a checar. O campo query na configuração aceita uma query própria, que é a saída para instâncias divergentes.
VirusTotal, virustotal
Como o OpenCTI, este enricher exige credencial. Crie uma fonte configurada em Enriquecimento → Fontes com a sua chave de API; a regra depois cita só o nome dela. A chave sobe uma única vez e é cifrada pelo servidor, a API nunca a devolve.
| Modo | por lote |
| Egresso | envia a terceiro |
| Tipos de chave | ip, domain, file_hash |
| Requer configuração externa? | Sim, chave de API |
Consulta a reputação de um indicador na API v3 do VirusTotal. Por rodar por lote, o resultado chega ao evento antes de ele ser roteado, mas não alimenta as regras de detecção em pipeline, que já rodaram por evento antes desse enriquecimento acontecer.
Campos que devolve:
| Campo | Descrição |
|---|---|
malicious / suspicious / harmless / undetected | Quantas engines classificaram o indicador em cada categoria |
total_engines | Total de engines que responderam |
malicious_ratio | malicious / total_engines, de 0.0 a 1.0 |
reputation | Score de reputação da comunidade VirusTotal |
last_analysis_date | Data (epoch) da última análise |
tags | Tags atribuídas pelo VirusTotal |
source | Sempre "virustotal" |
Configuração:
| Campo | Obrigatório | O que é |
|---|---|---|
key_kind | Não (padrão ip) | ip, domain ou file_hash. Uma instância do enricher resolve um tipo por vez |
max_keys_per_batch | Não (padrão 25) | Teto de indicadores consultados por lote |
A chave de API não aparece na tabela porque não é configuração: é o campo Credencial da fonte, que sobe uma vez e o servidor cifra.
Sem um when restritivo na regra, um lote de 200 eventos com indicadores distintos consome a cota diária de uma chave gratuita em segundos. Restrinja a regra para consultar só o que precisa, por exemplo apenas indicadores que uma regra anterior já marcou como desconhecido.
O gate when é avaliado antes da chamada, então o que ele barra não sai da sua infraestrutura nem gasta cota.
Toda consulta ao VirusTotal envia um indicador do seu ambiente (um IP, um hash) para fora. Confirme que isso é aceitável para o tipo de dado antes de habilitar.
AbuseIPDB, abuseipdb
Exige chave de API. Crie a fonte configurada com a chave; a regra cita só o nome dela.
| Modo | por lote |
| Egresso | envia a terceiro |
| Tipos de chave | ip |
| Requer configuração externa? | Sim, chave de API (plano gratuito: 1.000 consultas/dia) |
Reputação de IP por relatos da comunidade: abuse_confidence_score (0–100), quantos relatos e de quantos usuários, a última data, e o contexto de rede (ISP, tipo de uso, país, Tor). IPs privados, loopback e link-local nunca saem para o provedor.
MISS tem semântica: a API responde para qualquer IP público, inclusive um sem nenhum relato. Um IP sem relatos, ou com score abaixo de min_confidence_score, é tratado como não encontrado — assim o negative caching funciona e a regra só casa o que interessa. Para "qualquer relato", deixe min_confidence_score em 0; para "provável abuso", use 75.
| Campo | Descrição |
|---|---|
abuse_confidence_score | Confiança de abuso, 0 a 100 |
total_reports / num_distinct_users | Relatos na janela e usuários distintos |
last_reported_at | Último relato (ISO) |
country_code / usage_type / isp / domain / hostnames | Contexto de rede |
is_tor / is_whitelisted | Nó Tor; allowlist do provedor |
source | Sempre "abuseipdb" |
Configuração: max_age_days (padrão 90), min_confidence_score (padrão 0), max_keys_per_batch (padrão 25), requests_per_minute (60) e requests_per_day (1.000, o plano gratuito). Com N workers usando a mesma chave, divida as cotas por N.
AlienVault OTX, otx
Exige chave de API (gratuita). Uma instância resolve um tipo de chave por vez: crie uma fonte por tipo se precisar de IP e domínio.
| Modo | por lote |
| Egresso | envia a terceiro |
| Tipos de chave | ip, domain, file_hash, url |
| Requer configuração externa? | Sim, chave de API |
Pulses da comunidade OTX que citam o indicador: quantos, os nomes mais recentes, adversário, famílias de malware, tags e setores; mais reputation e se o OTX considera o indicador benigno (whitelisted, com as fontes em validation). MISS = nenhum pulse; um indicador que aparece só na allowlist do OTX também é MISS, para que uma regra "casou pulse" nunca dispare por ele.
| Campo | Descrição |
|---|---|
pulse_count / pulses | Quantos pulses e os nomes (até max_pulses) |
tags / adversaries / malware_families / industries | União do que os pulses declaram |
first_seen / last_seen | Pulse mais antigo e modificação mais recente |
reputation | Reputação OTX |
whitelisted / validation | O OTX considera benigno; fontes da allowlist |
source | Sempre "otx" |
Configuração: key_kind (padrão ip), max_pulses (5), max_keys_per_batch (25), requests_per_minute (60). URLs são escapadas no caminho; IPv6 é detectado pelo valor.
GreyNoise, greynoise
| Modo | por lote |
| Egresso | envia a terceiro |
| Tipos de chave | ip |
| Requer configuração externa? | Opcional no plano community (sem chave, ~50/dia; com chave gratuita, ~100/dia); obrigatória no enterprise |
O enricher de redução de ruído: noise = o IP está escaneando a internet inteira (não é tráfego dirigido a você); riot = é um serviço legítimo conhecido (CDN, DNS público, atualização de SO). Os dois são motivo para não acordar o analista, e por isso o GreyNoise costuma ser a primeira regra da política, marcando o evento com uma tag que as regras seguintes usam no when para pular a consulta cara.
tier: community usa /v3/community/<ip>; tier: enterprise usa /v2/noise/context/<ip> e devolve também actor, tags de comportamento, CVEs exploradas, VPN/bot/spoofable, ASN, país e organização. MISS = o GreyNoise nunca viu o IP, que é informação: tráfego dirigido, não ruído. Por isso o negative TTL é curto (1 h).
| Campo | Descrição |
|---|---|
noise / riot / classification | Ruído de internet; serviço conhecido; benign/malicious/unknown |
name / link | Serviço (riot) ou actor (enterprise); página no GreyNoise |
first_seen / last_seen | Observações |
tags / cve / vpn / bot / spoofable | Comportamento (enterprise) |
country_code / asn / organization | Rede (enterprise) |
tier / source | De onde veio; sempre "greynoise" |
Configuração: tier (padrão community), max_keys_per_batch (25), requests_per_minute (10), requests_per_day (100). No enterprise, suba as cotas para o seu plano.
A cota é respeitada antes da requisição: o que passa do limite fica sem enriquecimento neste ciclo e é reperguntado no próximo, nunca gravado como "limpo". Um 429 trava o lote pelo Retry-After do provedor e abre o breaker da fonte; credencial recusada aparece como erro de autenticação no registro de atividade, não como "nada casou". IPs privados nunca saem da sua infraestrutura.
Próximos passos
- Ainda não configurou nada? Comece por Como enriquecer um evento.
- Quer entender os conceitos primeiro? Veja O que é o enriquecimento.