
DFIRフォレンジックコンパニオンサーバー + キャプチャ拡張機能
AI支援によるDFIRトリアージ — あなたのマシン上で。 調査のスクリーンショットとインポートした アーティファクトを、フォレンジックタイムライン、所見、IOC、資産↔IoCグラフ、共有可能なレポートに変換します。 ケースに対して平易な英語で質問し、他の調査担当者と共同作業できます。
ローカルホスト型のデジタルフォレンジック / インシデントレスポンスコンパニオン。ブラウザ拡張機能が 調査(Velociraptor、EDR/SIEMダッシュボード、Security Onion、Splunk4DFIR、VolWeb、VirusTotalなど)の スクリーンショットを証拠としてキャプチャし、ローカルサーバーがそれらを保存してウィンドウ化されたAIビジョン分析を 実行し、ケースごとの調査状態を蓄積していき、ライブダッシュボードとエクスポート可能なレポートを提供します。
すべてはあなたのマシン上で動作します — コンパニオンは127.0.0.1にのみバインドされ、証拠は
ディスク上に留まり、AIプロバイダーはあなたが選択できます。
検出後の分析レイヤー。 DFIR Companionは検出エンジンではありません — Velociraptor、Security Onion、Chainsaw、Hayabusa、THOR、Cyber Triage、EDR/SIEMからの 判定を取り込み、それらを1つのフォレンジックタイムラインに相関させ、所見、攻撃者パス、IOC、レポートを統合します。 価値は**「だから何なのか」**にあり、アラートを再導出することではありません。
デモケース: https://dfir-companion-production.up.railway.app/dashboard?caseId=demo
ハンズオンラボ: https://killercoda.com/dfir-companion/scenario/killercoda
ユーザーマニュアル: https://hasamba.github.io/DFIR-Companion/manual/
companion/.env)デモケース: GlobalTech Industries — BEC & ランサムウェア前兆、2026年5月。
実際の証拠をインポートせずに探索できる、完全に事前入力されたケース — 所見、IOC、 MITREテクニック、アナリストタグ/コメント、顧客露出データ、レポートメタデータがすべて 事前にシードされており、すべてのダッシュボードパネルに表示するものがあります。
ワンクリックで読み込み — ダッシュボードツールバーのDemo caseボタンをクリックします。ポータブル Windows EXEでも動作します(Nodeや
npmは不要)。ケースが既に存在する場合、ボタンは 上書き前に確認します。またはCLIからシード(開発 / Docker):
cd companion && npm run seed-demo # creates case id "demo" npm run seed-demo -- --force # overwrite an existing demo case npm run seed-demo -- --case-id globaltech # use a custom idその後、
http://127.0.0.1:4773/dashboardを開き、ケースに接続します。
AI生成のケースサマリー、分刻みのナラティブ、攻撃者パスの記述 — 初期アクセスから ランサムウェア展開まで。
重要度フィルター、トリアージタグ、行ごとの詳細リンク、インポート変更 トラッキング(展開可能な差分付きの新規イベントバナー)を備えた分析済みイベント。
スコープ/重要度フィルタリング前の、これまでにインポートされたすべてのイベント — 行をフィルタ、タグ付け、スター付けし、 分析済みフォレンジックタイムラインに昇格させます。何も削除されず、これはスーパーセットビューです。
資産(Y軸)と時間(X軸)ごとのイベントのビジュアルチャート。重要度で色分け — 時間軸を ドラッグしてフォレンジックタイムラインを範囲でフィルタリングできます。
信頼スコア、アナリストトリアージタグ、MITRE ATT&CKテクニック リンクを備えたAI生成の所見。前回の統合実行以降に何が変わったかを追跡します。
MITRE ATT&CK戦術ごとにバケット化されたイベント — 確認されたキルチェーンステージではなく、 AIを使わず決定論的に導出されたカテゴリ分類です。
統合されたケースから自動回答される標準的なDFIRの問い(回答済み / 部分的 / 不明)。 それぞれに証拠ポインターまたは「次にこれを収集する」指示が付きます。
所見と推奨される次のステップから自動導出される実行可能な修復チェックリスト。各統合実行時に 再同期されつつ、アナリストのステータス、担当者、期日は保持されます。
どのホスト/アカウントが攻撃を担っているかを、量ではなくシグナル(重要度で重み付けされたイベント + テクニック + 連結IOC)でスコアリングし、推奨スコープウィンドウを提示します。
プロセスツリー、横展開、ファイル系統が1つの因果的攻撃グラフに縫い合わされます。インポーターが 投入したフィールドから決定論的に導出 — AIなし、コストなし、オフラインで動作。
誰がどこにログオンしたか — スーパータイムラインのログオンイベントからアカウントとホストをリンクし、 成功、失敗、リスクのある(RDP/runas/netonly)ログオンを区別します。
人間のトラフィックにしては規則的すぎる定期的なアウトバウンドチャネル — 判定ではなくハンティングの手がかり。 候補ごとに間隔、ジッター、イベント数を示します。
インジケーター(IP · ドメイン · ハッシュ · ファイル · プロセス · アカウント)をVirusTotal、
AbuseIPDB、ThreatFox、その他のプロバイダーに対してエンリッチ — 判定バッジ、検出スコア、NEWインポート
ハイライト、アナリストトリアージラベル。
被害ホストとアカウントを、それぞれに触れたインジケーターにリンクするインタラクティブグラフ。加えて 既知の侵害されたホストとユーザーのリスト。
drop/フォルダにコピーされたファイルはバックグラウンドでインポートされ、_processed/または_failed/に移動し、drop-log.txtにログ記録されます。asset=<HOST>サブフォルダがホストを名指しします.evtxはバイト単位で保持され、パーサーバージョンと終了コードがカストディに記録され、フェイルクローズ、デフォルトではオフすべてのインポーターは**決定論的(AI呼び出しなし)**で、アーティファクト自身のタイムスタンプを読み取り、クロスソース相関のために実際のツール名でイベントにタグ付けします。同じファイルをタイムラインを重複させることなく再インポートできます。
object/action/properties、epoch-ms timestamp_ms) — process/flow/logon/registry/module/file/thread イベント | Info 証跡; LOLBin/エンコードされたコマンドラインによる引き上げ (公開 IP → IOC) |
| Windows Event Log XML | イベントビューアの「XML として保存」、wevtutil qe /f:xml、Get-WinEvent … ToXml() (Security、Sysmon、System、任意のチャネル) | Windows/Sysmon の EID 別テーブル |
| Chainsaw | EVTX ハント JSON/JSONL (chainsaw hunt --json); ツールランナー経由で生の .evtx に対して直接実行可能 | マッチした Sigma ルールのレベル |
| Hayabusa | json-timeline または csv-timeline | マッチした Sigma ルールのレベル |
| Velociraptor | JSON 配列、JSONL、またはアーティファクトマップ | Sigma/YARA の判定または EID 別 |
| THOR (Nextron) | JSON-Lines スキャン出力 | THOR アラートレベル |
| Suricata / Zeek | 、Zeek JSON ログ; テレメトリ → IOC のみ | アラート優先度 / notice 深刻度 |
| | 単一行アラートログ | ルールの (1→High / 2→Medium / 3→Low) |
| | CLI スキャン出力 (ルールマッチ + 文字列/meta) | マッチごとに Info→Medium; ルールの / meta で引き上げ |
| | Apache/Nginx/Squid の ログ形式 (Web サーバーまたはフォワードプロキシのアクセスログ); リクエスト URL、 を取得 (URL/Referer 内のシークレット + スキャナー/ボット/インジェクション UA がイベント + IOC として残る) | デフォルトで Info; アクセス拒否 (401/403/407) → Low; git smart-HTTP の clone/push → T1213 |
| | Built/Teardown/Deny メッセージ | デフォルトで Info (テレメトリ); 明示的な → Low |
| | RFC 5424 () + RFC 3164 () の Linux/Unix ホストログ | デフォルトで Info (テレメトリ); 認証失敗または crit/alert/emerg PRI → Low |
| | SOC Alerts/Hunt イベント (ECS); 拡張機能または SOC API エクスポートによりプッシュ | (Suricata/SO ラベル) |
| | Suricata アラート + YARA ファイルマッチ () および Sigma 検知 (); 拡張機能または生エクスポートによりプッシュ | Suricata 優先度 / Sigma レベル / YARA マッチ |
| | JSONL / JSON / CSV タイムライン | Cyber Triage アイテムスコア |
| | UAL、Entra サインイン + 監査ログ | BEC トレードクラフトテーブル / Entra riskLevel |
| | System Log エクスポート | IdP トレードクラフトテーブル (MFA 無効化、管理者権限付与、API トークン発行、セッションなりすまし) — ベンダーの運用グレードではない |
| | 管理者 + ログイン監査 | IdP トレードクラフトテーブル (2SV 無効化、ロール付与、OAuth 同意、メール監視追加) |
| | Chrome/Edge/Brave の履歴、ダウンロード、解釈 (JSON または CSV) | — (Info イベント: ブラウザアーティファクトは証跡であり、判定ではない) |
| | Unified log ()、LSQuarantine ダウンロードイベント、 属性、launchd plist、ログイン項目 (クラシック plist、、BTM) | 検疫レコード ↔ ファイル属性 ↔ ブラウザ訪問 ↔ プロセス起動を識別子で結合; plist は設定として読まれ、実行としては決して読まれない |
| | LEAPP TSV エクスポートからの iOS + Android 抽出アーティファクト | — (Info イベント; タイムスタンプ列をキーとする汎用パーサー) |
| | Records JSON、NDJSON、Athena | API アクションテーブル (IAM/ログ/S3/シークレット) |
| | Cloud Audit Logs、Azure Activity Log | アクションテーブル (IAM/ログ/シークレット) |
| | API サーバー監査ログ ( JSON-lines / EventList) | (verb, resource) テーブル — pod exec/attach T1609、secret access T1552.007、RBAC 変更 T1098、特権 pod T1610/T1611、匿名アクセス T1078 |
| | スケジュールクエリ結果ログ (差分 + ) | Info テレメトリ; コマンドライン列に対する保守的なトレードクラフト引き上げ |
| | CSV (dynamic + l2tcsv) | — (Info イベント) |
| | CAPEv2 、Falcon Sandbox サマリー | サンプル判定 + 行動シグネチャ |
| | Volatility 3 () + Rekall: pslist/pstree、netscan、malfind、cmdline、svcscan; JSON 実行エンベロープ (コマンド、終了ステータス、stderr) はエクスポートの隣にインポートされる | malfind のインジェクトコード → High (T1055); リスティング → Info/Low; ゼロ行または失敗した実行は、それが何を立証するかを示す |
| | プラグインテーブル + | 同じプラグインマッピング; メモリ YARA ヒット → Low、密な多ルールクラスタ → Info; 行数上限を開示 |
| | ケース / アラート JSON エクスポート、オブザーバブルリスト (TheHive 5) | TheHive 深刻度 1–4; ATT&CK タグ付きタグからの MITRE |
| | (RFC 2822)、ベストエフォートの | SPF/DKIM/DMARC 失敗 → 送信者なりすましヒューリスティック (T1566 フィッシング) |
| | / (bash + zsh 拡張履歴) | デフォルトで Info; トレードクラフト (リバースシェル、ダウンロード・アンド・エグゼキュート、資格情報アクセス、ログ/履歴改ざん、横方向 SSH) に対する保守的な引き上げ |
| | SSH authorized keys、cron、systemd ユニット、シェルプロファイル、1 回の収集からの SUID リスティングと PATH | 誰でも書き込み可能なペイロード、root がユーザー書き込み可能ファイルを実行、setuid インタプリタ; 単に存在するだけでは何も格付けされない |
| | 生の / レコード、 テーブル | レコードタイプテーブル (ログイン、アカウント管理、sudo、SELinux、監査改ざん) |
| | / | syslog PRIORITY + トレードクラフト引き上げ (sshd、sudo、useradd) |
| | Falco アラート JSON、sysdig イベント JSON | Falco ルール優先度; 生の syscall → Info テレメトリ |
| | / NDJSON、または API エクスポート () | (≥13 Critical、≥10 High、≥7 Medium) |
| | Velociraptor / EDR エクスポート | — |
| | ファイアウォール、syslog、VPN; 反復行 → カウントされたパターン | AI トリアージ |決定論的トレードクラフト格付け — Windows/Sysmon、ECAR、メモリのコマンドラインは、110 件を超える実際の侵入 (The DFIR Report、Huntress) から収集されたルールに対して格付けされます: 高信頼度のトレードクラフト → High とその ATT&CK テクニック (Defender 無効化、リカバリ阻害、資格情報ダンプ、リバーストンネル、Impacket、RMM/C2、クラウド持ち出し …)、両用 → Medium; 純粋な discovery はタグ付けされるが、決してエスカレートされません。
runas /netonly) を格付け → Medium$SI/$FN タイムスタンプの不一致をタイムストンプの可能性としてフラグ → Mediumrclone/restic/megasync/megacmd 実行Zone.Identifier マークは、同じファイルの Prefetch、プロセス起動、存在レコードと照合して読まれ、実行がそれより後の日付である場合にのみ引き上げられる; 隠しストリームペイロードは名前ではなく内容で格付けされるDFIR_JEV_ENABLED までオフ)DFIR_SHODAN_KEYを再利用?ボタンで、オンラインのユーザーマニュアルを新しいタブで開きますmanualタグ付き、再分析後も保持)DFIR_CROSS_CASE=onでない限りオフ$0.00になることはありません)DFIR_MAX_EVENTS) — デフォルトのインポートあたり2000イベントの安全上限を上書きDFIR_LOG_LEVELライブトグル。debugはAI/キャプチャ/OCR/匿名化をトレースchoco install dfir-companion。ポータブルビルドをダウンロード + 検証 + キャプチャ拡張機能をバンドル、データは%LOCALAPPDATA%にdocker compose up。証拠はホストボリューム上、AIバックエンドはバンドルなしCompanionは、あなたが実行するMCPサーバー — SIFTワークステーション、REMnuxボックス、Windowsトリアージベースラインサービス — にケース証拠を向けることができ、ツールが揃ったマシン上で証拠が分析されます。
それらに到達するのはClaude Code経由のみです。 CompanionはMCPクライアントではありません: サーバーURLもベアラートークンも保持せず、独自のnpxやuvxを起動しません。Claude Codeはすでにあなたのサーバーで設定され、その認証情報をすでに保持しているため、Claude Codeが通信を行い、Companionはそれに依頼します。
この機能全体は、以下の場合のみ動作します:
claudeがそのPATHにない場合はDFIR_AI_CLAUDE_CODE_BINを設定してください。claude mcp add …、またはその設定ファイル)、そしてclaude mcp listでそれらが接続済みとして表示される。フォールバックはありません。Claude Codeを併用せずにDocker、AppImage、またはポータブルWindowsビルドでCompanionを実行する場合、MCPルートはその旨を伝え、それ以外は何もしません。
依存する前に知っておく価値のある2つの結果。すべてのMCP呼び出しはモデルを経由するため、トークンを消費し、直接のJSON-RPCリクエストが行うようなビット単位で決定論的な呼び出しではありません — プロンプトはそれをトランスポートにします (1つのツール、正確な引数、逐語的な出力) が、それでもモデルが中間にいます。そしてサーバーは生成されたものではなくClaude Code自身の設定から来るため、Claude Codeは使用されている1つだけでなく、設定されているすべてのサーバーを毎回の実行で起動します。許可リストは呼び出し可能なものを制限するのであって、起動されるものを制限するのではありません。
設定 → ツールで、Refresh from Claude Codeを押してそのサーバーリストを読み込み、1つを許可して何ができるかを指定します。入力するものはポリシー以外に何もありません — サーバー名はClaude Code自体から来るため、タイプミスで何にもサイレントに一致しないエントリが残ることはありません。
POST /cases/<id>/mcp/<serverId>/runに{ tool, args, targetPath }を付けます。ツールが証拠パスを期待する場所に<target>を置いてください — 配信が実行された後、分析ホスト上のパスに置き換えられるため、あなたが書いた引数がツールが受け取る引数になります:```json
{ "tool": "run_command",
"args": { "command": ["vol.py", "-f", "", "pslist"] },
"targetPath": "imports/memory.raw" }
`targetPath` はケースディレクトリ内で解決され、その外側にあるものは拒否されます。ブラウザが保持していてサーバー側にパスが存在しないサンプルの場合、代わりに `POST /cases/<id>/mcp/<serverId>/run-upload` が `{ filename, dataBase64 }` を受け取り、まずケース内にバイト列をステージングします。
どちらもブロックせずに **ジョブ ID とともに 202** を返します。実際の Volatility の実行は、まともなリクエストタイムアウトを超えて生き続けるため、実行は進捗、キャンセルボタン、WebSocket の `job_changed` ブロードキャストを備えたバックグラウンドジョブとなります。結果は他のすべてのツールと同じインポートチェーンを通ってケースに流れ込みます — タイムラインイベント、ファインディング、IOC、そしてアンドゥチェックポイント付きです — そのため結果の読み取りに関して通常のインポートと異なる点はありません。構造化出力は一致するインポーターにルーティングされ、非構造化の散文は拒否されるのではなく汎用ログパスにフォールスルーします。
自らの失敗を報告するツールは、取り込まれるのではなくジョブを失敗させます。エラーメッセージは診断であってアーティファクトではなく、それをタイムラインに記録すると証拠のように見えてしまうからです。
### インポート前のプレビュー
**デフォルトで有効**であり、有効のままにしておく価値があります。MCP サーバーは証拠と同じくらい気軽に参照データを返します — SIFT にどんなツールがあるか尋ねれば、Volatility のテーブルと構造的に同一の JSON インベントリが返ってきます。タイムスタンプのないオブジェクトの配列です。どの検出器もそれらを区別できないため、インポーターは本来の役割を果たし、その中のすべてのパスをファイルインジケーターとして抽出します。1 つのケイパビリティ一覧が、ケースが決して望まなかった数十個の IOC になってしまいます。
プレビューを有効にすると、実行は出力を取得して停止します。バイト列、サイズ、そして*インポートされるであろう*種類を確認して選択できます。承認すると**すでに取得済みのバイト列を正確に**取り込みます — ツールを再実行することはないため、20 分の Volatility 実行のコストは 1 回だけで済み、副作用のあるツールも 1 回だけ実行されます。破棄すると出力は捨てられ、ケースはそのままです。
API から使用するには実行時に `preview: true` を送信し、その後 `/cases/<id>/mcp/preview/<jobId>` に対して `GET`、`POST …/import`、または `DELETE` を実行します。
ここにあるものは何も、何を実行するかについての判断の代わりにはならず、プレビューなしでインポートすることは危険ではありません — すべての MCP インポートはアンドゥチェックポイントをプッシュするため、ノイズだったと判明した実行もワンクリックでロールバックできます。
### サーバーの使用が付与するもの
**デフォルトでは、サーバーが提供するすべて。** これは意図的なものです。Claude Code はすでに、設定した任意のサーバー上の任意のツールを呼び出せるため、ここでそれらを再列挙させることは、あなた自身の日常的な使用よりも厳しくなるでしょう — そして同じサーバーを記述する 2 つ目の場所にもなります。
「すべて」に何が含まれるかを知っておく価値があります。一部のサーバーは細かいツールを公開します — `check_service`、`check_autorun`、質問ごとに 1 つ。他のサーバーは、渡されたものを何でも実行する単一の**コマンドランナー**を公開します。SIFT の `run_command` は「curl、wget、dd、fdisk、python3 を含む、SIFT にインストールされたほとんどのツール」を実行できると明記しており、REMnux の `run_tool` はシェルパイプライン全体を受け取ります。Companion からそのようなサーバーを使用することは、そのホスト上でのコマンド実行を意味します — 分析ボックスが自分のもので証拠がすでに自分の LAN 上にある隔離されたフォレンジックネットワークでは妥当であり、それ以外のどこでも妥当ではありません。
それを望むときに絞り込むための 2 つの**オプション**のリストがあります:
| 設定 | 適用対象 | 空欄の意味 |
|---|---|---|
| **ツールに制限** | すべての呼び出し | サーバーが提供するすべてのツール |
| **コマンドに制限** | コマンド引数を伴う呼び出し | コマンド制限なし |
コマンドは**ベース名**で照合されるため、`grep` と `/usr/bin/grep` は 1 つのルールです。パイプラインのすべての段階がチェックされ、最初の段階だけではありません — `oledump.py s.doc | curl -T - http://elsewhere` は `oledump.py` と `curl` の両方が許可されている必要があります。シェル置換 (`$(…)`、バッククォート、`${…}`) を使用するコマンドは、何を実行するか事前に知ることができないため、完全に拒否されます。
**コマンドリストが行わないこと。** それは*どの*バイナリが実行されるかを制限するもので、許可されたバイナリが何を行えるかを制限するものではありません — `dd` を許可することは、そのサーバーのユーザーが書き込める任意のパスへの書き込みを許可することであり、`python3` を許可することは任意のコードを許可することです。また、よく知られたパラメータ名 (`command`、`cmd`、`argv`) をキーとするため、コマンドパラメータに珍しい名前を付けたサーバーは捕捉されません。これは、自分のアクセスを絞り込みたいオペレーターを助けるために存在するものであり、そもそも設定すべきでなかったサーバーを封じ込めるためのものではありません。
### サーバーに証拠を届ける
MCP にはファイル転送プリミティブがなく、数ギガバイトのメモリイメージはツール引数の中を移動できないため、ファイルはすでにサーバーが開ける場所になければなりません。この部分は Companion の役割のままです — Claude Code はイメージを分析ボックスに移動できません。各サーバーは 2 つのルートのいずれかを選びます:
**`remote-path`** (デフォルト) — 証拠は共有マウントを介して分析ホストからすでに見えています。ローカルプレフィックスとリモートプレフィックスを設定するとパスが書き換えられます (`/srv/cases/…` → `/mnt/dfir/…`)。両側で同じパスにマウントされている場合は両方とも空のままにします。何もコピーされません。
**`scp`** — Companion がファイルをステージングディレクトリにプッシュし、ツールが実行され、その後ステージングされたコピーが削除されます。`host`、`remoteDir`、オプションで `user`、`port`、`identityFile` を設定します。
`scp` を選ぶ前に知っておくべき 4 つのこと:
- **ホストキーはすでに信頼されている必要があります。** `BatchMode` がオンで `StrictHostKeyChecking` は*無効化されておらず*、未知のホストはアドレスに応答したものを信頼するのではなく `Host key verification failed` で失敗します。まず手動で一度接続する (またはキーを `known_hosts` に追加する) 必要があります。これは意図的なものです。検証されていないキーを黙って受け入れることは、IP を保持する誰かに証拠を渡すことになるからです。
- **認証はキーベースのみです。** `BatchMode` は ssh が決してプロンプトを出さないことを意味するため、パスワードのみのホストは機能しません。`identityFile` をパスフレーズなしのキーに向けるか、サーバープロセスが到達できるエージェントにロードしてください。
- **進捗も再開もありません。** 16 GB のコピーは完了するか失敗するまで不透明であり、接続が切れると最初からやり直しです。転送はキャンセル可能で、ツール呼び出しのタイムアウトとは別に、独自の 1 時間のタイムアウトがあります。
- **ホスト、ユーザー、リモートディレクトリは保守的な文字セットに制限されます** (英字、数字、ドット、ダッシュ、アンダースコア、ディレクトリ用の `/`)。`user@host` はクォートされずに ssh に到達するため、シェルの意味を持つものは転送時ではなく保存時に拒否されます。ステージングされたファイル名は証拠名から派生し、同じ方法でサニタイズされます。
どちらのルートも、宛先を記録する**チェーンオブカストディの `transferred` イベント**を記録するため、ケースファイルは証拠がこのマシンを離れたこと、いつ、どこへを表示します。失敗した転送は何も記録しません — チェーンは起こらなかったコピーを決して主張しません。
### 平易な英語による MCP 調査
単一のツール呼び出しでは糸をたどれません。「このダンプを調査して」はループを求めます — pslist を実行し、何かに気づき、malfind にピボットする — そしてそれがエージェントモードのすることです: 許可したサーバーに対して Claude Code を駆動させ、それが報告するものをマージします。これがダッシュボードの主要な MCP ワークフローです: 目標を平易な英語で書き、証拠を選択またはブラウズし、MCP アプリを選び、**Investigate** を押します。ツール名と JSON 引数は、高度な手動呼び出しセクションでのみ利用可能です。
`{ prompt, servers?, targetPath?, preview? }` を伴う `POST /cases/<id>/mcp/agent`、または `{ prompt, servers, filename, dataBase64, preview? }` を伴う `POST /cases/<id>/mcp/agent-upload`。
**サーバーを許可する前にこれを読んでください。** 手動実行では Companion が各呼び出しを制御するため、すべての呼び出しがツール*と*コマンドの両方の許可リストを通過します。エージェントモードではそうではありません: `claude` がサーバーと直接対話します。生き残るのはツール許可リストのみで、`--allowed-tools` としてです。**コマンド許可リストは強制できません。** したがって、エージェントにコマンドランナーツールを使用させることは、自律ループにそのホスト上で独自のコマンドラインを選択する能力を与えることになります。
Companion で MCP サーバーを許可し有効化することが、このモードの許可境界です。サーバーのツール制限は依然として適用されます。コマンド制限は自律ループを制約できません; それは高度な手動呼び出しにのみ適用されます。
このモードが依然として保証するもの: 明示的なツール制限はツールごとに渡されます; 空欄の制限はそのサーバーが公開するすべてのツールを意図的に許可します。プロジェクト/ローカル設定、`CLAUDE.md` ファイル、フックは除外され、実行はターン数制限されます。Claude Code のユーザー設定は、そこに MCP サーバー接続が存在するため、有効なままです。
エージェントの返信はマージされる前にスキーマ検証され、出所の主張が取り除かれます — それが見たものはすべてツール出力から来ており、信頼されていません。ケースサマリーを求められることは決してないため、実行はあなたの結論を書き換えることなくファインディング、IOC、イベントを追加します。プレビューはここでも機能し、より重要です: 自律ループは何を報告するかを自ら決定するからです。
調査は 40 ターンに制限されます。Claude Code がツールを使用しながらその予算を消費した場合、Companion はすべてのツールを無効にして同じセッションを一度再開し、すでに収集された証拠のみから報告するよう求めます。これは、最終的な JSON が次のターンだったというだけで完了した調査を失うことなく、安全境界を維持します。
### 認証情報
ここで設定するものは何もありません。ベアラートークン、ヘッダー、トランスポートはすべて Claude Code 自身の MCP 設定にあり、それがそれらを保持する唯一の場所です。Companion はサーバーの*名前*、許可リスト、配信ブロックを保存するだけです — 単独で何かに接続できるものは何もありません。
探しに行く場合の 1 つの注意点: `claude mcp list` は各サーバーの完全なコマンドラインを出力し、`mcp-remote` エントリの場合はベアラートークンが平文で含まれます。Companion はその出力から名前とヘルス判定のみを解析し、残りを保存、ログ記録、レンダリングすることは決してありません — ただし、そのコマンドを自分で実行する場所には注意してください。
## リポジトリレイアウト```
52.43-DFIR-Companion/
├── companion/ Node/TS localhost server (the core). See companion/README.md.
├── extension/ MV3 capture extension (Chrome/Comet + Firefox). See extension/README.md.
├── public/
│ └── dashboard.html Live dashboard, served by the companion at /dashboard.
├── docs/
│ └── superpowers/plans/ The original 4 implementation plans.
├── Dockerfile Single-image build (server + dashboard + add-on); no Ollama/LiteLLM.
├── docker-compose.yml Localhost-only Compose: ./cases volume, add-on → ./addon.
└── cases/ Evidence + state output (gitignored). Location set by DFIR_CASES_ROOT.
Browser (Comet/Chrome) Localhost companion (127.0.0.1:4773) ┌─────────────────────┐ POST ┌───────────────────────────────────────┐ │ DFIR Capture (MV3) │ /captures ──▶ │ ingest → evidence (screenshots+jsonl) │ │ timer + events │ │ │ │ └─────────────────────┘ │ ▼ per-window AI extraction (cheap) │ │ forensic timeline ──▶ synthesis (strong)│ Dashboard / Reports ◀── WS /ws, │ findings, IOCs, MITRE, attacker path, │ GET /cases/:id/state │ key questions, threads │ └─────────────────────┘ └───────────────────────────────────────┘
**2段階分析:** 安価なビジョンモデルが各スクリーンショットをフォレンジックタイムラインに読み込み、より強力なモデルが単一の全体的な統合呼び出し(findings、MITRE、攻撃者パス、質問)を行います。両方とも `.env` で設定します — `companion/README.md` を参照してください。
## クイックスタート
> **前提条件:** [Node.js](https://nodejs.org/) **22.19 以降**(`npm` が同梱されています)。
> `node --version` で確認してください。以下はすべて `npm` を使用するため、他のランタイムは不要です。
> インデックス化されたケースストレージは組み込みの `node:sqlite` モジュールを使用するため、古い Node リリースではケースを開けません。ポータブルビルドには互換性のあるランタイムが同梱されています。
1. **Companion**(サーバー): ```
git clone https://github.com/hasamba/DFIR-Companion.git
cd DFIR-Companion/companion
npm install
cp .env.example .env # set DFIR_VISION_PROVIDER / MODEL / KEY (or leave AI off)
npm run dev # serves http://127.0.0.1:4773 (dashboard at /dashboard)
拡張機能(キャプチャ):
最も簡単な方法:
Chrome Web Store から直接インストールします。
Firefox 140+ では、最新リリース から dfir-capture-extension-firefox-*.zip をダウンロードして解凍します。
またはソースからビルドします: ``` cd DFIR-Companion/extension npm install npm run build # Chrome/Comet → load extension/dist as an unpacked extension npm run build:firefox # Firefox 140+ → load extension/dist-firefox/manifest.json
Firefox では、about:debugging#/runtime/this-firefox から読み込み → 一時アドオンを読み込む… を選び、manifest.json ファイルを選択します(Chrome はフォルダを要求しますが、Firefox は要求しません)。Firefox は再起動時に一時アドオンを破棄するため、セッションごとにこの操作を繰り返す必要があります — まだ AMO での公開がないため、リリース zip は署名されておらず、永続的にインストールすることはできません。
一時読み込みでは確認が求められないため、何が収集されるのか。 Firefox がデータ収集に関する通知を表示するのは、通常インストールされた署名済みアドオンの場合のみです。
about:debuggingはすべてを無言で許可します。この拡張機能は閲覧アクティビティ(キャプチャにはタブの URL とタイトルが含まれます)とウェブサイトのコンテンツ(スクリーンショット、および Push がスクレイピングする行)を宣言しています。拡張機能はこれらを、設定したコンパニオンアドレスにのみ送信し、それ以外のどこにも送信しません。その後コンパニオンが転送する内容 — ビジョンモデルがスクリーンショットを読み取り、AI 合成が行を読み取り、エンリッチメントがレピュテーションサービスに問い合わせる — は、コンパニオン自身の設定によります。詳細は extension/PRIVACY.md を参照してください。
ポップアップは既存のケースにアタッチするだけです — ケースの作成はダッシュボードで行います。
http://127.0.0.1:4773/dashboard を開き、+ New case をクリックしてケースを作成します(自動的に接続されます)。次に拡張機能のポップアップで、Case ドロップダウンからそのケースを選択し(まだ一覧にない場合は Refresh cases)、Start をクリックします。証拠を閲覧すると — ダッシュボードがリアルタイムで更新されます。既存のチェックアウトを更新する場合
git pullの後、companion/とextension/の両方でnpm installを再実行してください — 新機能で依存関係が追加されることがあります(例: スクリーンショット OCR の墨消しでtesseract.jsが追加されました)。その後npm run devを再起動してください(サーバーコードは起動時に一度だけ読み込まれます)。
完全な設定、HTTP エンドポイント、ケースフォルダのレイアウト、および分析モデルについては companion/README.md に記載されています。
全体 — コンパニオンサーバー + ダッシュボード + ブラウザアドオン — を 1 つのコンテナで実行します。Ollama や LiteLLM は同梱されていません。AI を利用するには、DFIR_AI_* を任意の OpenAI 互換エンドポイント(自分でホストするモデル、リモートプロバイダー、または別途実行する Ollama/LiteLLM)に向けてください。AI を未設定のままでも、コンテナは完全なキャプチャとすべての決定論的インポーターを実行します。
前提条件: Compose プラグイン付きの Docker(
docker compose version)。
設計上 localhost のみ: コンテナは内部的に 0.0.0.0 にバインドしますが、Compose はホスト上の 127.0.0.1 にポートを公開します — そのためダッシュボードがネットワーク上に公開されることはありません。
または、ビルドする代わりに GHCR からビルド済みイメージを取得します: ``` docker compose pull && docker compose up -d
2. **アドオンをロードする**(キャプチャ)。コンテナは初回起動時に、ビルド済みで展開された拡張機能を
`./addon` に書き出します。Chrome/Comet で `chrome://extensions` を開き、**デベロッパー
モード**を有効にして、**パッケージ化されていない拡張機能を読み込む**をクリックし、**`./addon/dist`** を選択します(パッケージ化された
`dfir-companion-extension.zip` もそこに出力されます)。
3. `http://127.0.0.1:4773/dashboard` を開き、**+ New case** をクリックして、拡張機能のポップアップでそのケースを選択し、**Start** をクリックします。
**データと設定:**
- 証拠とケースの状態はホスト上の **`./cases`**(マウントされたボリューム)に永続化されます — 再起動やイメージの再ビルド後も保持されます。
- [`docker-compose.yml`](https://github.com/hasamba/dfir-companion/blob/master/docker-compose.yml) の `environment:` ブロックで設定するか、`env_file: - .env` のコメントを解除して `.env` ファイルを使用します(`companion/.env.example` をコピーしてください)。
- ホスト上で実行されている AI エンドポイントに接続するには、`http://host.docker.internal:<port>/v1` を使用します(Docker Desktop のない Linux では、compose ファイルの `extra_hosts` 行もコメント解除してください)。
## Windows (Chocolatey)
[Chocolatey](https://chocolatey.org/) を使用してポータブル Windows ビルドをインストールします — Node.js は
不要です。管理者権限のシェルで:```
choco install dfir-companion
dfir-companion # → http://127.0.0.1:4773/dashboard
choco upgrade dfir-companion で次のリリースを取得します。choco uninstall dfir-companion
はバイナリと PATH シムを削除します。インストーラーは Releases ページ で公開されている
同じポータブル zip をダウンロードし、その SHA256 を検証します。
データはユーザープロファイルに保存されます。管理者所有のインストールディレクトリではありません。ケースは
%LOCALAPPDATA%\DFIR-Companion\cases に、設定は %LOCALAPPDATA%\DFIR-Companion\.env
にあります(サンプルからシードされます。AI / 脅威インテリジェンスのキー用に編集してください — すべて任意です)。アンインストールしても
そのフォルダは保持されるため、証拠が削除されることはありません。ファイアウォールルールは作成されません — サーバーは
127.0.0.1 のみにバインドします。
キャプチャ拡張機能はオフラインインストール用に %LOCALAPPDATA%\DFIR-Companion\extension に
ディスク上へバンドルされています(エアギャップのワークステーションで便利です)— chrome://extensions →
デベロッパーモード → パッケージ化されていない拡張機能を読み込む → そのフォルダ、で読み込むか、公開後に
Chrome ウェブストアからインストールしてください。ブラウザに自動インストールされることはありません。
まだ Chocolatey コミュニティリポジトリにはありませんか? そこに公開されるまでは、リリースから
dfir-companion.<version>.nupkgを取得し、そのフォルダでchoco install dfir-companion --source .を実行してください。パッケージングはpackaging/chocolatey/にあります。
Releases ページ から dfir-companion-<version>-x86_64.AppImage を
ダウンロードし、次を実行します:```
chmod +x dfir-companion--x86_64.AppImage
./dfir-companion--x86_64.AppImage # → http://127.0.0.1:4773/dashboard
Nodeは不要 — サーバー、ダッシュボード、イメージツールを同梱しています。**データは実行したディレクトリに保存されます:** `cases/`(証拠 + 状態)と任意の `.env`(AI / 脅威インテリジェンス設定)が、AppImageを起動した場所の隣に作成/読み込まれます。`DFIR_CASES_ROOT`(絶対パス)と `DFIR_ENV_FILE`(設定ファイルへの絶対パス)で上書きできます。
### データの保存場所
| インストール | ケース + 状態 | 設定 (`.env`) |
| ---------------------- | ------------------------------------- | ------------------------------------- |
| ソース / `npm run dev` | `companion/cases/` | `companion/.env` |
| ポータブル Windows EXE | EXEの隣の `cases/` | EXEの隣の `.env` |
| Windows (Chocolatey) | `%LOCALAPPDATA%\DFIR-Companion\cases` | `%LOCALAPPDATA%\DFIR-Companion\.env` |
| Linux AppImage | `$PWD/cases`(起動ディレクトリ) | `$PWD/.env`(または `DFIR_ENV_FILE`) |
| Docker / Compose | マウントされた `./cases` ボリューム | `environment:` / `--env-file` |
すべての場所は `DFIR_CASES_ROOT`(絶対パス)で上書きできます。
## 環境変数 (`companion/.env`)
コンパニオンの動作はすべて環境変数(`companion/.env` またはシェル)で設定します。開始するには `companion/.env.example` をコピーしてください — すべての変数にインラインコメントが付いています。
### コア
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_CASES_ROOT` | `./cases` | ケースフォルダの場所。相対パスは `companion/` を基準に解決されます |
| `DFIR_PORT` | `4773` | サーバーポート(拡張機能とダッシュボードと一致させる必要があります) |
| `DFIR_HOST` | `127.0.0.1` | バインドするインターフェース。認証なしの非ループバックバインドは拒否されます。Docker Composeはホストループバック限定の例外を文書化しています |
| `DFIR_MAX_BODY_MB` | `256` | 最大アップロードサイズ(MB)。大きなSIEM/EDRエクスポートがHTTP 413で失敗する場合は引き上げてください |
| `DFIR_ALLOWED_ORIGINS` | _(なし)_ | APIを呼び出せる追加のブラウザオリジン(カンマ区切り)。キャプチャ拡張機能、ループバック、およびコンパニオン自身が配信したオリジンは常に信頼されるため、localhost/LAN/Dockerには設定不要です。それ以外のすべてのWebオリジンは拒否されます。`Origin` を送信しない呼び出し元(curl、スクリプト、Velociraptor)は影響を受けません。ダッシュボードが**ホスト名**から配信される場合 — リバースプロキシやホスト型デプロイ — に必要です |
| `DFIR_ALLOWED_HOSTS` | _(なし)_ | このコンパニオンが応答する追加のホスト名(カンマ区切り)。ループバックとベアIPアドレスは常に受け入れられるため、localhost、Docker、および `http://192.168.1.50:4773` でLAN経由でダッシュボードに到達する場合には設定不要です。リストにない**名前**は拒否されます — これがDNSリバインディング(悪意のあるサイトが自身のドメインをあなたのマシンに向ける)を防ぎます。リバースプロキシが `DFIR_ALLOWED_ORIGINS` に入れたオリジンと異なる `Host` を転送する場合に設定してください |
| `DFIR_ALLOWED_HOST_SUFFIXES` | _(なし)_ | 上記と同様ですが、ドメインサフィックスでマッチします(例: `.lab.example.com`)。セッションごとに新しいホスト名を発行するプラットフォーム向けです。マッチングはラベル境界で行われるため、`.acme.com` が `evilacme.com` にマッチすることはありません |
| `DFIR_LOG_LEVEL` | `info` | ログの詳細度(`debug`/`info`/`warn`/`error`)。コンソール + `logs/session-<time>.log`(グローバル)+ `cases/<id>/logs/session-<time>.log`(ケース単位)に出力されます。`debug` はAI呼び出し、キャプチャ、OCR、匿名化、エンリッチメントをトレースします。設定 → ログの詳細度からライブで変更できます(再起動不要) |
| `DFIR_LOG_DIR` | ケースルート隣の `logs/` | **グローバル**セッションログのフォルダ。相対パスは `companion/` を基準にします。ケース単位のログは常にケースフォルダ内に留まります |
### 認証(オプションのチームデプロイ)
`DFIR_AUTH_MODE=team` はOIDC/ローカルサインイン、セキュアなブラウザセッション、ケース単位のロール、およびケーススコープのサービスIDを有効にします。認証とIDプロバイダーの設定はデプロイのセキュリティ制御です: `.env` またはシークレットストアで設定し、再起動してください。完全な変数リスト、HTTPS設定、初回管理者ブートストラップ、ロールマトリックス、拡張機能トークン、および単一ライタープロセスモデルについては、[チームアカウントとケースロールガイド](https://github.com/hasamba/dfir-companion/blob/master/mkdocs-docs/reference/team-authentication.md)を参照してください。
### AI — 抽出(分析を有効にするために必須)
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_VISION_PROVIDER` | — | `openai` \| `openrouter` \| `ollama` \| `litellm` \| `gemini` \| `anthropic` \| `claude-code`。未設定 = キャプチャのみ |
| `DFIR_VISION_MODEL` | — | モデルID(例: `gpt-4o-mini`、`gemini-2.5-flash`)。スクリーンショット抽出には**ビジョンをサポート**している必要があります |
| `DFIR_VISION_KEY` | — | プロバイダーのAPIキー。認証なしのローカルプロキシ、または `claude-code`(代わりにログイン済みの `claude` CLIサブスクリプションを使用)の場合は空欄にします |
| `DFIR_AI_CLAUDE_CODE_BIN` | PATH上の `claude` | `claude-code` のみ: `claude` バイナリがPATH上にない場合の絶対パス |
| `DFIR_VISION_BASE_URL` | プロバイダーのデフォルト | ベースURLの上書き — ローカルLiteLLMプロキシまたは任意のOpenAI互換エンドポイント用 |
| `DFIR_AI_TIMEOUT_MS` | `900000` | リクエストごとのタイムアウト(ms)。CLIプロバイダー(claude-code、codex)は大きなタイムラインでは数分かかります |
| `DFIR_AI_MAX_TOKENS` | `16000` | 最大補完トークン数。低すぎると合成が切り詰められ、残高不足時にOpenRouterの402を防ぎます |
| `DFIR_AI_SYNTH_MAX_EVENTS` | `600` | 合成に送信されるフォレンジックイベントの上限。Critical/Highは常に無条件でファインディングを取得します |
| `DFIR_REPORT_SYNTH_COVERAGE` | _(オフ)_ | truthyに設定すると、レポートに **§3.4 合成カバレッジ** の脚注を追加します — 「ウィンドウ内イベントM件中N件を考慮(K件省略: 予算/フィルタリング)」、トークン推定値、およびセーフティネットのバックフィルが回復した高重大度の省略件数。ダッシュボードのsynth-metaカードは常にこの行を表示します。このフラグはエクスポートされたレポートにも表示されるかどうかだけを制御します |
| `DFIR_REPORT_MODEL_PERF` | _(オフ)_ | truthyに設定すると、レポートに **§3.5 モデルパフォーマンス** の脚注を追加します — 合成モデル、ファインディング数とセーフティネットのバックフィルが追加しなければならなかった数、パース再試行回数、および(セカンドオピニオンが実行された場合)`DFIR_AI_SECOND_OPINION_MODEL` が `DFIR_AI_MODEL`/`DFIR_AI_SYNTH_MODEL` と一致した頻度。ダッシュボードのsynth-metaカードは常にこれを表示します。このフラグはエクスポートされたレポートにも表示されるかどうかだけを制御します |
| `DFIR_AI_CONTEXT_TOKENS` | `128000` | モデルのコンテキストウィンドウ。Claude/Gemini(200k/1M)では引き上げて呼び出しごとにより多くを送信できます |
| `DFIR_VISION_IMAGE_DETAIL` | `high` | `high` \| `low` \| `auto`(OpenAI/OpenRouter)。`high` は小さなテキストのOCRのためにフル解像度でタイル化します |
| `DFIR_AI_AUTO_SYNTHESIZE` | `on` | キャプチャ中に再合成: `on` \| `off` |
| `DFIR_AI_AUTO_SYNTHESIZE_MS` | `8000` | 自動合成が発火する前のデバウンスウィンドウ(ms) |
| `DFIR_FLUSH_INTERVAL_MS` | `300000` | 残ったキャプチャバッファのセーフティネットフラッシュ(ms)。`0` で無効化 |
| `DFIR_ANONYMIZE` | `on` | AI呼び出しの前に被害者のIP/ホスト/ユーザー/パスをトークン化: `on` \| `off` |
| `DFIR_PRESIDIO_URL` | _(未設定)_ | オプション: 自己運用の[Presidio](https://github.com/hasamba/dfir-companion/blob/master/mkdocs-docs/reference/presidio.md) AnalyzerコンテナのベースURL(例: `http://localhost:5002`)。すでにマスクされたテキストをスキャンして、正規表現では捉えられない名前やその他のPIIを検出します。未設定 = 機能オフ。 |
| `DFIR_PRESIDIO_MIN_SCORE` | `0.6` | Presidioファインディングの信頼度下限(0〜1)。空欄/非数値はデフォルトにフォールバックし、範囲外の値はクランプされます |
| `DFIR_PRESIDIO_TIMEOUT_MS` | `60000` | 1回の `/analyze` リクエストの予算(スキャンはチャンク化され、各チャンクが全予算を取得します)。遅いまたは共有のアナライザーでは引き上げてください。空欄/非数値/≤0はデフォルトにフォールバックします |
> 上記のスクリーンショット/ビジョン変数(`DFIR_VISION_PROVIDER` / `DFIR_VISION_MODEL` / `DFIR_VISION_KEY` / `DFIR_VISION_BASE_URL` / `DFIR_VISION_IMAGE_DETAIL`)は `DFIR_AI_*` プレフィックスから改名されました。レガシーな `DFIR_AI_PROVIDER` / `DFIR_AI_MODEL` / `DFIR_AI_KEY` / `DFIR_AI_BASE_URL` / `DFIR_AI_IMAGE_DETAIL` 名は非推奨のフォールバックとして引き続き機能します(両方設定されている場合は新しい名前が優先されます)。
**Claude Code** — `claude` CLI経由でログイン済みのClaudeサブスクリプションを使用し、APIキーは不要です。ビジョン + テキスト(スクリーンショット抽出*および*合成)を処理します。ホストに `claude` CLIがインストールされ、`claude auth login` が完了している必要があります。サブスクリプションのレート制限を消費します(大量の抽出で使い果たす可能性があります)。報告されるコストはAPI換算であり、実費ではありません。設定 → AIに接続ステータス(未インストール / 未接続 / 接続済み)とワンクリックの接続アクションが表示されます。
### AI — テキストモデル(2層、オプション)
分割は**ビジョン対テキスト**です: `DFIR_VISION_MODEL` はスクリーンショットを読み取り(マルチモーダルである必要があります)、`DFIR_AI_SYNTH_*` モデルは**すべてのテキスト作業** — CSV抽出、ログトリアージ、合成、ask/explain — を行います。未設定の場合、テキスト作業は `DFIR_VISION_MODEL` を再利用します。
**Codex** — `DFIR_AI_SYNTH_PROVIDER=codex` を設定すると(velo / セカンドオピニオンプロバイダーにも有効)、ローカルのOpenAI **Codex CLI**(`codex exec`)を通じてテキスト作業を実行し、環境のcodex認証 — `codex login` または `OPENAI_API_KEY`、**`DFIR_AI_KEY` は不要** — を使用します。Codexは**テキスト専用**(スクリーンショットを読めません)なので、抽出にはビジョンプロバイダーと組み合わせてください。OpenAIにデータを送信します(非ローカル)。`@openai/codex` がインストールされている必要があります。オプションの `DFIR_AI_CODEX_BIN` はPATH上にない `codex` を指します。設定 → AIにcodex接続ステータス(未インストール / 未接続 / 接続済み)とワンクリックの接続アクションが表示されます。
推奨: スクリーンショットには安価なビジョンモデル、テキストには強力な推論モデル。テキストモデルで節約しないでください — 弱いモデルはログトリアージを*サイレントに*失敗させ、誤ったイベントではなくイベントを返しません(`npm run eval:real` がまさにこれを測定します)。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_AI_SYNTH_PROVIDER` | = `DFIR_VISION_PROVIDER` | テキスト作業(CSV/ログ/合成)のプロバイダー |
| `DFIR_AI_SYNTH_MODEL` | = `DFIR_VISION_MODEL` | テキストモデルID — CSV/ログ抽出 + 合成(例: `gpt-4o`、`gemini-2.5-pro`、`claude-sonnet-4-6`) |
| `DFIR_AI_SYNTH_KEY` | = `DFIR_VISION_KEY` | テキストモデルのAPIキー |
| `DFIR_AI_SYNTH_BASE_URL` | = `DFIR_VISION_BASE_URL` | 合成のベースURL |
### AI — Velociraptorハントモデル(オプション)
Velociraptor VQLハント(*Suggest Velociraptor hunts* / *Fleet Hunts* 機能)の生成**のみ**に使用される専用モデルで、抽出/合成/OCRとは別です — 多くのモデルはVQLを失敗させます。**設定 → AI**でも編集可能です。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_AI_VELO_PROVIDER` | `openrouter` | VQLハント生成のプロバイダー |
| `DFIR_AI_VELO_MODEL` | `anthropic/claude-haiku-4.5` | VQLハント生成のモデルID |
| `DFIR_AI_VELO_KEY` | = `DFIR_VISION_KEY` | APIキー(空欄の場合はメインキーを再利用) |
| `DFIR_AI_VELO_BASE_URL` | = `DFIR_VISION_BASE_URL` | ベースURLの上書き |
### AI — カスタムプロンプト(オプション)
各プロンプトには2つの上書き形式があります(優先順): `DFIR_AI_<NAME>_PROMPT`(インラインテキスト、起動時に読み込み)と `DFIR_AI_<NAME>_PROMPT_FILE`(ファイルへのパス、呼び出しごとに再読み込み — 編集すると即座に適用されます)。`npm run prompts:eject` は組み込みのデフォルトを出発点として書き出します。
| プロンプト名 | `<NAME>` トークン |
|---|---|
| スクリーンショットごとの抽出 | `SYSTEM` |
| CSVインポートトリアージ | `CSV` |
| ログインポートトリアージ | `LOG` |
| ホリスティック合成 | `SYNTH` |
| ケースQ&A | `ASK` |
| エグゼクティブサマリー | `EXEC` |
| ナラティブタイムライン | `NARRATIVE` |
| 推奨フリートハント | `HUNTS` |
| 推奨プレイブックハント | `PBHUNTS` |
| タイムラインギャップ仮説 | `GAPHYP` |
| クエリトランスレーター(NL → クエリ) | `QUERYXLATE` |
### 脅威インテリジェンスエンリッチメント(オプション — デフォルトでオフ)
キーを追加するとそのプロバイダーが有効になります。すべての外部プロバイダーはダッシュボードからケース単位でオプトインします。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_VT_KEY` | — | VirusTotal APIキー(ハッシュ / IP / ドメイン / URL) |
| `DFIR_HUNTINGCH_KEY` | — | Hunting.ch(MalwareBazaar · ThreatFox · URLhaus · YARAify)のabuse.ch Auth-Key。`DFIR_MB_KEY` にフォールバックします |
| `DFIR_MB_KEY` | — | レガシーなabuse.chキー — Hunting.chを強化します。`DFIR_HUNTINGCH_KEY` を推奨 |
| `DFIR_ABUSEIPDB_KEY` | — | AbuseIPDB APIキー(IPレピュテーション) |
| `DFIR_CROWDSTRIKE_CLIENT_ID` | — | CrowdStrike Falcon TI OAuth2クライアントID |
| `DFIR_CROWDSTRIKE_CLIENT_SECRET` | — | CrowdStrike OAuth2シークレット(*Indicators: Read* + *MalQuery: Read* が必要) |
| `DFIR_CROWDSTRIKE_CLOUD` | `us-1` | テナントクラウド: `us-1` \| `us-2` \| `eu-1` \| `gov-us-1` \| `gov-us-2` |
| `DFIR_CROWDSTRIKE_BASE_URL` | クラウドから | 明示的なAPIベースURL(`DFIR_CROWDSTRIKE_CLOUD` を上書き) |
| `DFIR_ROCKYRACCOON_KEY` | — | Windowsプロセス普及率 / LOLBIN / ATT&CKのためのRockyRaccoonキー |
| `DFIR_MISP_URL` | — | MISPインスタンスURL — エンリッチメントとプッシュの両方にURL + キーが必要 |
| `DFIR_MISP_KEY` | — | MISP API認証キー |
| `DFIR_MISP_CA` | — | 内部CAのMISP用PEM CAバンドル(検証はオンのまま) |
| `DFIR_MISP_INSECURE` | — | `=1` でTLS検証をスキップ(ラボのみ) |
| `DFIR_MISP_DISTRIBUTION` | `0` | 新規イベントの配布: `0`=org、`1`=community、`2`=connected、`3`=all |
| `DFIR_MISP_ANALYSIS` | `1` | 新規イベントの分析状態: `0`=initial、`1`=ongoing、`2`=complete |
| `DFIR_MISP_TIMELINE_LIMIT` | `5000` | プッシュごとの最大フォレンジックタイムラインイベント数。上限を超えると最も重大なものが保持され、プッシュが警告します |
| `DFIR_YETI_URL` | — | YETIインスタンスURL — URL + キーの両方が必要 |
| `DFIR_YETI_KEY` | — | YETI APIキー |
| `DFIR_YETI_CA` | — | 内部CAのYETI用PEM CAバンドル |
| `DFIR_YETI_INSECURE` | — | `=1` でTLS検証をスキップ(ラボのみ) |
| `DFIR_OPENCTI_URL` | — | OpenCTIインスタンスURL — URL + キーの両方が必要(hash/ip/domain/url) |
| `DFIR_OPENCTI_KEY` | — | OpenCTI APIトークン |
| `DFIR_OPENCTI_CA` | — | 内部CAのOpenCTI用PEM CAバンドル |
| `DFIR_OPENCTI_INSECURE` | — | `=1` でTLS検証をスキップ(ラボのみ) |
| `DFIR_OPENCTI_MALICIOUS_SCORE` | `75` | 悪意あり判定の `x_opencti_score` しきい値 |
| `DFIR_RDAP_URL` | `https://rdap.org` | WHOIS-over-RDAPベース(キー不要。所有RIRへのIANAブートストラップ) |
| `DFIR_GEOIP_URL` | `https://ipinfo.io/{ip}/json` | GeoIP URLテンプレート(キー不要のHTTPS。`{ip}` が置換されます。パーサーはip-api.com + ipwho.isも許容します) |
| `DFIR_GEOIP_KEY` | — | オプションのGeoIPキー(`{key}` を埋めるか、`?token=` として追加)有料/自己ホストのバックエンド用 |
| `DFIR_SHODAN_KEY` | — | Shodan APIキー — ShodanホストルックアップIPエンリッチャーも強化します(顧客露出と共有) |
| `DFIR_HASHLOOKUP_URL` | `https://hashlookup.circl.lu` | CIRCL hashlookupベース(ハッシュIOC用のキー不要の既知ファイルルックアップ)。自己ホスト/エアギャップミラー用に上書き |
| `DFIR_ENRICH_DELAY_MS` | `1500` | ルックアップ間のスロットル(ms) |
| `DFIR_ENRICH_JITTER_MS` | `0` | 呼び出し間の待機に加える±ランダムジッター(ms)。整列/並列実行を分散させ、すべてが同時にプロバイダーのレート制限ウィンドウに当たらないようにします |
| `DFIR_ENRICH_RETRIES` | `2` | 429に当たったプロバイダー呼び出しの再試行回数。プロバイダーが送信する場合は `Retry-After` を尊重し、その後エラーとしてカウントされます |
| `DFIR_ENRICH_RETRY_BACKOFF_MS` | `1000` | プロバイダーが `Retry-After` を送らなかった場合の最初の429再試行前の基本バックオフ(試行ごとに倍増、最大30秒) |
| `DFIR_ENRICH_MAX` | `100` | エンリッチバッチごとにクエリされる最大IOC数(ハッシュ/IPが最初) |
| `DFIR_ENRICH_MAX_BATCHES` | `20` | 1回のエンリッチキックが連鎖できる上限付きバッチ数。`DFIR_ENRICH_MAX` より多くのIOCを持つケースは上限で停止しなくなりました: 実行が保存され、中断した場所から次のバッチを開始し、この数まで続きます。`1` は古い単一実行の動作を復元します。上限がまだ残すものはステータス行に報告され、サイレントに破棄されません |
| `DFIR_ENRICH_HEALTH_TTL_MS` | `60000` | 自己ホストプロバイダーのup/down判定をキャッシュ(ms) |
| `DFIR_ENRICH_HEALTH_POLL_MS` | `60000` | ダウンプロバイダーの再プローブ間隔。`0` でバックグラウンドポーラーを無効化 |
### 顧客露出(オプション)
**被害組織自身**のドメイン/メールを侵害データベースと照合します — 攻撃者/IOCドメインは決して対象にしません。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_HIBP_KEY` | — | Have I Been Pwned APIキー |
| `DFIR_HIBP_USER_AGENT` | `DFIR Companion` | HIBP User-Agentヘッダー |
| `DFIR_LEAKCHECK_KEY` | — | LeakCheck Pro APIキー |
| `DFIR_LEAKCHECK_DOMAIN_LIMIT` | `1000` | ドメイン検索ごとの最大レコード数 |
| `DFIR_DEHASHED_KEY` | — | DeHashed v2 APIキー |
| `DFIR_DEHASHED_BASE_URL` | DeHashedのデフォルト | DeHashed APIベースURLの上書き |
| `DFIR_SHODAN_KEY` | — | Shodanキー(ドメイン → 露出ホスト / ポート / CVE。メールルックアップなし) |
| `DFIR_EXPOSURE_DELAY_MS` | `1500` | プロバイダールックアップ間のスロットル(ms) |
### DFIR-IRISプッシュ / インポート(オプション)
有効にするにはURLとキーの両方が必要です。同じ接続が **Push to DFIR-IRIS** と **Import from IRIS**(既存のIRISケースのアセット/IOC/タイムラインをケースにプル)の両方を強化します。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_IRIS_URL` | — | IRISインスタンスURL |
| `DFIR_IRIS_KEY` | — | IRIS APIキー |
| `DFIR_IRIS_CA` | — | 内部CAのIRIS用PEM CAバンドル |
| `DFIR_IRIS_INSECURE` | — | `=1` でTLS検証をスキップ(ラボのみ) |
| `DFIR_IRIS_CUSTOMER_ID` | `1` | 新規IRISケースの顧客ID(プッシュ) |
| `DFIR_IRIS_CLASSIFICATION_ID` | `1` | 新規IRISケースの分類ID(プッシュ) |
### Timesketchプッシュ(オプション)
プッシュを有効にするにはURL + ユーザー + パスワードがすべて必要です。JSONLへのエクスポートは設定なしで機能します。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_TIMESKETCH_URL` | — | TimesketchインスタンスURL |
| `DFIR_TIMESKETCH_USER` | — | ローカル認証ユーザー名 |
| `DFIR_TIMESKETCH_PASSWORD` | — | ローカル認証パスワード |
| `DFIR_TIMESKETCH_TIMELINE` | `DFIR-Companion Forensic Timeline` | 管理対象タイムライン名 |
| `DFIR_TIMESKETCH_CA` | — | 内部CAのTimesketch用PEM CAバンドル |
| `DFIR_TIMESKETCH_INSECURE` | — | `=1` でTLS検証をスキップ(ラボのみ) |
### Notionエクスポート(オプション)
トークンだけで有効になります。対象のページ/データベースをインテグレーションと共有してください。「新規ページ」にはデータベースまたは親ページが必要です(環境デフォルトまたはエクスポートごとに入力)。「既存ページ」は貼り付けたページを更新します。
| 変数 | デフォルト | 意味 |
|---|---|---|
| `DFIR_NOTION_TOKEN` | — | 内部インテグレーションシークレット(Notion: 設定 → 接続 → 独自に開発) |
| `DFIR_NOTION_DATABASE_ID` | — | 「新規ページ」エクスポートのデフォルトデータベース(調査テンプレート) |
| `DFIR_NOTION_PARENT_PAGE_ID` | — | 代替デフォルト: この親ページの下に新規ページを作成 |
| `DFIR_NOTION_CONTAINER_TITLE` | `🔍 DFIR Companion — Auto-generated` | Companionが所有する管理ブロックのタイトル |
| `DFIR_NOTION_MAX_TIMELINE` | `500` | Notionに書き込まれる最大タイムライン行数 |
| `DFIR_NOTION_CA` | — | プロキシが内部CAを使用する場合のPEM CAバンドル |
| `DFIR_NOTION_INSECURE` | — | `=1` でTLS検証をスキップ(ラボのみ) |
### Velociraptorライブハント + トリアージバンドル(オプション)
`DFIR_VELOCIRAPTOR_API_CONFIG` を設定して有効にします。設定は次のコマンドで一度生成します:```
velociraptor --config server.config.yaml config api_client --name dfir --role administrator,api api.config.yaml
トリアージバンドル(Settings → Velociraptor タブ): Browse server artifacts はサーバーの収集可能な
CLIENT アーティファクトを一覧表示します。名前付きの バンドルを組み立てて保存します(3 つが組み込みで同梱 — Best Practice(クイックウィンスイープ)、Super-Timeline Triage(生のホストアーティファクト。スーパータイムラインのみにルーティング)、**Linux
DFIR_DEDUP=offで無効化)DFIR_OCR_SEARCH=offで無効化、npm run ocr-indexでバックフィル)127.0.0.1。認識されないホスト名を拒否し、DNSリバインディング攻撃を封じます(DFIR_ALLOWED_HOSTS)eve.jsonalert_fastyara -s -mscorethreat_level%ASA-#-######:<PRI>1 …Mmm dd …event.severity_label/api/events/api/sigma-alertslog show --style jsoncom.apple.quarantine.sfl2audit.k8s.iocolumnssnapshotpsortreport.json-r jsonmemory_payload.jsonyarascan_results.jsonl.eml.msg.bash_history.zsh_historyHISTTIMEFORMAT#epochaudit.logausearchaureportjournalctl -o json-o json-pretty-jalerts.jsonGET /security/eventsrule.levelcmd.exenltest、Get-AD*、ntdsutil … ifm および類似のものが 4104/4103 レコードからそのテクニックとともに読み出されるssl/x509、Suricata tls) は関係ごとおよび証明書ごとに 1 行になる; DNS 応答は TTL 内で同じクライアントの後の接続に結合される; Web リクエストチェーンは両方のレコードが持つ識別子のみで結合されるDFIR_SYNTH_ADVERSARY_HINTStags.yaml) — ルールエンジンがイベントにタグを付け、重大度を引き上げ、MITREテクニックを統合-enc、[Convert]::FromBase64String)を自動デコード。隠されたIOCを抽出。[Decoded]ブロックを表示process_creationルールはSysmon / 4688履歴もハントPOST /cases/:id/push経由でアラートをプッシュ(SIEM webhook、Velociraptorモニター、スクリプト)DFIR_FORENSIC_MIN_SEVERITY+ケースごとのオーバーライドで設定可能。昇格はゲートをバイパスし、IOCはすべてのイベントから依然として抽出されるDetectRaptor.Windows.Detection.MFT)別にイベントを表示/非表示。フォレンジックとスーパーの両タイムラインでj/kがForensic Timelineでフォーカス行ハイライトを移動、fがスター、iが手動IOCフォームをプリフィル、pが引用された所見をピン、nがコメントを開く、?がチートシートを表示。Settings → Generalでトグル可能、デフォルトオンPUT /cases/:id/correlation-profile/dfir findings、/dfir iocs malicious、/dfir ask …。チャンネルをケースにバインドし、AI予算を使える人を許可リスト化 (#235)/mobile)。オフラインアプリシェル/cases/:id/present): 大きなカード、キーボードナビ、自動送り、重大度フィルター、レポートテンプレートブランディング。自己完結型オフラインHTMLデッキをエクスポート (#177)npm run seed-demoでGlobalTechシナリオをシードreanalyze、synthesize、coverage、verify:ai、clean-timeline| 変数 | デフォルト | 意味 |
|---|
DFIR_VELOCIRAPTOR_API_CONFIG | — | api_client 設定ファイルへのパス |
DFIR_VELOCIRAPTOR_BINARY | velociraptor | 実行ファイルのパス(Windows では .exe のフルパス) |
DFIR_VELOCIRAPTOR_GUI_URL | — | 起動したハントへのディープリンク用 GUI ベース URL |
DFIR_VELOCIRAPTOR_ORG | root | ディープリンクの ?org_id= 用の組織(GUI が要求する。# フラグメントの前) |
DFIR_VELOCIRAPTOR_TIMEOUT_MS | 60000 | クエリごとのタイムアウト(ミリ秒) |
DFIR_VELOCIRAPTOR_MAX_ROWS | 1000 | ダッシュボードに返される最大行数 |
DFIR_VELOCIRAPTOR_MAX_OUTPUT | 52428800 | 対話型クエリ出力バイト数のハード上限(50 MB) |
DFIR_VELOCIRAPTOR_COLLECT_MAX_OUTPUT | 268435456 | バンドルハント収集用のより大きな上限(行 + アップロードされた JSON。THOR/Hayabusa は大容量)。これを超えるアーティファクト/アップロードはスキップされ(ログ記録)、致命的ではない — 残りは引き続きインポートされる。 |
DFIR_VELO_HUNT_WAIT_MIN | 10 | トリアージバンドルハントが自動収集するまでのデフォルト分数(実行ごと + バンドルごとに上書き可能。1〜1440 にクランプ) |
DFIR_VELOCIRAPTOR_UPLOAD_VQL | — | 上級者向け: ハントのアップロードされたテキストレポート(json/jsonl/ndjson/csv/txt/log。バージョンに敏感。__HUNT_ID__ プレースホルダーを保持)を読み取る VQL を上書き |
DFIR_VELOCIRAPTOR_FLOW_UPLOAD_VQL | — | 上級者向け: 外部から貼り付けられた単一フローのアップロードされたレポート(__CLIENT_ID__/__FLOW_ID__ プレースホルダーを保持)を読み取る VQL を上書き |
DFIR_HUNT_SUGGEST_MAX | 8 | 生成ごとに返される AI 提案のフリートハントの最大数(AI プロバイダーが必要。Velociraptor API は不要) |
DFIR_PBHUNT_SUGGEST_MAX | 30 | 生成ごとに返される AI 提案のプレイブックハントの最大数(エンドポイント関連タスクごとに 1 つ。AI プロバイダーが必要) |