Preâmbulo
Organizações que usam indicadores de ameaças ou observáveis consomem, criam e/ou (idealmente) publicam dados de ameaças. Esses dados podem ser usados interna ou externamente como informação ou inteligência para embasar a tomada de decisões e a priorização de eventos.
Embora existam vários formatos para estruturar essas informações, o padrão de fato da indústria é o Structured Threat Information Expression (STIX). O STIX é gerenciado pelo Comitê Técnico de Inteligência de Ameaças Cibernéticas do OASIS e permite que organizações compartilhem dados de ameaças em um formato padrão e legível por máquina.
Na Elastic, desenvolvemos o Elastic Common Schema (ECS) como um recurso de normalização de dados. “[ECS] é uma especificação de código aberto, desenvolvida com o suporte da comunidade de usuários do Elastic. O ECS define um conjunto comum de campos para armazenar dados de eventos no Elasticsearch, como logs e métricas.” Em abril de 2023, a Elastic contribuiu com o ECS para as Convenções Semânticas OpenTelemetry (OTel) como um compromisso com o desenvolvimento conjunto de um esquema aberto.
A comunidade de segurança compartilha dados de ameaças no formato STIX, então para armazenar esses dados no Elasticsearch para análise e detecção de ameaças [1] [2] [3] [4], criamos uma ferramenta que converte documentos STIX em ECS e gera os dados de ameaças como um arquivo ou diretamente em índices do Elasticsearch. Se isso foi um desafio para nós, foi um desafio para outros - por isso, decidimos lançar uma versão da ferramenta.
Esta ferramenta usa a Licença Elastic 2.0 e está disponível para download aqui.
Para começar
Este projeto pegará um documento JSON formatado em STIX 2.x e criará uma versão ECS. Há três opções de saída: STDOUT como JSON, um arquivo NDJSON e/ou diretamente para um cluster do Elasticsearch.
Pré-requisitos
O projeto STIX 2 ECS requer Python 3.10+ e os módulos stix2, Elasticsearch e getpass .
Ao exportar para o Elasticsearch, você precisará das informações do host e das credenciais de autenticação. A autenticação de API ainda não foi implementada.
Configuração
Crie um ambiente virtual e instale os pré-requisitos necessários.
git clone https://github.com/elastic/labs-releases.git
cd tools/stix2ecs
python -m venv /path/to/virtual/environments/stix2ecs
source /path/to/virtual/environments/stix2ecs/bin/activate
python -m pip install -r requirements.txt
Operação
A entrada é um documento JSON STIX 2.x (ou uma pasta de documentos JSON); a saída padrão é STDOUT, com uma opção para criar um arquivo NDJSON e/ou enviar para um cluster Elasticsearch.
stix_to_ecs.py [-h] -i INPUT [-o OUTPUT] [-e] [--index INDEX] [--url URL] \
[--user USER] [-p PROVIDER] [-r]
Por padrão, o arquivo ECS tem o mesmo nome da entrada do arquivo STIX, mas com .ecs.ndjson
anexado.
Arguments
O script tem vários argumentos, o único campo obrigatório é -i
para a entrada. Por padrão, o script emitirá o documento NDJSON para STDOUT.
Opção | Descrição |
---|---|
-h | exibe o menu de ajuda |
-i | especifica o documento STIX de entrada (obrigatório) |
-o | especifica o documento ECS de saída (opcional) |
-p | define o campo do provedor ECS (opcional) |
-r | modo recursivo para converter vários documentos STIX (opcional) |
-e | especifica o modo de saída do Elasticsearch (opcional) |
--index | define o Índice Elasticsearch, requer -e (opcional) |
--url | define a URL do Elasticsearch, requer -e (opcional) |
--usuário | define o nome de usuário do Elasticsearch, requer -e (opcional) |
Exemplos
Há dois arquivos de exemplo localizados no diretório test-inputs/
. Um é da CISA (Cybersecurity & Infrastructure Security Agency) e o outro é da OpenCTI (uma plataforma de inteligência de ameaças de código aberto).
Entrada de arquivo STIX para STDOUT
Isso gerará o documento STIX em STDOUT no formato ECS.
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json | jq
[
{
"threat": {
"indicator": {
"file": {
"name": "123.ps1",
"hash": {
"sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type": "file",
"description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen": "2023-11-21T18:57:25.000Z",
"provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
"modified_at": "2023-11-21T18:57:25.000Z",
"marking": {
"tlp": "clear"
}
}
}
},
...
Entrada de arquivo STIX para saída de arquivo ECS
Isso criará uma pasta chamada ecs
no diretório atual e gravará o arquivo ECS lá.
python python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs
cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
"threat": {
"indicator": {
"file": {
"name": "123.ps1",
"hash": {
"sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type": "file",
"description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen": "2023-11-21T18:57:25.000Z",
"provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
"modified_at": "2023-11-21T18:57:25.000Z",
"marking": {
"tlp": "clear"
}
}
}
}
...
Entrada de arquivo STIX para saída de arquivo ECS, definindo o campo Provedor
O campo do provedor é normalmente um GUID no documento STIX. Para torná-lo mais amigável, você pode usar o argumento -p
para definir o campo threat.indicator.provider
.
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs -p "Elastic Security Labs"
cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
"threat": {
"indicator": {
"file": {
"name": "123.ps1",
"hash": {
"sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type": "file",
"description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen": "2023-11-21T18:57:25.000Z",
"provider": "Elastic Security Labs",
"modified_at": "2023-11-21T18:57:25.000Z",
"marking": {
"tlp": "clear"
}
}
}
}
...
Entrada de diretório STIX para saídas de arquivo ECS
Se você tiver um diretório de documentos STIX, poderá usar o argumento -r
para pesquisar recursivamente no diretório e gravar os documentos ECS no diretório de saída.
python stix_to_ecs.py -ri test-inputs -o ecs
Entrada de arquivo STIX para saída do Elasticsearch
Para enviar para o Elasticsearch, você pode usar o Elastic Cloud ou uma instância local. O Elasticsearch local usará a porta 9200
e o Elastic Cloud usará a porta 443
. Por padrão, é necessária uma sessão TLS válida para o Elasticsearch.
Primeiro, crie um índice, caso ainda não tenha um. Neste exemplo, estamos criando um índice chamado stix2ecs
, mas o nome do índice não é relevante.
curl -u {username} -X PUT "https://elasticsearch:port/stix2ecs?pretty"
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "stix2ecs"
}
Em seguida, defina as opções de saída do Elasticsearch.
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -e --url https://elasticsearch:port --user username --index stix2ecs
Se você estiver armazenando os dados no Elasticsearch para uso em outra plataforma, poderá visualizar os indicadores usando cURL.
curl -u {username} https://elasticsearch:port/stix2ecs/_search?pretty
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "stix2ecs",
"_id" : "n2lt8IwBahlUtp0hzm9i",
"_score" : 1.0,
"_source" : {
"threat" : {
"indicator" : {
"file" : {
"name" : "123.ps1",
"hash" : {
"sha256" : "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
}
},
"type" : "file",
"description" : "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
"first_seen" : "2023-11-21T18:57:25.000Z",
"provider" : "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
"modified_at" : "2023-11-21T18:57:25.000Z",
"marking" : {
"tlp" : "clear"
}
}
}
}
}
...
Se estiver usando o Kibana, você pode criar uma Visualização de Dados para seu índice stix2ecs
para visualizar os indicadores ingeridos.
Por fim, você pode usar isso como uma fonte de indicadores para regras de correspondência de indicadores.
Resumo
Esperamos que este projeto ajude sua organização a analisar e operacionalizar seus dados de ameaças. Se você é novo no Elastic Common Schema, pode aprender mais sobre isso aqui.
Como sempre, sinta-se à vontade para abrir um problema com quaisquer perguntas, comentários, preocupações ou reclamações.
Sobre o Elastic Security Labs
O Elastic Security Labs é o braço de inteligência de ameaças da Elastic Security dedicado a criar mudanças positivas no cenário de ameaças. O Elastic Security Labs fornece pesquisas publicamente disponíveis sobre ameaças emergentes com uma análise dos objetivos estratégicos, operacionais e táticos do adversário e, em seguida, integra essa pesquisa com os recursos integrados de detecção e resposta do Elastic Security.
Siga o Elastic Security Labs no Twitter @elasticseclabs e confira nossa pesquisa em www.elastic.co/security-labs/.