06 - TAXII 2.1 em Profundidade
video: https://youtu.be/... no frontmatter da nota.TAXII 2.1 em Profundidade
Nota 06 do capítulo 22, que aprofunda o protocolo de transporte da inteligência estruturada compartilhada em STIX.
O foco é o ciclo operacional de consumo e publicação sobre TAXII 2.1: serviços, autenticação, filtros, paginamento e diferenças em relação à 2.0.
Dialoga com a nota de STIX 2.1 desta mesma seção, que define os objetos transportados, e com as notas de MISP e OpenCTI da biblioteca.
1. Contexto e Posicionamento na Biblioteca
O STIX 2.1 define o que se compartilha; o TAXII (Trusted Automated eXchange of Intelligence Information) define como se compartilha. A especificação do OASIS descreve um protocolo de aplicação sobre HTTPS, com serviços de descoberta, catálogo de coleções e troca de objetos, e é o contrato que permite a uma organização consumir inteligência de um ISAC, de um fornecedor comercial e de um parceiro governamental com o mesmo cliente. Esta nota desce ao nível de operação: endpoints, cabeçalhos, autenticação, paginamento e filtros, o vocabulário exato que quem implementa conectores de ingestão precisa dominar.
A nota é o complemento direto da de STIX 2.1 desta seção, e fecha o conjunto iniciado no capítulo 02, onde o compartilhamento apareceu no nível de ecossistema, e no controle PLT.3 da seção 15, onde o par STIX-TAXII aparece como controle de plataforma. O objetivo prático é que o leitor saia daqui capaz de consumir uma coleção real com curl até dominar o ciclo completo, de publicar objetos numa coleção própria e de avaliar um servidor TAXII na hora de escolher fontes.
2. O Modelo de Serviços do TAXII 2.1
O TAXII 2.1 é pequeno de propósito: cinco recursos principais e verbos HTTP padrão. A descoberta acontece no endpoint de discovery, que informa os api-roots disponíveis; cada api-root hospeda collections, cada collection carrega objects e manifest; e o servidor publica metadados descritivos em cada nível. O cliente autentica, descobre, lista coleções e então consome ou publica objetos. A tabela abaixo resume os endpoints canônicos e seu papel no ciclo.
| Recurso | Caminho canônico | Papel |
|---|---|---|
| Discovery | /taxii2/ | Ponto de entrada que lista api-roots e contatos |
| API Root | /{api-root}/ | Área de trabalho lógica com título, descrição e versões suportadas |
| Collections | /{api-root}/collections/ | Catálogo de coleções acessíveis com permissões declaradas |
| Collection | /{api-root}/collections/{id}/ | Detalhe de uma coleção, com media types e modos de escrita |
| Objects | /{api-root}/collections/{id}/objects/ | Leitura, filtre e publicação de objetos STIX |
| Manifest | /{api-root}/collections/{id}/manifest/ | Lista de metadados dos objetos sem o conteúdo completo |
| Object versions | /{api-root}/collections/{id}/objects/{obj-id}/versions/ | Versões de um objeto específico |
O envelope de resposta é o envelope TAXII, um JSON com três chaves: more, next e objects. A propriedade more indica que há mais resultados, next traz o token de continuação e objects carrega os objetos STIX completos. O mesmo envelope serve para objects e para manifest, e o cliente que não trata more e next recebe apenas a primeira página silenciosamente, o que é a causa clássica de ingestões parcialmente sincronizadas que ninguém percebe por semanas.
3. Tipos de Troca: Feed, Coleção e Push
O TAXII 2.1 simplificou o modelo de interação da 2.0 em dois padrões de uso, e a nomenclatura de mercado ainda usa o vocabulário mais amplo. No padrão de consumo, o cliente consulta periodicamente a coleção com filtros incrementais, o chamado feed de inteligência, e sincroniza objetos novos ou alterados. No padrão de publicação, o produtor empurra objetos para a coleção usando o método POST no endpoint de objects, o que na 2.1 substituiu formalmente o serviço de inbox da 2.0. A direção da troca é decisão do servidor: coleções podem ser somente leitura para o cliente, somente escrita, ou leitura e escrita, e as permissões são declaradas no recurso da coleção.
A cadência do consumo incremental é o detalhe que separa ingestão profissional de script de fim de semana. O parâmetro added_after, consultado com o carimbo da última sincronização bem-sucedida, devolve apenas objetos adicionados depois daquele momento, e o cliente guarda esse carimbo como parte do estado da sincronização, junto com a política de recuperação em caso de falha. Cadências típicas de mercado variam de cinco minutos para fontes de alta prioridade a uma hora para fontes agregadoras, e a escolha deve considerar a janela de utilidade dos indicadores consumidos, tema que o capítulo de ciclo de vida de IOCs da biblioteca já aprofundou.
4. Autenticação, TLS e Media Types
Todo tráfego TAXII 2.1 circula sobre HTTPS, e a autenticação recomendada pela especificação é OAuth 2.0, com HTTP Basic permitido para compatibilidade e reservado a ambientes controlados. Na prática de mercado, o Basic com TLS é comum em ISACs e comunidades fechadas, enquanto fornecedores comerciais operam OAuth com tokens de longa vida e rotação programada. A identidade do cliente define as coleções visíveis, e a granularidade de permissão por coleção é o mecanismo que permite a um servidor servir comunidades distintas com dados segregados.
Os media types fazem parte do contrato e merecem atenção do implementador: o conteúdo TAXII usa application/taxii+json;version=2.1, e o conteúdo STIX puro usa application/stix+json;version=2.1. O cabeçalho Accept do cliente deve declarar a versão, porque servidores em transição podem servir múltiplas versões da especificação, e o parâmetro match[spec_version] no filtro refina a escolha por objeto. Erros de media type produzem respostas 406 ou 415 que confundem quem trata todo erro como falha de rede, e a checagem de cabeçalhos é o primeiro passo de depuração.
5. Paginamento e Filtros
O paginamento usa os parâmetros next e limit, e o algoritmo correto é iterativo: consulte com limit, leia more e next do envelope, repita com o token até more ser falso. O parâmetro limit tem limite máximo definido pelo servidor, e respeitar o valor declarado no api-root evita respostas truncadas. Os filtros de consulta são poucos e poderosos, e a tabela abaixo resume os combináveis no consumo diário.
| Parâmetro | Função | Uso típico |
|---|---|---|
| added_after | Retorna apenas objetos adicionados após o carimbo | Sincronização incremental |
| match[id] | Filtra por identificadores STIX específicos | Busca de objetos conhecidos |
| match[type] | Filtra por tipos de objeto STIX | Consumir apenas indicators e malware |
| match[spec_version] | Filtra por versão da especificação STIX | Ambientes em transição entre 2.0 e 2.1 |
| limit | Define o tamanho da página | Controle de volume por requisição |
| next | Token de continuação da página anterior | Trilha do paginamento iterativo |
A combinação padrão de consumo incremental é added_after com limit e tratamento de more, e a disciplina de registro importa tanto quanto a consulta: o cliente deve persistir o carimbo da sincronização só após a página final confirmada, porque interromper no meio do paginamento e gravar o carimbo gera lacuna silenciosa no inventário de inteligência. Para auditoria, o manifest é o instrumento de reconciliação barato: comparar o manifest da coleção com o inventário local revela lacunas e objetos órfãos sem baixar conteúdo completo.
6. Ciclo de Consumo via curl e Publicação
O ciclo completo de consumo cabe em quatro chamadas, e o exemplo a seguir mostra a sequência realista contra um servidor de referência, com autenticação por token no cabeçalho.
# 1. Descoberta: lista api-roots disponiveis
curl -s -H "Accept: application/taxii+json;version=2.1" \
-H "Authorization: Bearer $TOKEN" https://taxii.isac.org.br/taxii2/
# 2. Catalogo de colecoes do api-root
curl -s -H "Accept: application/taxii+json;version=2.1" \
-H "Authorization: Bearer $TOKEN" https://taxii.isac.org.br/api/v21/collections/
# 3. Consumo incremental com filtro e paginamento
curl -s -G -H "Accept: application/taxii+json;version=2.1" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "added_after=2026-02-03T10:00:00.000Z" \
--data-urlencode "match[type]=indicator" \
--data-urlencode "limit=50" \
https://taxii.isac.org.br/api/v21/collections/2d1a4b6e-f2a1-4c8b-9d3e-5f7a8b9c0d1e/objects/
# 4. Reconciliacao via manifest sem baixar conteudo completo
curl -s -G -H "Accept: application/taxii+json;version=2.1" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "added_after=2026-02-03T10:00:00.000Z" \
https://taxii.isac.org.br/api/v21/collections/2d1a4b6e-f2a1-4c8b-9d3e-5f7a8b9c0d1e/manifest/
A resposta da etapa 3 traz o envelope com a página de indicadores, e o trecho a seguir mostra a forma do envelope com um objeto resumido, seguido do ciclo de publicação, em que o produtor empurra objetos novos para a coleção da comunidade.
{
"more": true,
"next": "eyJhZGRlZF9hZnRlciI6IjIwMjYtMDItMDNUMTA6MDA6MDAuMDAwWiJ9",
"objects": [
{
"type": "indicator",
"spec_version": "2.1",
"id": "indicator--e5f6a7b8-0000-4000-8000-000000000005",
"created": "2026-02-04T09:12:00.000Z",
"modified": "2026-02-04T09:12:00.000Z",
"name": "Dominio de portal falso",
"pattern": "[domain-name:value = 'portal-banco-seguro.com']",
"pattern_type": "stix",
"valid_from": "2026-02-01T00:00:00.000Z",
"valid_until": "2026-05-01T00:00:00.000Z"
}
]
}
# Publicacao: produtor empurra bundle de objetos novos para a colecao
curl -s -X POST -H "Accept: application/taxii+json;version=2.1" \
-H "Content-Type: application/taxii+json;version=2.1" \
-H "Authorization: Bearer $TOKEN_PRODUTOR" \
--data @bundle-campanha-fevereiro.json \
https://taxii.isac.org.br/api/v21/collections/9e3f2a41-7c8d-4b5e-a1f0-2d3c4b5a6e7f/objects/
A resposta da publicação é um envelope que ecoa os IDs aceitos, e o produtor deve tratar falhas parciais com a mesma seriedade das falhas totais: objeto rejeitado por validação de schema, por data inválida ou por política da coleção precisa voltar à fila de correção, e a publicação que ignora rejeições parciais fabrica lacunas na coleção da comunidade. O ciclo se fecha com a leitura de confirmação: o produtor consulta o manifest da própria coleção e compara com o que enviou, replicando para si a reconciliação que exige dos consumidores.
7. Diferenças entre TAXII 2.0 e 2.1
A migração da 2.0 para a 2.1 removeu mecanismos e simplificou o modelo, e quem opera servidores das duas versões precisa do mapa das diferenças. A tabela abaixo resume as mudanças com impacto operacional direto.
| Aspecto | TAXII 2.0 | TAXII 2.1 |
|---|---|---|
| Push de objetos | Serviço de inbox dedicado em canais | POST no endpoint de objects da coleção |
| Canais | Existentes, com semântica de publicação em massa | Removidos do modelo |
| Filtro por versão de STIX | Ausente | match[spec_version] e versão declarada nos media types |
| Objetos transportados | STIX 2.0, sem SCO de primeira classe | STIX 2.1, com SCOs e relacionamentos ricos |
| Media types | application/taxii+json;version=2.0 | application/taxii+json;version=2.1 |
| Detalhe por objeto | Sem endpoint dedicado | Endpoint de versões por objeto |
O efeito prático das mudanças é a redução de infraestrutura necessária para operar troca bidirecional. Na 2.0, um parceiro que publicava precisava de inbox configurado de cada destinatário ou de canal compartilhado, e essa fricção era a causa mais comum de integrações paradas; na 2.1, a publicação é uma chamada autenticada à coleção do destinatário, e a governança passa a morar nas permissões da coleção. Para consumidores, o ganho central é o filtro por spec_version, que permite operar transições de formato sem quebrar ingestões, tema relevante porque comunidades reais convivem com produtores em ritmos de migração diferentes.
8. Erros Comuns e Pontos de Atenção
- Ignorar more e next no paginamento: cliente que consome só a primeira página sincroniza frações da coleção sem erro aparente; o laço de paginamento completo é obrigatório.
- Gravar o carimbo de added_after antes do fim da sincronização: falha no meio do laço gera lacuna silenciosa; o carimbo só persiste após a última página confirmada.
- Tratar erro de media type como falha de rede: 406 e 415 indicam negociação de conteúdo errada; verificar Accept e a versão declarada é o primeiro passo da depuração.
- Usar HTTP Basic fora de TLS ou em ambiente aberto: a credencial circula em cada chamada, e a especificação recomenda OAuth 2.0 exatamente por isso.
- Publicar sem tratar rejeições parciais: envelope de resposta com IDs recusados é falha de publicação que precisa de fila de correção, não de log ignorado.
- Consumir sem reconciliar com o manifest: lacunas e objetos perdidos só aparecem em auditoria quando o manifest é comparado com o inventário local em cadência regular.
- Misturar credenciais de leitura e escrita: cliente de consumo não precisa de permissão de publicação, e a segregação de tokens é o guardrail que impede vazamento de escrita.
9. Integração com o Restante da Biblioteca
As conexões estruturais desta nota com o restante da biblioteca seguem quatro caminhos:
- Capítulo 02: o compartilhamento por ISACs e o pipeline de coleta são o contexto, e a avaliação de qualidade de fonte se aplica diretamente à escolha de coleções.
- Capítulo 22: o STIX 2.1 define os objetos transportados, e o MISP e o OpenCTI da biblioteca operam como produtores e consumidores TAXII em implementações reais.
- Seção 15: o controle PLT.3 formaliza o par STIX-TAXII como controle de plataforma, e o grupo MET mede a efetividade da inteligência ingerida por coleção.
- Capítulo 03: o ciclo de vida de IOCs consumido via TAXII alimenta as regras de expiração e a pontuação de qualidade aplicadas na chegada.
A métrica que avalia o consumo é a proporção de objetos ingeridos que passam validação, deduplicação e entram em uso nas detecções, medida por coleção, e ela transforma a escolha de fontes em decisão baseada em dados. A segunda métrica, derivada da sincronização incremental, é a idade média dos objetos no momento da ingestão, porque inteligência que chega velha custa o mesmo da que chega fresca e vale muito menos; a cadência de consulta e a qualidade do servidor são as variáveis sob seu controle, e esta nota é o manual técnico de ambas.