EmDash CMS プラグインランタイムとセキュリティモデル

EmDash が信頼済みとサンドボックス化されたプラグイン実行をどう分離するか、およびセキュリティ境界に Dynamic Workers がなぜ重要かを理解します。

このモデルが存在する理由

多くの CMS のプラグインエコシステムは同じ境界で失敗します。拡張が過剰な権限で動くことです。
EmDash はプラグイン実行モードを分離し、ケイパビリティの境界を明示することでこれに対処します。

二つの実行クラス

信頼済みプラグイン

  • アプリケーションのランタイムの一部として読み込まれる
  • 自社コードまたは完全に信頼できるコード向け
  • 運用は単純だが、セキュリティはレビュー規律に依存する

サンドボックス化されたプラグイン

  • 隔離されたワーカー環境で実行される
  • 信頼できない、または半信頼の拡張ロジック向け
  • 明示的なケイパビリティ、ランタイム制限、ネットワークルールで制約される

セキュリティの姿勢は、プラグインの意図よりランタイム隔離の保証に依存します。

アーキテクチャにおける Dynamic Workers

Dynamic Workers は、Cloudflare 上でサンドボックス実行の隔離プリミティブです。
これがなければサンドボックスモードは利用できず、信頼済みプラグイン前提でのみ運用すべきです。

実務上:

  • Free プラン: コア CMS は動くが、サンドボックス化されたプラグインモードは動かない
  • Dynamic Workers 付き有料プラン: サンドボックスモデルが利用可能になる

ケイパビリティモデル:デフォルトで最小権限

プラグインは必要なものだけを宣言すべきです。

  • コンテンツの読み取り
  • 特定のコンテンツ領域への書き込み
  • 外向きネットワークエンドポイントの呼び出し
  • 選択したワークフローフックのトリガー

ケイパビリティが付与されていない操作は決定的に失敗すべきです。これは設計要件であり、努力目標ではありません。

// 例: ケイパビリティのスコープを明示的に保つ
export default definePlugin({
  id: "notify-on-publish",
  capabilities: ["read:content", "email:send"]
});

重要なランタイムのガードレール

セキュリティと信頼性の両方が、ハードリミットに依存します。

  • CPU と壁時計の上限で暴走ハンドラを防ぐ
  • メモリ上限で悪用と偶発的なリークを抑える
  • ネットワークポリシーで恣意的な持ち出しを遮断する

これらの制御により、プラグインの失敗はプラットフォーム全体の停止ではなく境界のあるインシデントに留まります。

一枚の脅威モデル

第三者プラグインには次が含まれうると仮定します。

  • 悪意のある挙動
  • 古い依存関係
  • まれなイベントタイミングでのロジックバグ

したがってプラグインランタイムは次を保証すべきです。

  • 影響範囲の封じ込め
  • 特権操作はデフォルトで拒否
  • 監査可能な実行結果

信頼はインストールによって与えられるのではなく、ポリシーによって獲得されるべきです。

Free プランでの運用モデル

サンドボックスのサポートなしで運用する場合:

  • プラグイン集合を最小限に保つ
  • ファーストパーティまたは社内レビュー済みを優先する
  • リリースゲートで依存関係と権限をレビューする
  • リスクの高い連携は可能なら外部サービスに隔離する

多くのチームにとって実現可能なモデルですが、より強い統治の規律が必要です。

判断基準:いつサンドボックスモードを必須にするか

次のときはサンドボックスモードを必須とみなします。

  • 外部作者のプラグインを規模でインストールする
  • コンプライアンスがより強い隔離の証拠を要求する
  • プラグイン侵害の事業リスクが無視できない

次のときは任意でよいです。

  • プラグイン表面が小さく完全に監査されている
  • チームがリリースパイプラインを端到端で管理している

実践的な統治チェックリスト

本番でいかなるプラグインを有効にする前に:

  • プラグインのオーナーと目的を文書化する
  • 必要なケイパビリティと外向きエンドポイントをレビューする
  • ロールバック担当者と手順を決める
  • ステージングで障害注入を含め挙動を検証する

プラグインのセキュリティは一度きりのアーキテクチャ判断ではありません。ランタイム境界に裏打ちされた運用プロセスです。