
一个基于优秀的 OSSEM 项目构建的数据质量评估工具。
Power-up 使用 OSSEM 检测数据模型(DDM)作为其数据质量评估的基础。主要原因是它提供了一种结构化的方式,将 ATT&CK 数据源、通用信息模型实体(CIM)和 数据字典(事件)相互关联起来。
对于那些不熟悉 DDM 结构的人,这里有一个示例:
| ATT&CK 数据源 | 子数据源 | 源数据对象 | 关系 | 目标数据对象 | EventID |
|---|---|---|---|---|---|
| 进程监控 | 进程创建 | process | created | process | 4688 |
| 进程监控 | 进程创建 | process | created | process | 1 |
| 进程监控 | 进程终止 | process | terminated | - | 4689 |
| 进程监控 | 进程终止 | process | terminated | - | 5 |
如你所见,DDM 中的每个条目都使用抽象实体(如 process、user、file 等)定义了一个子数据源(范围)。每个条目还包含一个事件 ID,该 ID 对应范围适用的场景。你可以在此处阅读关于这些实体的更多信息。
简而言之,DDM 条目通过提供一个定义日志源(数据通道)如何被消费的 范围,在消除原始事件复杂性方面发挥着重要作用。
Power-up 根据五个不同的维度评估数据质量分数:
每个维度评分范围从 0(无)到 5(优秀)。
这些维度与数据通道绑定,并传播到由该通道提供的所有事件。
由于这些维度的性质,必须根据数据通道的具体情况手动评分。
Power-up 使用 resources/dcs.yml 定义数据通道并对维度进行评分:
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
为了计算事件结构的完整性,power-up 将数据字典的标准名称与 DDM 条目(源和目标)中引用的实体(CIM)的字段进行比较。
因为并非所有实体字段都是相关的(取决于上下文),power-up 使用配置文件的概念来选择哪些字段需要与数据字典的标准名称匹配。例如:
# OSSEM CIM Profile
process:
- process_name
- process_path
- process_command_line
注意:
profiles/default.yml中有一个示例配置文件供你测试使用。
结构性分数的计算公式如下:
SCORE_PERCENT = (MATCHED_FIELDS / TOTAL_RELEVANT_FIELDS) * 100
为了更清晰,这里有一个如何计算结构性分数的示例:

注意:由于 Sysmon Event Id 1 的数据字典与相关实体字段 100% 匹配,因此结构性分数将评为 5(优秀)。
结构性分数按以下方式转换为 0-5 范围:
| 百分比 | 分数 |
|---|
注意:根据用例(SIEM、威胁狩猎、取证),你可以定义不同的配置文件,以便以不同的方式评估你的日志。
为了计算一致性,power-up 简单地计算数据字典中具有标准名称的字段的百分比。具有较高数量字段映射到标准名称的数据字典更有可能与 CIM 实体关联。
一致性分数的计算公式如下:
SCORE_PERCENT = (STANDARD_NAME_FIELDS / TOTAL_FIELDS) * 100
一致性分数按以下方式转换为 0-5 范围:
| 百分比 | 分数 |
|---|---|
| 0 | 0 |
| 1 到 50 | 1 |
| 51 到 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
如你所见,power-up 可以从两种不同的格式消费 OSSEM 数据:
目前,Power-up 将 OSSEM 输出导出到:
output/ 文件夹中创建 OSSEM 结构的 yaml 文件output/ 文件夹中注意:如果未指定配置文件路径,power-up 默认使用
profiles/default.yml。
$> 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
导出/导入为 YAML 的目的是为了方便 OSSEM 自定义。很可能你首先要做的是创建自己的数据字典,然后添加新的 DDM 条目,因此 YAML 将使更新更容易。
注意1: 修改
resources/config.yml来指示 power-up 正确结构的文件名。然后你只需将它们放入一个文件夹,并传递给 OSSEM_YAML 参数。
注意2: power-up 不会将整个 OSSEM 对象解析为 YAML,只解析数据字段和一些元数据(例如描述)。这样做的原因是希望保持 YAML 对象尽可能精简,只包含评估数据质量所需的数据。
$> 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
当导出为 Excel 时,power-up 将创建一个美观的 DDM 表,其中包含每个条目的相应数据质量维度:

$> 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
当导出为 Elastic 时,power-up 会将所有 OSSEM 数据存储在 elastic 中。由于 DDM 也附带了相应的数据质量维度,你将能够创建如下所示的仪表板:

$> 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
当导出为 layer 时,power-up 将创建一个 ATT&CK Navigator Layer JSON 文件,其中包含每个技术的相应数据质量维度:

注意:技术分数来源于 DDM 中数据源的平均分数。
| 维度 | 类型 | 描述 |
|---|
| 覆盖面 | 数据通道 | 数据通道覆盖了多少设备或网络段 |
| 时效性 | 数据通道 | 事件变得可用需要多长时间 |
| 保留期 | 数据通道 | 事件保持可用多长时间 |
| 结构性 | 事件 | 事件的完整性如何,相关字段是否可用 |
| 一致性 | 事件 | 事件字段的标准化程度如何,字段是否已规范化 |
| 0 | 0 |
| 1 到 25 | 1 |
| 26 到 50 | 2 |
| 51 到 75 | 3 |
| 76 到 99 | 4 |
| 100 | 5 |