Cyril FrançoisAndrew Pease

STIXy Situation: 脅威データの ECSaping

構造化された脅威データは通常、STIXを使用してフォーマットされます。このデータをElasticsearchに取り込むために、STIXをECS形式に変換してスタックに取り込む、Pythonスクリプトをリリースします。

11分で読めますツール
STIX的シチュエーション:脅威データのエスケープ

前文

脅威インジケータまたはオブザーバブルを使用する組織は、脅威データを消費、作成、および/または(理想的には)公開します。 このデータは、意思決定やイベントの優先順位付けに情報を提供するための情報またはインテリジェンスとして、内部または外部で使用できます。

この情報を構造化するための形式はいくつかありますが、事実上の業界標準は 構造化された脅威情報表現(STIX)です。 STIXは、OASISサイバー脅威インテリジェンス技術委員会によって管理されており、組織は脅威データを標準的で機械可読な形式で共有できます。

Elasticでは、データ正規化機能として Elastic Common Schema(ECS) を開発しました。 「[ECS]はオープンソースの仕様であり、Elasticユーザーコミュニティの支援を受けて開発されました。 ECSは、ログやメトリックなど、Elasticsearchにイベントデータを格納するための共通のフィールドセットを定義しています。 2023年4月、Elasticはオープンスキーマの共同開発へのコミットメントとして、 OpenTelemetry Semantic Conventions(OTel) に ECSを提供しました 。

セキュリティコミュニティは脅威データをSTIX形式で共有しているため、そのデータをElasticsearchに保存して分析と脅威検出[1] [2] [3] [4]するために、STIXドキュメントをECSに変換し、脅威データをファイルとして、または直接Elasticsearchインデックスに出力するツールを作成しました。 これが私たちにとっての課題であった場合、それは他の人々にとっての課題であったため、ツールのバージョンをリリースすることにしました。

このツールは Elastic License 2.0 を使用しており、 こちらからダウンロードできます。

開始する

このプロジェクトでは、STIX 2.x 形式の JSON ドキュメントを取得し、ECS バージョンを作成します。 出力には、JSONとしてのSTDOUT、NDJSONファイル、および/または直接Elasticsearchクラスターへの出力の3つがあります。

要件

STIX 2 ECS プロジェクトには、Python 3.10+ と stix2Elasticsearchおよび 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 ドキュメントを指定します (オプション)
-pECS プロバイダー フィールドを定義します (オプション)
-r複数のSTIXドキュメントを変換する再帰モード(オプション)
-eElasticsearch出力モードを指定します(オプション)
--indexElasticsearchインデックスを定義し、 -e が必要(オプション)
--urlElasticsearch URLを定義し、 -e が必要(オプション)
--利用者Elasticsearchユーザー名を定義し、 -e が必要(オプション)

test-inputs/ ディレクトリには 2 つのサンプル ファイルがあります。1つは CISA (Cybersecurity & Infrastructure Security Agency)から、もう1つは OpenCTI (オープンソースの脅威インテリジェンスプラットフォーム)から来ています。

STDOUTへのSTIXファイル入力

これにより、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 ファイル出力への Provider フィールドの定義

プロバイダー フィールドは、通常、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 Security Labsについて

Elastic Security Labsは、Elasticセキュリティの脅威インテリジェンス部門であり、脅威の状況にポジティブな変化をもたらすことに専念しています。 Elastic Security Labsは、新たな脅威に関する一般向けの調査を提供し、戦略的、運用的、戦術的な敵対者の目標を分析し、その調査をElasticセキュリティの組み込み検知および対応機能と統合します。

TwitterでElastic Security Labsをフォロー @elasticseclabswww.elastic.co/security-labs/ の調査結果をご覧ください。

この記事を共有する