
Uma ferramenta para avaliar a qualidade dos dados, construída sobre o incrível OSSEM.

Uma ferramenta para avaliar a qualidade dos dados, construída sobre o incrível projeto OSSEM.
O Power-up usa o Detection Data Model (DDM) do OSSEM como base para sua avaliação de qualidade de dados. A principal razão para isso é que ele fornece uma forma estruturada de correlacionar ATT&CK Data Sources, entidades do modelo de informação comum (CIM) e Data Dictionaries (eventos) entre si.
Para aqueles não familiarizados com a estrutura DDM, aqui está um exemplo:
Como pode ver, cada entrada no DDM define uma sub fonte de dados (escopo) usando entidades abstratas como processo, usuário, arquivo, etc. Cada uma dessas entradas também contém um ID de evento, onde o escopo se aplica. Você pode ler mais sobre essas entidades aqui.
Em suma, as entradas DDM desempenham um papel importante na remoção da complexidade dos eventos brutos, fornecendo um escopo que define como uma fonte de log (canais de dados) pode ser consumida.
O Power-up avalia a pontuação de qualidade dos dados de acordo com cinco dimensões distintas:
Cada dimensão é avaliada com uma pontuação entre 0 (nenhum) e 5 (excelente).
Essas dimensões estão vinculadas aos canais de dados e se propagam para todos os eventos fornecidos por eles.
Devido à natureza dessas dimensões, elas devem ser avaliadas manualmente, de acordo com as especificidades dos canais de dados.
O Power-up usa resources/dcs.yml para definir o canal de dados e avaliar as dimensões:
data channel: sysmon
description: sysmon monitoring
coverage: 2
timeliness: 5
retention: 2
---
data channel: security
description: windows security auditing
coverage: 5
timeliness: 5
retention: 2
Para calcular o quão completa é a estrutura do evento, o power-up compara os nomes padrão do dicionário de dados com os campos das entidades (CIM) referenciadas na entrada DDM (origem e destino).
Como nem todos os campos das entidades são relevantes (depende do contexto), o power-up usa o conceito de perfis para selecionar quais campos precisam corresponder aos nomes padrão do dicionário de dados. Por exemplo:
# OSSEM CIM Profile
process:
- process_name
- process_path
- process_command_line
Nota: Há um perfil de exemplo em
profiles/default.ymlpara você experimentar.
A pontuação de estrutura é calculada com a seguinte fórmula:
SCORE_PERCENT = (MATCHED_FIELDS / TOTAL_RELEVANT_FIELDS) * 100
Para maior clareza, aqui está um exemplo de como a pontuação de estrutura é calculada:

Nota: Como o dicionário de dados do Sysmon Event Id 1 corresponde a 100% dos campos de entidade relevantes, a pontuação de estrutura será avaliada como 5 (excelente).
A pontuação de estrutura é traduzida para a escala de 0 a 5 da seguinte forma:
| Porcentagem | Pontuação |
|---|
Nota: Dependendo do caso de uso (SIEM, Threat Hunting, Forense), você pode definir diferentes perfis para avaliar seus logs de forma diferente.
Para calcular a consistência, o power-up simplesmente calcula a porcentagem de campos com um nome padrão em um dicionário de dados. Dicionários de dados com um alto número de campos mapeados para um nome padrão têm maior probabilidade de se correlacionar com entidades CIM.
A pontuação de consistência é calculada com a seguinte fórmula:
SCORE_PERCENT = (STANDARD_NAME_FIELDS / TOTAL_FIELDS) * 100
A pontuação de consistência é traduzida para a escala de 0 a 5 da seguinte forma:
| Porcentagem | Pontuação |
|---|---|
| 0 | 0 |
| 1 a 50 | 1 |
| 51 a 99 | 3 |
| 100 | 5 |
pip install -r requirements.txt$> python3 powerup.py --help
_____ _____ _____ _____ _____ _____ _____ _ _ _ _____ _____ _____ _____ __
| | __| __| __| | | _ | | | | | __| __ |___| | | _ | |
| | |__ |__ | __| | | | | __| | | | | | __| -|___| | | __|__|
|_____|_____|_____|_____|_|_|_| |__| |_____|_____|_____|__|__| |_____|__| |__|
usage: powerup.py [-h] [-o OSSEM] [-y OSSEM_YAML] [-p PROFILE] [--excel]
[--elastic] [--yaml]
A tool to assess ATT&CK data source coverage, built on top of awesome OSSEM.
optional arguments:
-h, --help show this help message and exit
-o OSSEM, --ossem OSSEM
path to import OSSEM markdown
-y OSSEM_YAML, --ossem-yaml OSSEM_YAML
path to import OSSEM yaml
-p PROFILE, --profile PROFILE
path to CIM profile
--excel export OSSEM DDM to excel
--elastic export OSSEM data models to elastic
--yaml export OSSEM data models to yaml
--layer export OSSEM data models to navigator layer
Como pode ver, o power-up pode consumir dados OSSEM de dois formatos diferentes:
Atualmente, o Power-up exporta a saída OSSEM para:
output/output/Nota: se nenhum caminho de arquivo de perfil for especificado, o power-up usa
profiles/default.ymlpor padrão.
$> python3 powerup.py -o ../OSSEM --yaml
_____ _____ _____ _____ _____ _____ _____ _ _ _ _____ _____ _____ _____ __
| | __| __| __| | | _ | | | | | __| __ |___| | | _ | |
| | |__ |__ | __| | | | | __| | | | | | __| -|___| | | __|__|
|_____|_____|_____|_____|_|_|_| |__| |_____|_____|_____|__|__| |_____|__| |__|
[*] Profile path: profiles/default.yml
[*] Parsing OSSEM from markdown
[*] Exporting OSSEM to YAML
[*] Created output/ddm_20191114_160246.yml
[*] Created output/cim_20191114_160246.yml
[*] Created output/dds_20191114_160246.yml
O objetivo de exportar/importar para/de YAML é facilitar a personalização do OSSEM. É provável que a primeira coisa que você faça seja criar seus próprios dicionários de dados e depois adicionar novas entradas DDM, então o YAML tornará as atualizações mais fáceis.
Nota 1: modifique
resources/config.ymlpara instruir o power-up sobre os nomes dos arquivos para as estruturas corretas. Depois, basta colocá-los em uma pasta e passar para o argumento OSSEM_YAML.
Nota 2: o power-up não analisa todos os objetos OSSEM para YAML, apenas os campos de dados e alguns metadados (por exemplo, descrição). A razão para isso é que eu queria manter o objeto YAML o mais enxuto possível, apenas com os dados necessários para avaliar a qualidade dos dados.
$> python3 powerup.py -o ../OSSEM --excel
_____ _____ _____ _____ _____ _____ _____ _ _ _ _____ _____ _____ _____ __
| | __| __| __| | | _ | | | | | __| __ |___| | | _ | |
| | |__ |__ | __| | | | | __| | | | | | __| -|___| | | __|__|
|_____|_____|_____|_____|_|_|_| |__| |_____|_____|_____|__|__| |_____|__| |__|
[*] Profile path: profiles/default.yml
[*] Parsing OSSEM from markdown
[*] Exporting OSSEM DDM to Excel
[*] Saved Excel to output/ddm_enriched_20191114_160041.xlsx
Ao exportar para Excel, o power-up criará um DDM visualmente atraente, com as respectivas dimensões de qualidade dos dados para cada entrada:

