コンテンツにスキップ

Jupyter Notebooksを用いたハンティング🔗

本ドキュメントでは、Jupyter Notebooksを活用した脅威ハンティング業務を実現するためのツールとワークフローについて説明します。

Secureworksは、Jupyter Notebooksを用いて脅威ハンティング手順を自動化しています。Jupyter Notebooksとして実装された脅威ハンティング手順は、以下のことが可能です。

  • ハンティング手順の意図や方法論をドキュメント化する
  • Secureworks® Taegis™から検知やイベントなどの証拠を取得する
  • データを分析しやすい形式に加工する
  • データを脅威ハンターに提示し、レビューを行う
  • 分析中に脅威ハンターが発見事項を記録できる
  • 関連情報をXDRケースとしてエスカレーションする

Jupyter Notebookインテグレーション🔗

Secureworksは、TaegisとJupyter Notebooksを連携するための複数のオープンソースプロジェクトを公開しています。これらのツールは、脅威ハンティングワークフローを推進します。

ツール 目的
Taegis SDK for Python Taegis GraphQL APIを呼び出すための低レベルPythonクライアント
Taegis™ Magic Jupyter Integration コマンドラインやJupyter NotebooksからTaegisと連携するためのユーティリティ

Taegis SDK for Python🔗

Taegis SDK for Pythonは、Taegis GraphQL APIを呼び出すための公式Pythonクライアントです。

Taegis SDK for Pythonは、GraphQLスキーマからコード生成されています。GraphQLの操作や複雑な型は、Pythonのdataclassesとして表現されます。Jupyter Notebooksの静的解析機能(タブ補完や自動補完など)はdataclassesとネイティブに統合されており、利用可能な操作を簡単に参照したり、ノートブック上で入力引数を構築したりできます。

注意

GraphQLの基礎についての詳細な解説は本ドキュメントの範囲外ですが、Taegis SDK for PythonにおいてGraphQLの操作や型がPythonオブジェクトにどのようにマッピングされるかを理解しておくと役立ちます。

  • 各Taegis APIは、認可されたクライアントが呼び出せるGraphQLの操作を公開しています。これらの操作には、クエリ(読み取り)、ミューテーション(書き込み)、サブスクリプション(クライアントとサーバー間の双方向通信プロトコル)が含まれます。
  • GraphQLでは、API開発者がを定義できます。型は、操作の引数や戻り値として利用されるデータ構造です。GraphQLクエリでは、クライアントが戻り値のフィールドを指定してリクエストできるため、パフォーマンスが向上し、クライアント側のAPIコール回数を削減できます。
  • GraphQL APIは自己記述的です。利用可能なすべてのGraphQL操作、型、フィールドに関するメタデータはスキーマで定義され、イントロスペクションクエリを通じて公開されます。

Taegis SDK for Pythonでは、各serviceモジュールが、機能ごとにGraphQL型や操作を論理的にグループ化しています。たとえば、alertsサービスは、XDRの検知に関連するクエリ、ミューテーション、サブスクリプション、型を含むPythonモジュールです。

詳細はTaegis SDK for Pythonドキュメントをご参照ください。

Taegis Magic🔗

Taegis™ Magic Jupyter Integrationは、コマンドラインやJupyter NotebooksからTaegis APIと連携するための利便性レイヤーを提供します。 Taegis Magicは、ページネーションなどの定型的なロジックをノートブック利用者が実装する必要をなくし、日常的な作業を効率化します。 Taegis Magicは、IPython Magicとして実装されており、Jupyter Notebooksでサポートされる特殊なマクロの一種です。

Taegis Magicをスタンドアロンのコマンドラインツールとして使用する場合、結果はJSONとしてコンソールに返されます。 Jupyter Notebookから呼び出す場合、結果はpandas DataFrameとして返されます。 pandas DataFrameは、Pythonでデータを操作・分析するための強力な2次元データ構造です。 Taegisのクエリ結果をpandas DataFrameとして返すことで、ハンターはデータを迅速に分解し、脅威の証拠を見つけることができます。

