OpenAICloudflare Developer Platform2026/04/13 0:00

Containers, Agents - Secure credential injection and dynamic egress policies for Sandboxes

要点だけを先に読めるように短く再構成したセクションです。

元記事

Quick Digest

要約

要点だけを先に読めるように短く再構成したセクションです。

openaijamodel: gpt-5-mini-2025-08-07

Sandboxes向けの安全な資格情報注入と動的イグレスポリシー

Key Points

  • シークレットはサンドボックス外で注入
  • インスタンス毎の一時CAでTLS復号
  • 実行中にイグレスを動的変更可能

Summary

CloudflareのSandbox/Containersで、Outbound Workersを使ったゼロトラストな資格情報注入、TLSインターセプト、allow/denyホストリスト、インスタンス単位の動的イグレスポリシーが利用可能になりました。サンドボックス内の未信頼ワークロードに秘密を渡さずに、外向き通信を細かく制御できます。

Key Points

  • 資格情報注入: Outbound handler(Workersランタイム)がenv.SECRET等の秘密をリクエストに付与。トークンはサンドボックスに渡らず、ctx.containerIdでインスタンス別の鍵を取得可能(例: await env.KEYS.get(ctx.containerId))。
  • TLSインターセプト: 各インスタンスに一時的なCAと鍵を生成。CAはサンドボックス内で信頼されるが、プライベート鍵はサイドカーに残り共有されない。HTTPSを含む透過プロキシが可能。
  • ホスト制御: allowedHosts / deniedHosts(グロブ対応)。allowedHosts設定時はデフォルト拒否の許可リストとなる。
  • 動的ハンドラ: outboundHandlersを定義し、setOutboundHandler() / setOutboundByHost()で実行中インスタンスのイグレスポリシーを変更できる。ハンドラはparamsを受け取りインスタンス毎に挙動を変えられる。

Quick actions for engineers

  • 実装に使う主要API: outboundByHost, outboundHandlers, setOutboundHandler, setOutboundByHost, allowedHosts, deniedHosts
  • シークレット運用: 秘密はWorker側でローテーション可能。サンドボックスに秘密を渡さないので安全に即時反映できる。
  • バージョン: @cloudflare/containers@0.3.0 または @cloudflare/sandbox@0.8.9 にアップグレードしてください。

References

  • ドキュメント: Sandbox outbound traffic / Container outbound traffic

Full Translation

翻訳

原文の流れを保ったまま読める翻訳セクションです。

openaijamodel: gpt-5-mini-2025-08-07

Containers、Agents - サンドボックス向けの安全な資格情報注入と動的な送信ポリシー

サンドボックス向けの安全な資格情報注入と動的な送信(egress)ポリシー

Outbound Workers for Sandboxes and Containers は、ゼロトラストの資格情報注入、TLS インターセプション、許可/拒否リスト、およびインスタンスごとの動的な送信ポリシーをサポートするようになりました。これらの機能により、プラットフォームはユーザー生成コードやコーディングエージェントなどの信頼されていないワークロードに秘密情報を渡すことなく、サンドボックスから外部へ出ていく通信を完全に制御できます。

資格情報注入 (Credential injection)

Outbound ハンドラは Workers ランタイムで動作し、サンドボックスの外側にあるため、サンドボックスが直接見ることのない秘密情報を保持できます。サンドボックス内のワークロードは平文のリクエストを行い、リクエストが上流に転送される前に資格情報が透過的に付与されます。例えば、サンドボックス内でエージェントを動かし、そのエージェントが Github に対して行うリクエストを認証付きにすることができますが、エージェントが資格情報にアクセスすることは決してできません。

TypeScript
export class MySandbox extends Sandbox {}
MySandbox.outboundByHost = {
  "github.com": (request: Request, env: Env, ctx: OutboundHandlerContext) => {
    const requestWithAuth = new Request(request);
    requestWithAuth.headers.set("x-auth-token", env.SECRET);
    return fetch(requestWithAuth);
  },
};

コードの説明:

  • トークン(資格情報)はサンドボックス内に渡されません。
  • Worker 環境でシークレットをローテーションすれば、すべてのリクエストは即座に新しい資格情報を参照します。

インスタンスごとにユニークな資格情報を注入するには、ctx.containerId を使うと簡単です。

TypeScript
MySandbox.outboundByHost = {
  "my-internal-vcs.dev": async (request: Request, env: Env, ctx: OutboundHandlerContext) => {
    const authKey = await env.KEYS.get(ctx.containerId);
    const requestWithAuth = new Request(request);
    requestWithAuth.headers.set("x-auth-token", authKey);
    return fetch(requestWithAuth);
  },
};

TLS インターセプション (TLS interception)

Outbound Workers は HTTPS トラフィックをインターセプトできるようになりました。各サンドボックスインスタンスごとに一意のエフェメラル(短期)証明書局(CA)と秘密鍵が作成されます。CA はサンドボックス内に配置され、デフォルトで信頼されます。エフェメラルな秘密鍵はコンテナランタイムのサイドカープロセスから決して外に出ず、インスタンス間で共有されることはありません。

TLS インターセプションが有効な場合、Outbound Workers は HTTP と HTTPS の両方のトラフィックに対して透過的プロキシとして機能できます。

許可/拒否ホスト(Allow and deny hosts)

allowedHostsdeniedHosts を使ってアウトバウンドトラフィックを簡単にフィルタリングできます。allowedHosts が設定されると、デフォルトで拒否する allowlist(deny-by-default の allowlist)になります。両方のプロパティは glob パターンをサポートします。

TypeScript
export class MySandbox extends Sandbox {
  allowedHosts = [
    "github.com",
    "npmjs.org",
  ];
}

動的なアウトバウンドハンドラ(Dynamic outbound handlers)

名前付きのアウトバウンドハンドラを定義しておき、setOutboundHandler()setOutboundByHost() を使ってランタイムで適用・削除できます。これにより、サンドボックスを再起動することなく実行中のサンドボックスの送信ポリシーを変更できます。

TypeScript
export class MySandbox extends Sandbox {}
MySandbox.outboundHandlers = {
  allowHosts: async (req: Request, env: Env, ctx: OutboundHandlerContext) => {
    const url = new URL(req.url);
    if (ctx.params.allowedHostnames.includes(url.hostname)) {
      return fetch(req);
    }
    return new Response(null, { status: 403 });
  },
  noHttp: async () => {
    return new Response(null, { status: 403 });
  },
};

コードの説明:

  • ハンドラは名前付きで定義され、パラメータを受け取れるため、インスタンスごとに挙動をカスタマイズできます(ハンドラ関数を個別に定義する必要はありません)。

ワーカー側からプログラム的にハンドラを適用する例:

TypeScript
const sandbox = getSandbox(env.Sandbox, userId);
// セットアップ時にネットワークを開放
await sandbox.setOutboundHandler("allowHosts", {
  allowedHostnames: ["github.com", "npmjs.org"],
});
await sandbox.exec("npm install");
// セットアップ後にロックダウン
await sandbox.setOutboundHandler("noHttp");
  • ハンドラは params を受け取れるため、インスタンスごとの挙動を単一のハンドラで制御できます。

はじめに (Get started)

これらの機能を利用するには、@cloudflare/containers@0.3.0 または @cloudflare/sandbox@0.8.9 にアップグレードしてください。詳細は「Sandbox outbound traffic」と「Container outbound traffic」を参照してください。