サンドボックス向けの安全な資格情報注入と動的な送信(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)
allowedHosts と deniedHosts を使ってアウトバウンドトラフィックを簡単にフィルタリングできます。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」を参照してください。