Taegis Magicは、Jupyter Notebookを利用しながらXDRケースを自動的に作成することが可能です。 XDRケースは、XDR分析ワークフローおよびデータモデルの中心的な要素です。 アナリストや自動化システムが、イベント、検知、資産、検索クエリ、主な発見事項などの関連するセキュリティ情報を整理することができます。 XDRケースは、発見事項を伝達し、セキュリティインシデントの解決に向けて協働するための主要な手段です。 Jupyter NotebooksのマークダウンやHTMLなどのリッチメディア出力のネイティブサポートを活用し、XDRケースの主な発見事項セクションを自動的に記載できます。 Taegis Magicは、pandas DataFrame内で見つかったリソース識別子に基づき、ノートブック利用者がXDRケースに証拠をステージングできるようにします。

詳細はTaegis Magicドキュメントをご参照ください。

ハンティングワークフロー🔗

以下のセクションでは、Jupyter Notebooksを活用して一般的な脅威ハンティングワークフローをどのようにサポートしているかを説明します。

注意

これらのワークフローに関する補足資料として、インタラクティブチュートリアルもご参照ください。

探索的データ分析(EDA)🔗

EDA Hunting

探索的分析は、脅威ハンターが利用可能なデータから脅威の証拠を見つけるための仮説を迅速に検証するアドホックなワークフローです。 脅威ハンターは、Jupyter NotebooksからTaegis Magicを利用して関連データをクエリし、pandas DataFrameとして結果を分析します。 関連情報は、XDRケースとしてエスカレーションできます。

  1. Taegis Magicのノートブック拡張機能を読み込む
  2. データをクエリする
  3. 結果を分析する
  4. ケース用の証拠をステージングする
  5. ケースを作成する

ハンティング手順の自動化🔗

Create Notebook

脅威ハンターがEDAワークフローから脅威の証拠を見つける有用な方法を特定した場合、その手順を脅威ハンティング手順として形式化できます。 この文脈における脅威ハンティング手順とは、他のアナリストと再利用・共有することを目的としたJupyter Notebookです。

自由形式のEDA用ノートブックとは異なり、脅威ハンティング手順ノートブックには、将来の脅威ハンターやお客様が方法論を理解しやすいように、マークダウンで定型文を含めるべきです。 また、バージョン管理下で管理されるハンティング手順カタログ内で手順を整理するための追加メタデータも含める必要があります。 脅威ハンティング目的で推奨されるノートブックメタデータの詳細については、下記のメタデータセクションをご参照ください。

脅威ハンティング手順がJupyter Notebookとして形式化され、バージョン管理にコミットされると、他のアナリストはそのノートブックのコピーを作成して手順を繰り返すことができます。

  1. 新しいノートブックを作成する
  2. ノートブックメタデータを追加してハンティング手順をカタログ化する
  3. マークダウンセルを追加してレポート構成を作成する
  4. コードセルを追加して関連証拠を取得・分析する
  5. コードセルを追加してケース作成を自動化する
  6. ノートブックをバージョン管理下にコミットする

大規模ハンティング🔗

Hunting Fan Out

脅威ハンティング手順ノートブックは、通常、テナント単位で機能する個別の作業単位として扱います。 しかし、ファンアウト/ファンイン方式を用いることで、多数のテナントに対してノートブックを大規模に実行できます。

多くの個別テナントに対してハンティング手順を実行し、その結果を集約してレビューします。 Taegis Magicは、クエリ結果のキャッシュ機能により大規模ハンティングを実現します。 脅威ハンティング手順ノートブックがスコープ内のテナントで実行完了すると、脅威ハンターはキャッシュされたクエリ結果を解析できます。 脅威に関連する証拠が見つからなかったテナントには、null findingsケースを自動作成し、脅威が特定されなかったことを示すことができます。 脅威に関連する興味深い検索結果があったテナントは、脅威ハンターに手動レビューを割り当てます。 脅威ハンターは、キャッシュ済みクエリ結果を含む既に実行済みのノートブックを開くだけで済みます。

  1. 対象テナントを選択する
  2. ハンティングノートブックを選択する
  3. テナントごとにノートブックを並列実行する
  4. 結果を集約してレビューする
  5. 脅威ハンターに割り当てて人手による分析を行う、またはnull findingsケースを作成する

