Cyril FrançoisAndrew Pease

STIXy 情况:ECSaping 威胁数据

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

阅读时间:11 分钟工具
STIXy 情况:ECSaping 您的威胁数据

前言

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

虽然这些信息有多种结构化格式,但事实上的行业标准是结构化威胁信息表达 (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+ 和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

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/查看我们的研究。