Cyril FrançoisAndrew Pease

STIXy 情况:将您的威胁数据 ECS 化

结构化的威胁数据通常使用 STIX 格式。为了帮助将这些数据导入 Elasticsearch,我们发布了一个 Python 脚本,将 STIX 转换为 ECS 格式,以便将其摄取到您的堆栈中。

11 分钟阅读工具
STIXy Situations: ECSaping your threat data

序言

使用威胁指标或可观察数据的组织会消费、创建和/或(理想情况下)发布威胁数据。这些数据可以在内部或外部用作信息或情报,为决策和事件优先级排序提供依据。

虽然有多种格式可以将此信息结构化,但事实上的行业标准是 结构化威胁信息表达 (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+ 以及 stix2Elasticsearchgetpass 模块。

如果导出到 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/ 查看我们的研究。