ハンティング手順の管理🔗

バージョン管理🔗

脅威ハンティング手順ノートブックは、gitなどのバージョン管理下で保管することを推奨します。 バージョン管理システムは、複数のハンターがコンテンツを共有・協働したり、ノートブックの変更履歴を追跡したりするなど、多くの利点を提供します。 GitHubやGitlabなどの人気のあるホスト型バージョン管理システムは、課題管理やピアレビューなどのワークフローツールも提供しています。

Jupyter NotebooksはJSONドキュメントであるため、行単位での比較が難しく、バージョン管理下での保管が課題となる場合があります。 一部のホスト型バージョン管理システムは、ノートブックファイルに特化したサポートを提供しています。 また、jupytextのようなツールを使って、ノートブックを構造化されたマークダウンドキュメント形式に変換することも可能です。 当社では、すべての脅威ハンティングノートブックをMySTマークダウン形式で保管しています。

Linting🔗

Lintingは、ソースコードを静的に解析し、構文やフォーマットのエラーなどの潜在的な問題を特定する手法です。 脅威ハンティングノートブックの文脈では、必要なメタデータ、マークダウンコンテンツ、コードコンテンツが含まれていることを保証するために、Lintingが非常に有用です。 当社では、pytestをCIジョブとして利用し、プロジェクト内の脅威ハンティングノートブック全体で規約や品質基準を強制しています。

当社の経験上、脅威ハンティングチームごとに独自のニーズや好みがあるため、画一的なアプローチは抵抗を招く可能性があります。 ノートブックを読み込む汎用的なpytestフィクスチャを作成し、各ハンティングチームが独自のLintingルールを実装することを推奨します。

メタデータ🔗

Jupyter Notebooksには複数種類のメタデータが含まれています。 公式のJupyter Notebook仕様では、ノートブックの動作やブラウザでの表示方法を決定するための必須メタデータフィールドが定義されています。Jupyter Notebooksは、カスタム用途向けに任意のJSONオブジェクトもメタデータとしてサポートしています。

脅威ハンティング手順の文脈では、Jupyter Notebookのメタデータを以下の目的で利用します。

  • ノートブックの内容に基づいてリポジトリを整理・分類するため
  • 特定のセルが、結果として生成されるXDRケースでどのように表示されるかを決定するため

ノートブックレベルのメタデータ🔗

Notebook-Level Metadata

必須ノートブックメタデータ🔗

すべてのJupyter Notebookにはkernelspecメタデータが必要です。 このメタデータは、コードセルを評価する際にJupyterがどのカーネルを使用するかを指定します。 カーネルは、Pythonなどのプログラミング言語や、必要な依存関係が配置された実行環境に対応します。

注意

脅威ハンティング用途には、共通のJupyterカーネルを用意することを推奨します。 このカーネルには、taegis-sdk-pythontaegis-magicpandas、および脅威ハンティング手順でよく利用される他のPythonパッケージを含めてください。

ハンティング固有のノートブックメタデータ🔗

必須メタデータに加え、各脅威ハンティング手順ノートブックには以下のノートブックレベルのメタデータを推奨します。

  • UUIDなどの一意な識別子
  • ハンティング手順のタイトル
  • ノートブックがハント対象とする脅威の簡単な説明
  • 関連するMITRE ATT&CKテクニックIDのリスト
  • ハンティングに必要なデータソースやその他の依存関係のリスト
  • カスタムラベル用の任意の文字列タグのリスト

この情報は、多数の脅威ハンティング手順が格納されたリポジトリ内で検索する際に役立ちます。

セルレベルのメタデータ🔗

Jupyterノートブック内の各セルには独自のメタデータがあります。 ノートブックインターフェースは、通常、必須メタデータフィールドの設定を担当します。 セルメタデータは、ブラウザがセルをどのように表示するかを決定するために利用されます。

