序言
使用威胁指标或可观察数据的组织会消费、创建和/或(理想情况下)发布威胁数据。这些数据可以在内部或外部用作信息或情报,为决策和事件优先级排序提供依据。
虽然有多种格式可以将此信息结构化,但事实上的行业标准是 结构化威胁信息表达 (STIX)。STIX 由 OASIS 网络威胁情报技术委员会管理,使组织能够以标准且机器可读的格式共享威胁数据。
在 Elastic,我们开发了 Elastic 通用模式 (ECS) 作为数据规范化能力。“[ECS] 是一种开源规范,在 Elastic 用户社区的支持下开发。ECS 定义了一组通用字段,用于在 Elasticsearch 中存储事件数据,例如日志和指标。”在 2023 年 4 月,Elastic 将 ECS 贡献给了 OpenTelemetry 语义约定 (OTel),以此承诺共同开发开放模式。
安全社区以 STIX 格式共享威胁数据,因此为了将这些数据存储在 Elasticsearch 中进行分析和威胁检测 [1] [2] [3] [4],我们创建了一个工具,将 STIX 文档转换为 ECS,并将威胁数据输出为文件或直接输出到 Elasticsearch 索引。如果这对我们来说是一个挑战,那么对其他人来说也是一个挑战 - 因此,我们决定发布该工具的一个版本。
此工具使用 Elastic License 2.0,可在此处下载 here。
入门
此项目将采用 STIX 2.x 格式的 JSON 文档,并创建 ECS 版本。有三个输出选项:以 JSON 格式输出到 STDOUT、NDJSON 文件和/或直接输出到 Elasticsearch 集群。
先决条件
STIX 2 ECS 项目需要 Python 3.10+ 以及 stix2、Elasticsearch 和 getpass 模块。
如果导出到 Elasticsearch,您将需要主机信息和身份验证凭据。API 身份验证尚未实现。
设置
创建一个虚拟环境并安装所需的先决条件。
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
操作
输入是 STIX 2.x JSON 文档(或 JSON 文档的文件夹);输出默认为 STDOUT,可以选择创建 NDJSON 文件和/或发送到 Elasticsearch 集群。
stix_to_ecs.py [-h] -i INPUT [-o OUTPUT] [-e] [--index INDEX] [--url URL] \
[--user USER] [-p PROVIDER] [-r]
默认情况下,ECS 文件与 STIX 文件输入同名,但附加了 .ecs.ndjson
。
参数
该脚本有几个参数,唯一强制字段是用于输入的 -i
。默认情况下,该脚本会将 NDJSON 文档输出到 STDOUT。
选项 | 描述 |
---|---|
-h | 显示帮助菜单 |
-i | 指定输入 STIX 文档(强制) |
-o | 指定输出 ECS 文档(可选) |
-p | 定义 ECS 提供程序字段(可选) |
-r | 递归模式,用于转换多个 STIX 文档(可选) |
-e | 指定 Elasticsearch 输出模式(可选) |
--index | 定义 Elasticsearch 索引,需要 -e (可选) |
--url | 定义 Elasticsearch URL,需要 -e (可选) |
--user | 定义 Elasticsearch 用户名,需要 -e (可选) |
示例
test-inputs/
目录中有两个示例文件。一个来自 CISA(网络安全和基础设施安全局),另一个来自 OpenCTI(一个开源威胁情报平台)。
STIX 文件输入到 STDOUT
这将以 ECS 格式将 STIX 文档输出到 STDOUT。
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"
}
}
}
},
...
STIX 文件输入到 ECS 文件输出
这将在当前目录中创建一个名为 ecs
的文件夹,并将 ECS 文件写入其中。
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"
}
}
}
}
...
STIX 文件输入到 ECS 文件输出,定义提供程序字段
提供程序字段通常是 STIX 文档中的 GUID。为了使其更加用户友好,您可以使用 -p
参数来定义 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"
}
}
}
}
...
STIX 目录输入到 ECS 文件输出
如果您有一个 STIX 文档目录,可以使用 -r
参数递归搜索该目录,并将 ECS 文档写入输出目录。
python stix_to_ecs.py -ri test-inputs -o ecs
STIX 文件输入到 Elasticsearch 输出
要输出到 Elasticsearch,可以使用 Elastic Cloud 或本地实例。本地 Elasticsearch 将使用端口 9200
,而 Elastic Cloud 将使用端口 443
。默认情况下,需要到 Elasticsearch 的有效 TLS 会话。
首先,如果您还没有索引,请创建一个索引。在此示例中,我们创建了一个名为 stix2ecs
的索引,但索引名称并不重要。
curl -u {username} -X PUT "https://elasticsearch:port/stix2ecs?pretty"
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "stix2ecs"
}
接下来,定义 Elasticsearch 输出选项。
python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -e --url https://elasticsearch:port --user username --index stix2ecs
如果您将数据存储在 Elasticsearch 中以供其他平台使用,可以使用 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"
}
}
}
}
}
...
如果您使用的是 Kibana,您可以为您的 stix2ecs
索引创建一个数据视图,以查看摄取的指标。
最后,您可以将其用作 指标匹配规则的指标来源。
总结
我们希望此项目能够帮助您的组织分析和运营化您的威胁数据。如果您不熟悉 Elastic 通用模式,您可以在 此处了解更多信息。
与往常一样,如果您有任何问题、意见、疑虑或投诉,请随时打开一个 issue。
关于 Elastic 安全实验室
Elastic 安全实验室是 Elastic 安全的威胁情报分支,致力于在威胁环境中创造积极的改变。Elastic 安全实验室提供有关新兴威胁的公开研究,分析战略、运营和战术对手目标,然后将这些研究与 Elastic 安全的内置检测和响应能力相结合。
在 Twitter 上关注 Elastic 安全实验室 @elasticseclabs,并在 www.elastic.co/security-labs/ 查看我们的研究。