
ブルーチーム向けのインタラクティブなデータ可視化ツールで、検知データの分析、関連性の理解、アラート疲れの軽減、インシデント対応の改善を支援します。
Detectreeは、ブルーチーム向けのデータ可視化ツールです。検知データをグラフィカルに表現することで、アナリストは基盤となるアクティビティの性質についてほぼ即座に判断を下し、データポイント間の複雑な関係を理解することができます。最終的には、対応時間の短縮、アラート疲れの軽減、チーム内のアナリスト間のコミュニケーション促進に役立ちます。
Detectreeはsvelteで書かれており、force-graph JavaScriptライブラリをベースにしています。
お使いの環境でDetectreeを使用するには、検知データが最小限のプロパティセットを満たしている必要があります。以下の表で、各検知に含める必要があるフィールドと任意のフィールドを確認できます。
| フィールド | 必須 |
|---|---|
| エンドポイントID | はい |
| カテゴリ | はい |
| 重大度 | はい |
| 検知名 | はい |
| 親プロセス名 | はい |
| 親プロセスID | はい |
| プロセス名 | はい |
| プロセスID | はい |
| ユーザー | いいえ |
| コマンドライン | いいえ |
| ファイル名 | いいえ |
| レジストリキー | いいえ |
| ネットワークアドレス | いいえ |
| ターゲットプロセス名 | いいえ |
| ターゲットプロセスID | いいえ |
各フィールドのマッピングは_schema.yml_ファイルで定義されており、サンプルファイルschema.yml.exampleが提供されています。このファイルは、バックエンドのデータから抽出するフィールドと、内部でどのようにマッピングされるかを定義します。特にマッピング部分には、左側にdetectreeマッピング、右側にバックエンドマッピングが含まれているため、お使いの環境に合わせてマッピングを設定する必要があります。
スキーマにはバックエンド設定も含まれており、elasticの場合は簡単ですが、各フィールドの意味は以下のとおりです。
primaryIdはエンドポイントの一意の識別子です。これは検知を取得するために使用されます。
timeFieldはクエリを制限するために使用される時間フィールドです。
sourceは検知タイプを識別するフィールドで、サンプルスキーマではNewProcess、RegistryWrite、FileAccessなどにマッピングされています。
続いてmappings内のtypeフィールドは特定の検知を識別します。例えば、バックエンドがNewProcess検知(または対応する名前)のみをサポートしている場合、マッピングは1つだけで済みます。これに密接に関連して、kindフィールドは検知タイプをdetectreeのタイプにリンクします。例として、kindがfileの場合、マッピングはコンテキストノードを描画するために使用されるfilePathを提供する必要があります。
現在サポートされているバックエンドはelasticのみですが、新しいバックエンド用のアダプターを構築するのは簡単です。詳細については、新しいバックエンドの追加セクションを参照してください。
お使いの環境にアプリケーションをデプロイするには、npm install(またはpnpm install、yarn)で必要な依存関係をインストールする必要があります。次に、お使いの環境に適したアダプターを選択する必要があります。最新の情報についてはこのガイドを参照してください。
例えば、バックエンドとしてnodeを使用する場合は、@sveltejs/adapter-nodeをインストールし、svelte.config.jsを変更して@sveltejs/adapter-autoを@sveltejs/adapter-nodeに置き換える必要があります。プロジェクトは以下のコマンドでビルドでき、出力はoutputフォルダーに生成されます。
npm run build
開発サーバーは以下のコマンドで起動でき、アプリケーションをローカルで提供できます。
npm run dev
# またはサーバーを起動して新しいブラウザタブでアプリを開く
npm run dev -- --open
グラフの例は以下のスクリーンショットで確認できます。

新しいバックエンドをサポートするには、backend_adaptersフォルダーに専用のTypeScriptファイルを作成する必要があります。elasticのものをテンプレートとして使用できます。新しいモジュールは、elasticファイルのものと同じパラメータを入力として受け取るクエリ関数を公開する必要があります。その後、選択したバックエンドを任意の方法でクエリできます。クエリ関数は、schema.yamlファイルで定義されたマッピングに従ってマッピングされたデータを含むオブジェクトを返す必要があります。最後に、バックエンドが正しく選択されるように、draw_tree.ts内の以下のオブジェクトにも追加する必要があります。ここでのオブジェクトキーは、schema.ymlでバックエンドが参照される方法でもあります。
const backendTypes = {
elastic: '../backend_adapters/elastic'
};