ユーザーにとって最も関連性の高いセルメタデータは、セルのtagsです。 タグは、任意の文字列ラベルのJSON配列です。 ノートブックのWebインターフェースでは、ユーザーがWeb GUIからセルタグを簡単に追加・削除できます。

脅威ハンティングの文脈では、以下2種類のカスタムタグの利用を推奨します。

  • Papermillパラメータ: papermillモジュールは、parametersタグが付与されたセルを探し、ノートブックのパラメータ化時にデフォルト値を読み取ります。 実行時にデフォルトパラメータ値を上書きする場合、注入されたパラメータを含む新しいセルがparametersタグ付きセルの直後に追加されます。 ノートブックにparametersタグ付きセルが存在しない場合、注入パラメータセルはノートブックの先頭に追加されます。
  • エクスポートタグ: nbconvertモジュールは、ノートブックを他の形式にエクスポートする際にセルタグを利用します。 TagRemovePreprocessorは、ノートブックを解析し、セルのどの部分をエクスポート出力に含めるかを決定します。 TagRemovePreprocessorは任意(またはローカライズされた)タグにも対応できますが、以下のタグが慣例的に利用されています。
セルタグ 目的
remove_input エクスポート時にセルのコード入力を削除する
remove_output エクスポート時にセルのコード出力を削除する
remove_cell エクスポート時に入力・出力の両方を削除する

注意

remove_cellタグは、脅威ハンター向けのガイダンスのみを表示し、お客様には表示しない場合によく利用されます。 このガイダンスは、ノートブックをXDRケースの主な発見事項セクションとしてエクスポートする際に削除されます。 以下は、remove_cellタグ付きセルを除外してノートブックをエクスポートするnbconvert CLIの使用例です。

jupyter nbconvert --to markdown --no-input my-hunting-notebook.ipynb --TagRemovePreprocessor.enabled=True --TagRemovePreprocessor.remove_cell_tags remove_cell

マークダウンセル🔗

Jupyter Notebooksは、HTMLおよびマークダウンテキストのレンダリングをネイティブでサポートしています。 この機能により、ノートブック内で人間が読める言語とプログラム実行可能なコードを混在させることができます。

脅威ハンティングノートブックの文脈では、マークダウンセルは以下2つの重要な目的で利用されます。

  • ノートブックを実行するアナリストへの指示を提供するため
  • XDRケースの主な発見事項セクションを記載するため

ハンティングノートブックのマークダウンコンテンツはエクスポートされ、XDRケースの主な発見事項セクションに利用できます。 そのため、脅威ハンティング手順の「何を」「なぜ」「どのように」を説明する定型文をマークダウンテキストとして含めます。 一般的に、ハンティングノートブックは以下のセクションでマークダウン見出しを用いて構成します。

セクション 目的
タイトル 脅威ハンティングノートブックまたは手順の識別
エグゼクティブサマリー 脅威および実施したハンティング手順の概要説明
技術分析 実施したハンティング手順の技術的説明
発見事項 ハンティング手順完了後にアナリストが記載
推奨事項 是正措置、予防策などのガイダンス

マークダウンテキストの構成や内容は、手順やハンティング用途に応じて調整してください。

XDRケースのベストプラクティスについては、ナレッジベース記事シリーズもご参照ください。

コードセル🔗

Jupyter Notebooksは、多くのインタプリタ型プログラミング言語のコードを評価・実行できます。最も一般的なのはPythonです。

脅威ハンティングノートブックの文脈では、コードセルは脅威ハンティング手順の自動化を担います。 これらの手順には、通常、以下が含まれます。

  • 脅威ハンティング手順の実施に必要な依存関係のインポート
  • Taegis APIの呼び出しなど、リモートシステムからのデータ取得
  • 結果を分析しやすい形式に変換
  • データをアナリストに提示し、アドホック分析を実施
  • XDRケースに含めるべき関心データの選択
  • 脅威ハンティング手順および発見事項を記録するXDRケースの作成