$> python3 powerup.py -o ../OSSEM --elastic
_____ _____ _____ _____ _____ _____ _____ _ _ _ _____ _____ _____ _____ __
| | __| __| __| | | _ | | | | | __| __ |___| | | _ | |
| | |__ |__ | __| | | | | __| | | | | | __| -|___| | | __|__|
|_____|_____|_____|_____|_|_|_| |__| |_____|_____|_____|__|__| |_____|__| |__|
[*] Profile path: profiles/default.yml
[*] Parsing OSSEM from markdown
[*] Exporting OSSEM to Elastic
[*] Creating elastic index ossem.ddm
[*] Creating elastic index ossem.cim
[*] Creating elastic index ossem.dds
[*] Creating elastic index ossem.dcs
Ao exportar para Elastic, o power-up armazenará todos os dados OSSEM no elastic. Como o DDM também é enriquecido com as respectivas dimensões de qualidade dos dados, você poderá criar painéis como este:

$> python3 powerup.py -o ../OSSEM --layer
_____ _____ _____ _____ _____ _____ _____ _ _ _ _____ _____ _____ _____ __
| | __| __| __| | | _ | | | | | __| __ |___| | | _ | |
| | |__ |__ | __| | | | | __| | | | | | __| -|___| | | __|__|
|_____|_____|_____|_____|_|_|_| |__| |_____|_____|_____|__|__| |_____|__| |__|
[*] Profile path: profiles/default.yml
[*] Parsing OSSEM from markdown
[*] Exporting OSSEM to Naviagator Layer
[*] Pulling ATT&CK data
[*] Generating data source quality layer
[*] Created output/ds_layer_20191119_220141.json
Ao exportar para camada, o power-up criará um arquivo JSON de camada do Attack Navigator, com as respectivas dimensões de qualidade dos dados para cada técnica:

Nota: as pontuações das técnicas são derivadas das pontuações médias das fontes de dados no DDM.
| Fonte de Dados ATT&CK | Sub Fonte de Dados | Objeto de Dados de Origem | Relacionamento | Objeto de Dados de Destino | EventID |
|---|
| Process monitoring | process creation | process | created | process | 4688 |
| Process monitoring | process creation | process | created | process | 1 |
| Process monitoring | process termination | process | terminated | - | 4689 |
| Process monitoring | process termination | process | terminated | - | 5 |
| Dimensão | Tipo | Descrição |
|---|
| Cobertura | Canal de dados | Quantos dispositivos ou segmentos de rede são cobertos pelo canal de dados |
| Oportunidade | Canal de dados | Quanto tempo leva para o evento estar disponível |
| Retenção | Canal de dados | Quanto tempo o evento permanece disponível |
| Estrutura | Evento | Quão completo é o evento, se campos relevantes estão disponíveis |
| Consistência | Evento | Quão padronizados são os campos do evento, se os campos foram normalizados |
| 0 | 0 |
| 1 a 25 | 1 |
| 26 a 50 | 2 |
| 51 a 75 | 3 |
| 76 a 99 | 4 |
| 100 | 5 |