前言
使用威胁指标或可观察数据的组织会使用、创建和/或(理想情况下)发布威胁数据。 这些数据可在内部或外部用作信息或情报,为决策和事件优先级排序提供参考。
虽然这些信息有多种结构化格式,但事实上的行业标准是结构化威胁信息表达 (STIX) 。 STIX 由OASIS 网络威胁情报技术委员会管理,使组织能够以标准和机器可读的格式共享威胁数据。
在 Elastic,我们开发了Elastic Common Schema (ECS)作为数据规范化功能。 “[ECS] 是一个开源规范,是在 Elastic 用户社区的支持下开发的。 ECS 定义了一组通用字段,用于在 Elasticsearch 中存储事件数据,例如日志和指标。” 2023 年 4 月, Elastic 将 ECS 贡献给了开放遥测语义约定 (OTel),以承诺共同开发开放模式。
安全社区以 STIX 格式共享威胁数据,因此为了将该数据存储在 Elasticsearch 中以供分析和威胁检测 [ 1 ] [ 2 ] [ 3 ] [ 4 ],我们创建了一个工具,将 STIX 文档转换为 ECS,并将威胁数据输出为文件或直接输出到 Elasticsearch 索引中。 如果这对我们来说是一个挑战,那么对其他人来说也是一个挑战——因此,我们决定发布该工具的一个版本。
此工具使用Elastic License 2.0 ,可在此处下载。
开始使用
该项目将采用 STIX 2.x 格式的 JSON 文档并创建 ECS 版本。 有三种输出选项:STDOUT 作为 JSON、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
。
Arguments
该脚本有几个参数,唯一必填字段是输入的-i
。 默认情况下,脚本会将 NDJSON 文档输出到 STDOUT。
选项 | 描述 |
---|---|
-h | 显示帮助菜单 |
-i | 指定输入 STIX 文档(强制) |
-o | 指定输出 ECS 文档(可选) |
-p | 定义 ECS 提供程序字段(可选) |
-r | 递归模式转换多个 STIX 文档(可选) |
-e | 指定 Elasticsearch 输出模式(可选) |
--index | 定义 Elasticsearch 索引,需要-e (可选) |
--url | 定义 Elasticsearch URL,需要-e (可选) |
- 用户 | 定义 Elasticsearch 用户名,需要-e (可选) |
示例
test-inputs/
目录中有两个示例文件。 一个来自CISA (网络安全和基础设施安全局),一个来自OpenCTI (开源威胁情报平台)。
STIX 文件输入到 STDOUT
这会将 STIX 文档以 ECS 格式输出到 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 Common Schema,您可以在此处了解更多信息。
与往常一样,如果您有任何问题、意见、疑虑或投诉,请随时提出问题。
关于 Elastic 安全实验室
Elastic Security Labs 是 Elastic Security 的威胁情报分支,致力于在威胁形势中创造积极变化。 Elastic Security Labs 提供有关新兴威胁的公开研究,并分析对手的战略、运营和战术目标,然后将该研究与 Elastic Security 的内置检测和响应功能相结合。
在 Twitter 上关注 Elastic Security Labs @elasticseclabs ,并在www.elastic.co/security-labs/查看我们的研究。