アプリからハードウェアまで、すべての層に組み込まれたセキュリティ

リクエストがサーバーに届くまで
すべてのリクエストはエッジで TLS 終端し、プロキシが認可して、テナント専用の microVM へルーティングされます。復号鍵はリクエストごとに外部 Vault から取得し、ホストには保存しません。
2つの層による多層防御
制御はソフトウェア(アプリケーション層)と、OS・ハイパーバイザ・ネットワーク(インフラ層)の両方で強制します。どちらも相手を暗黙に信頼しません。
各サーバーは共有コンテナではなく専用マシン
各 MCP サーバーは専用の Firecracker microVM — 独自カーネルを持つ本物のハードウェア仮想化ゲスト — で、jailer 配下で起動します。テナント間でランタイムを共有しないため、あるサーバー内部が侵害されても他を覗くことも触ることもできません。
- テナントごとの Firecracker microVM=共有名前空間ではなくハードウェア(KVM)の隔離境界
- jailer 配下で起動:非root(uid996)・chroot・cgroup v2・seccomp
- 通常 VM も fork VM もそれぞれ専用のネットワーク名前空間
- boot/snapshot/restore/fork/永続ディスクの全ライフサイクルが jail 内
鍵はコードを動かすマシンに存在しない
シークレットはエンベロープ暗号化です。値ごとにデータ鍵(DEK、AES-256-GCM)で暗号化し、その DEK を外部 Vault にしか存在しないテナント専用鍵で包みます。マスター鍵は実行ホストに存在せず、復号には必ずそのテナントにスコープされた Vault への問い合わせが必要です。
暗号文と wrap した DEK は一緒に保存。鍵を解く鍵は Vault から出ません。
- 値ごとの DEK(AES-256-GCM)+テナント専用 KEK(OpenBao Transit)
- マスター鍵は実行ホストから完全に撤去
- 復号はテナント単位で、毎回 Vault を経由
- プライベートリポジトリ用 GitHub トークンも同方式
内も外もデフォルト拒否
ホストファイアウォール(nftables)はデフォルトで拒否します。テナント VM は必要な公開インターネットには出られますが、制御面・他テナント・クラウドメタデータからは遮断されます。サーバー単位の egress 許可リストで送信先をさらに絞れます。
許可
- 公開インターネットへの送信 — サーバー自身の API 呼び出しなど、必要な外向き通信は許可します。
- DNS と DHCP — 名前解決とアドレス割り当てに使う基本的な通信を許可します。
- 確立済みの戻り通信 — 自分で開いた接続に関連する応答トラフィックだけを通します。
遮断
- ホスト制御面 — builder・Redis・code-runner などの内部制御面には到達できません。
- 他テナントの VM — テナント間の東西通信は遮断され、互いに見えず触れません。
- 内部サブネット・メタデータ — 内部ネットワークや 169.254.x のクラウドメタデータを遮断します。
- ホストへの横移動 — loopback 経由でホストのサービスへ回り込むことはできません。
リポジトリのビルドは他に一切触れない
Dockerfile の RUN やインストール処理は任意コードです。NodeFlare はそれを共有ホストで動かさず、使い捨ての Firecracker microVM 内でビルドします。完成イメージはドライブ経由で OCI tar としてホストに渡され読み込まれます — ホストはあなたのビルド処理を実行しません。
ビルド VM は毎回破棄。悪意あるビルドも使い捨て VM 以外には影響しません。
- buildkit は使い捨て microVM 内で実行(ホストではない)
- イメージは出力ドライブ経由で OCI tar として搬出
- ホストはイメージを load するだけで RUN/postinstall を実行しない
- 失敗時は安全にフォールバック(記録付き)
眠っているサーバーも暗号化
サーバーが scale-to-zero すると、即座に再開できるようメモリとディスクがスナップショット化されます。そのスナップショットは Vault で包んだスナップショットごとの鍵で保管時暗号化され、休眠中のワークロードはディスク上では暗号文にすぎません。
デフォルトでゼロトラスト
すべてのテナントのコードを「敵対的でありうる」前提で扱います — オプトインではなく常時。どの層も他層を暗黙に信頼せず、あらゆる境界を検証します。
コードは敵対的と仮定する。すべての境界を検証する。最小権限で与える。影響範囲を封じ込める。
あらゆる境界を強制
仮に1サーバーが侵害されても到達できないもの
封じ込めが肝心:ある microVM 内の侵害はそこに留まります。
- 他テナントの VM・データ
- ホスト制御面
- 内部サブネット・クラウドメタデータ
- 他テナントのシークレット(テナント専用鍵)
- 休眠スナップショット(暗号文のみ)
単一障害が致命傷にならない多層構造
邪魔をしないレート制限
方針はひとつ:乱用・総当り・フラッドは止め、正規の運用トラフィックは絶対に絞らない。確立済みセッションでエージェントがツールを連打するのは正常な挙動で無制限のまま。乱用はリクエストを絞るのではなく、クォータと spend cap で経済的に拘束します。
制限するのは乱用であって、利用ではない。
API 層
| グローバル・IP別 | 1,000 req / 60s | ヘッダ付き 429。Redis 遅延時は fail-open |
| 認証ブルートフォース | 5回失敗/5分 → 15分ロックアウト | ログイン・更新・登録・パスワードリセット |
| WebSocket 接続 | 100 / 分 / IP | 複数タブを許容する緩さ |
| 重要アクション | 例:20 / 時 | アクション別・fail-open |
MCP データ経路(プロキシ)
| 資格情報 × サーバー | 100 req / 分(変更可) | in-process・ホットパスで Redis 往復ゼロ |
| IP別(公開サーバー) | 短窓 | 資格情報を持たないサーバー向け |
| 月次クォータ | プラン別 | 超過で 402。再起動をまたいで永続 |
| API キー総当り | 10回/5分 → 10分ロックアウト | Redis 権威・再起動/スケール耐性 |
ホスト層(ファイアウォール)
- SSH 新規接続:20 / 分 / IP
- Web 新規接続:100 / s(burst 200)
- 対象は NEW 接続のみ — 確立済み MCP セッションは素通し
認証・ロックアウトは Redis 権威で、再起動をまたいでも総当りを確実に止めます。一般的な制限は fail-open で、Redis の瞬断が正規トラフィックを止めることはありません。
他方式との比較
仕組みではなく結果で。
| 生のローカル stdio | 共有コンテナホスト | NodeFlare | |
|---|---|---|---|
| 隔離境界 | 自分のマシン | 共有カーネル/名前空間 | 専用 microVM(KVM) |
| テナント間の到達 | 該当なし | 脱獄時に可能 | ネットワークで drop |
| 保管時のシークレット | ディスク上に平文 | ホストから読めることが多い | エンベロープ暗号化・鍵は Vault |
| 実行ホスト上の鍵 | あり | 通常あり | なし(Vault のみ) |
| ビルド隔離 | 該当なし | 共有ホスト上 | 使い捨て microVM |
| 休眠中のデータ | 平文 | 平文 | 保管時暗号化 |
内部で使っている技術
実際に効かせている技術。
よく聞かれること
自分のサーバーは他人とランタイムを共有しますか?
いいえ。各サーバーは独自カーネルを持つ専用 Firecracker microVM で動作します。テナント間で共有するコンテナランタイムはありません。
NodeFlare は私のシークレットを読めますか?
シークレットは外部 Vault にあるテナント専用鍵でエンベロープ暗号化され、マスター鍵は実行ホストにありません。復号はテナント単位で、Vault 側で監査できます。
悪意ある MCP サーバーがデプロイされたら?
デフォルト拒否ネットワークの隔離 microVM で動きます。他テナント・制御面・内部サブネット・メタデータに到達できず、ビルドも使い捨て VM で済んでいます。
レート制限で忙しいエージェントが止まりませんか?
止まりません。確立済み MCP セッションのリクエスト量は絞りません。制限対象は総当り・フラッド・新規接続の乱用で、重い正規利用はプランのクォータで拘束します(リクエスト遮断ではありません)。
サーバーがアイドルのときデータは暗号化されますか?
はい。scale-to-zero のスナップショットは、Vault で包んだスナップショットごとの鍵で保管時暗号化されます。
責任ある開示
脆弱性を見つけたらお問い合わせからご連絡ください。協調的開示に沿って、迅速な初動とセーフハーバーのもとで一緒に対応します。