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

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

リクエストがサーバーに届くまで

すべてのリクエストはエッジで TLS 終端し、プロキシが認可して、テナント専用の microVM へルーティングされます。復号鍵はリクエストごとに外部 Vault から取得し、ホストには保存しません。

2つの層による多層防御

制御はソフトウェア(アプリケーション層)と、OS・ハイパーバイザ・ネットワーク(インフラ層)の両方で強制します。どちらも相手を暗黙に信頼しません。

NodeFlare のセキュリティ
アプリケーション層
認証とセッション(OAuth / メール、JWT+リフレッシュ)
リクエストごとの認可とテナントスコープ
シークレットと GitHub トークンのエンベロープ暗号化
IP 詐称を防ぐ client-IP 復元・inbound IP 許可リスト
レート制限・ブルートフォースロックアウト・spend cap
監査/拒否ログ・依存 CVE の継続修正
インフラ層
テナントごとの Firecracker microVM(jailer 配下)
ビルドは使い捨て microVM 内で実行
デフォルト拒否のホストファイアウォール(nftables)
スナップショットの保管時暗号化
鍵は外部 Vault(OpenBao Transit)
TLS エッジ・WireGuard 接続・堅牢化した SSH

各サーバーは共有コンテナではなく専用マシン

各 MCP サーバーは専用の Firecracker microVM — 独自カーネルを持つ本物のハードウェア仮想化ゲスト — で、jailer 配下で起動します。テナント間でランタイムを共有しないため、あるサーバー内部が侵害されても他を覗くことも触ることもできません。

FirecrackerjailerKVMcgroup v2seccomp
  • テナントごとの 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. scale-to-zero

    アイドルのサーバーをスナップショット化(メモリ+ディスク)して停止。

    詳しく
  2. 暗号化

    スナップショットごとの DEK(AES-256-GCM)で暗号化、DEK を Vault で wrap し平文を削除。

    詳しく
  3. 保管時

    ディスク上では暗号文のみ。テナントの Vault アクセスなしには読めません。

    詳しく
  4. 再開

    次のリクエストで DEK を unwrap・復号し、ミリ秒で復元。

    詳しく

デフォルトでゼロトラスト

すべてのテナントのコードを「敵対的でありうる」前提で扱います — オプトインではなく常時。どの層も他層を暗黙に信頼せず、あらゆる境界を検証します。

コードは敵対的と仮定する。すべての境界を検証する。最小権限で与える。影響範囲を封じ込める。

あらゆる境界を強制

テナント ↔ テナント
別 microVM+東西通信を drop → 相互に到達不可
テナント ↔ 制御面
inbound デフォルト拒否 → builder・Redis・code-runner に到達不可
テナント ↔ 内部/メタデータ
drop(169.254.x のクラウドメタデータ含む)
サービス ↔ サービス
定数時間比較のローテーショントークン。未設定なら実行を無効化(fail-close)
誰が呼んだか
信頼できる hop からのヘッダのみ信頼 → IP 詐称不可
鍵アクセス
ホストにマスター鍵なし。Vault でテナント単位にスコープ

仮に1サーバーが侵害されても到達できないもの

封じ込めが肝心:ある microVM 内の侵害はそこに留まります。

  • 他テナントの VM・データ
  • ホスト制御面
  • 内部サブネット・クラウドメタデータ
  • 他テナントのシークレット(テナント専用鍵)
  • 休眠スナップショット(暗号文のみ)

単一障害が致命傷にならない多層構造

暗号化された TLS エッジ
デフォルト拒否のネットワーク
jailer 配下のテナント専用 microVM
エンベロープ暗号化されたシークレットとスナップショット

邪魔をしないレート制限

方針はひとつ:乱用・総当り・フラッドは止め、正規の運用トラフィックは絶対に絞らない。確立済みセッションでエージェントがツールを連打するのは正常な挙動で無制限のまま。乱用はリクエストを絞るのではなく、クォータと 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 + jailer(KVM・非root・seccomp・cgroup v2)
シークレット暗号化
AES-256-GCM エンベロープ + OpenBao Transit(テナント専用 KEK)
ネットワーク
nftables デフォルト拒否・東西/メタデータ遮断・egress 許可リスト
ビルド
使い捨て microVM 内の buildkit・OCI イメージ受け渡し
保管時
スナップショットごとの AES-256-GCM・鍵は Vault で wrap
トランスポート
TLS(ワイルドカード)エッジ・WireGuard 接続
運用アクセス
鍵認証のみの SSH・root 直禁止・fail2ban・秘密ファイル 600

よく聞かれること

自分のサーバーは他人とランタイムを共有しますか?

いいえ。各サーバーは独自カーネルを持つ専用 Firecracker microVM で動作します。テナント間で共有するコンテナランタイムはありません。

NodeFlare は私のシークレットを読めますか?

シークレットは外部 Vault にあるテナント専用鍵でエンベロープ暗号化され、マスター鍵は実行ホストにありません。復号はテナント単位で、Vault 側で監査できます。

悪意ある MCP サーバーがデプロイされたら?

デフォルト拒否ネットワークの隔離 microVM で動きます。他テナント・制御面・内部サブネット・メタデータに到達できず、ビルドも使い捨て VM で済んでいます。

レート制限で忙しいエージェントが止まりませんか?

止まりません。確立済み MCP セッションのリクエスト量は絞りません。制限対象は総当り・フラッド・新規接続の乱用で、重い正規利用はプランのクォータで拘束します(リクエスト遮断ではありません)。

サーバーがアイドルのときデータは暗号化されますか?

はい。scale-to-zero のスナップショットは、Vault で包んだスナップショットごとの鍵で保管時暗号化されます。

責任ある開示

脆弱性を見つけたらお問い合わせからご連絡ください。協調的開示に沿って、迅速な初動とセーフハーバーのもとで一緒に対応します。