<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on sonohen's tech blog</title><link>https://sonohen.net/tags/docker/</link><description>Recent content in Docker on sonohen's tech blog</description><generator>Hugo -- gohugo.io</generator><language>ja-JP</language><lastBuildDate>Mon, 02 Nov 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://sonohen.net/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>CodexをDocker Sandboxに隔離して安全に動かすためのチュートリアル</title><link>https://sonohen.net/posts/2026/11/02/</link><pubDate>Mon, 02 Nov 2026 00:00:00 +0000</pubDate><guid>https://sonohen.net/posts/2026/11/02/</guid><description>&lt;h2 id="課題感"&gt;課題感
&lt;/h2&gt;&lt;p&gt;AIエージェントは、人間やコンピュータから必要な情報を集め、それらと推論に基づいて自律的に計画を立てて、タスクを消化する。これは非常に便利なことであり、日々の仕事や作業の効率が上がっている印象がある。&lt;/p&gt;
&lt;p&gt;その一方で、昨今ニュースを賑わせたように、AIエージェントが暴走したときのことを考えたい。本来は見て欲しくないコンピュータ上の情報や、アクセスしてほしくないサイトにアクセスし、その結果として情報漏洩に繋がるケースもありえる。よって、「AIエージェントをどう動かすか」と同じかそれ以上に、「AIエージェントをどこで動かすか」も重要になっている。&lt;/p&gt;
&lt;p&gt;さて、「どこで動かすか」は、概ね以下のような考え方があるのではないかと思う。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;いつも使用しているコンピュータにAIエージェントをインストールして動作させる。&lt;/li&gt;
&lt;li&gt;何も入っていない専用のコンピュータで動作させる。&lt;/li&gt;
&lt;li&gt;仮想マシン上で動作させる。&lt;/li&gt;
&lt;li&gt;Dockerコンテナ上で動作させる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1.は、もはや論外と言ってもよいかもしれない。普段遣いの環境で、広い権限を与えて動かすことには、不安がある。
2.は、流行りの方法かもしれない。古いMacBook等を初期化して、その中でAIエージェントを動作させる。
3.は、ホストとAIエージェントを(ほぼ)完全に分離できる一方で、OSの維持が非常に面倒である。
4.は、3.よりは簡易であるものの、AIエージェントが本当に暴走した際にはホスト側のカーネルに触ることができる可能性があるし、3.と同じようにコンテナのメンテナンスの手間がかかる。&lt;/p&gt;
&lt;p&gt;今回紹介するDocker Sandboxは、3.と4.の合わせ技のような技術である。つまり、仮想マシンによる隔離と、コンテナのような扱いやすさを組合せ、AIエージェント専用の仮想マシンを手に入れることができる。
(無論、突き詰めればネットワークの分離、共有するファイル、外部との通信のあり方等を検討する必要は残る)&lt;/p&gt;
&lt;h2 id="検証目的"&gt;検証目的
&lt;/h2&gt;&lt;p&gt;以下の検証を目的とする。ちなみに[]内のキーワードは、&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/architecture/#follow-an-authenticated-request" target="_blank" rel="noopener"
 &gt;Follow an authenticated request&lt;/a&gt;の箱を指しており、今回の検証でDocker Sandbox全体の概要を掴みたいと思う。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NixOSで、最新のDocker Sandboxを動作させる方法を確立する [SANDBOX MICROVM]。&lt;/li&gt;
&lt;li&gt;Codexの認証は、APIキーではなくOAuth認証で行い、既存のサブスクリプションを変更せずとも使用できることを確認する [Model Provider]。&lt;/li&gt;
&lt;li&gt;秘密情報をSandbox内部に保存することなく、認証が必要な外部サービスを利用する方法を確認する。そのため、今回はGitHubリポジトリへのアクセスを検証する [Host-side proxy/Credential store]。&lt;/li&gt;
&lt;li&gt;Docker Sandboxが予め許可しているドメインに加え、自身が承認したドメインへの通信を許可する方法を確認する [Network Policy]。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="検証環境"&gt;検証環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;マシン&lt;/strong&gt;&lt;/strong&gt;: ThinkPad E14 Gen 3 (AMD/ 24GB RAM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;OS&lt;/strong&gt;&lt;/strong&gt;: NixOS 26.05&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;sbx (Docker Sandbox)&lt;/strong&gt;&lt;/strong&gt;: 0.50.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="検証"&gt;検証
&lt;/h2&gt;&lt;h3 id="nixosで-最新のdocker-sandboxを動作させる方法を確立する-sandbox-microvm"&gt;NixOSで、最新のDocker Sandboxを動作させる方法を確立する [SANDBOX MICROVM]
&lt;/h3&gt;&lt;h4 id="docker-sandboxをインストールする"&gt;Docker Sandboxをインストールする
&lt;/h4&gt;&lt;p&gt;2026年11月2日現在、最新の&lt;a class="link" href="https://github.com/docker/sbx-releases" target="_blank" rel="noopener"
 &gt;Docker Sandbox&lt;/a&gt;は &lt;code&gt;0.50.1&lt;/code&gt; である。一方で、nixpkg(26.05)で配信されているDocker Sandboxは &lt;code&gt;0.34.0&lt;/code&gt; であり、約4ヶ月前のものである。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nix search nixpkgs sbx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* legacyPackages.x86_64-linux.docker-sbx (0.34.0)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Safe environments for agents&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;そこで、Docker Sandboxは、NixOSをサポートしてはいないものの、Linux (amd64) 向けのバイナリが公開されているので、それを利用する。
&lt;code&gt;configuration.nix&lt;/code&gt; に以下を追記する(必要な箇所のみ抜粋)。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;nix&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker-sbx-latest &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;docker-sbx&lt;span style="color:#f92672"&gt;.&lt;/span&gt;overrideAttrs (old: &lt;span style="color:#66d9ef"&gt;rec&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0.50.1&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; src &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fetchurl {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://github.com/docker/sbx-releases/releases/download/v&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;version&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/DockerSandboxes-linux-amd64.tar.gz&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hash &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sha256-es2HtXlRGbJO+6u3ZBtxRpBoPwRJJMcQrJtLq+dM1UY=&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Allow unfree software&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;allowUnfree &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment&lt;span style="color:#f92672"&gt;.&lt;/span&gt;systemPackages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker-sbx-latest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; users&lt;span style="color:#f92672"&gt;.&lt;/span&gt;users&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;user_name&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extraGroups &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#34;kvm&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NixOSの再構築を行い、ログオフ後にログインし直して変更を反映する。以下のコマンドを実行してバージョン情報が返ってくれば成功である。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx version v0.50.1 ddb0268d7124b9cf98955d0b08ffd71a0dfcebe4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="動作確認をする"&gt;動作確認をする
&lt;/h4&gt;&lt;p&gt;基本的には、以下のマニュアルに沿って確認していく。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/install/" target="_blank" rel="noopener"
 &gt;Install Docker Sandboxes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/agents/codex/" target="_blank" rel="noopener"
 &gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まずはKVMの状態を確認する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lsmod | grep kvm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvm_amd 249856 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ccp 192512 1 kvm_amd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvm 1421312 1 kvm_amd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;irqbypass 16384 1 kvm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;kvm&lt;/code&gt; グループに所属しているかを確認する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/group | grep sonohen&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wheel:x:1:sonohen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;networkmanager:x:57:nm-openvpn,sonohen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scanner:x:59:sonohen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvm:x:302:sonohen&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Docker Sandboxを動作させるには、Docker Accountが必須である。そのため、ここでdockerにログインする。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx login&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="codexの認証は-apiキーではなくoauth認証で行い-既存のサブスクリプションを変更せずとも使用できることを確認する-model-provider"&gt;Codexの認証は、APIキーではなくOAuth認証で行い、既存のサブスクリプションを変更せずとも使用できることを確認する [Model Provider]
&lt;/h3&gt;&lt;p&gt;次に、Codexの認証を行う。今回はChatGPTの3,000円プランで進めるためOAuthで認証する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx secret set openai --oauth&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;とりあえず &lt;code&gt;~/sbx-codex-work&lt;/code&gt; を作成し、その中でCodexを起動 (&lt;code&gt;sbx run codex&lt;/code&gt;) してみる。ここで重要なのは、以下の2点であるように思う。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sandbox内からどのサイトにアクセスできるかは、ユーザが制御できること。ここでは「Balanced(一般的な開発用サイト(github.com等)は許可されており、それ以外はユーザによる明示的な許可が必要)」を選択した。&lt;/li&gt;
&lt;li&gt;ホスト側にある &lt;code&gt;~/.codex/skills/&lt;/code&gt; は、Sandbox内では使用できないこと。ホスト側の設定やファイルをSandboxに持っていくことはなく、隔離されたCodexからはプロジェクトのフォルダ(起動フォルダと共有設定したリソース)しか参照できない(&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/agents/codex/#configuration" target="_blank" rel="noopener"
 &gt;Codex | Docker Docs&lt;/a&gt;)。そのため、 &lt;code&gt;~/.codex/skills/&lt;/code&gt; はSandbox内で使用することはできず、プロジェクトに保存したものを使うか、ホストの &lt;code&gt;~/.local/state/sandboxes/sandboxes/agent-skills&lt;/code&gt; に格納されたものを使う。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✓ started daemon (2s)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Choose the network policy for sandboxes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1. Open all network traffic allowed, no restrictions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 2. Balanced default deny, with common dev sites allowed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 3. Locked Down all network traffic blocked unless you allow it
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Choice [1-3, default 2]: 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Set network policy Balanced
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; try: sbx policy reset
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; or: sbx policy allow network HOST
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; or: sbx policy deny network HOST
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; or: sbx policy rm network HOST
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SANDBOX
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Name: codex-sbx-codex-work
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Agent: codex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Workspace: ~/sbx-codex-work (rw)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skills: 0 entries · linked, read-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Source: ~/.local/state/sandboxes/sandboxes/agent-skills
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Target: /home/agent/.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Image: docker/sandbox-templates:codex-docker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CPU: 12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Memory: 11.2 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IMAGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✓ image — ready
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✓ OpenAI — using stored OAuth credentials
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✓ Created sandbox codex-sbx-codex-work
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ○ codex — starting in sandbox codex-sbx-codex-work…
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; workspace /home/sonohen/sbx-codex-work&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、見慣れたCodexのTUI画面が表示される。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;_ OpenAI Codex (v0.165.0)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /home/sonohen/sbx-codex-work
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;permissions: YOLO mode&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;YOLO mode&lt;/code&gt; と表示されているとおり、 &lt;code&gt;codex&lt;/code&gt; は、特に指定しない限り &lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt; で起動している。&lt;/p&gt;
&lt;p&gt;ここまで終わったら、 &lt;code&gt;/quit&lt;/code&gt; と入力し、 &lt;code&gt;codex&lt;/code&gt; を終了(Sandboxから抜ける)しておく。&lt;/p&gt;
&lt;h3 id="秘密情報をsandbox内部に保存することなく-認証が必要な外部サービスを利用する方法を確認する-host-side-proxy-credential-provider"&gt;秘密情報をSandbox内部に保存することなく、認証が必要な外部サービスを利用する方法を確認する [Host-side proxy/Credential Provider]
&lt;/h3&gt;&lt;h4 id="おおまかな流れ"&gt;おおまかな流れ
&lt;/h4&gt;&lt;p&gt;まず、どのように認証済リクエストが流れていくかは、&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/architecture/#follow-an-authenticated-request" target="_blank" rel="noopener"
 &gt;Follow an authenticated request&lt;/a&gt;に記載がある。これによると、秘密情報はSandbox内部ではなくホスト側に保持していることから、Sandbox内の &lt;code&gt;codex&lt;/code&gt; からは参照できない仕組みになっている。厳密に言えば、秘密情報がSandbox内に保持される場合もあるのだが、それはあくまでもダミー値 (Sentinel) である。実際の値はホスト側の「Credential store」に格納され、「Host-side proxy」によって書き換えられる。今回は、Credential storeにGNOME Keyringが使用されている。&lt;/p&gt;
&lt;h4 id="docker-sandbox内からgithubにアクセスしてみる"&gt;Docker Sandbox内からGitHubにアクセスしてみる
&lt;/h4&gt;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/configuration/credentials/#built-in-services" target="_blank" rel="noopener"
 &gt;Built-in services&lt;/a&gt;によれば、 &lt;code&gt;sbx secret set github --command 'gh auth token'&lt;/code&gt; を実行することにより、GitHub CLIの認証情報をCredential storeに格納し、Docker Sandbox内から使用できるようにしてくれる。まずは &lt;code&gt;gh&lt;/code&gt; (GitHubのCLIクライアント)を使えるようにしなければならないのだが、私は普段、これを使用していない。検証のためにインストールするのもあれなので &lt;code&gt;nix-shell&lt;/code&gt; で対応する。以下のコマンドをホスト側で実行する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nix run nixpkgs#gh auth login
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx secret set github --command &lt;span style="color:#e6db74"&gt;&amp;#39;nix run nixpkgs#gh auth token&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これが終わったら以下のようなプロンプトを Codex に渡して設定を確認する。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;`sbx secret set github` しました。この設定が正しく行われていることを確認したいので、ためしにリポジトリの一覧を取得してください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ただしく設定されていれば、リポジトリの一覧が取得できる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub API への認証に成功しました。ユーザー sonohen として、非公開リポジトリを含む 44 件を取得できています。取得した一覧の一部（更新順）です。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;リポジトリ&lt;/th&gt;
 &lt;th&gt;公開設定&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;sonohen/sonohen.github.io&lt;/td&gt;
 &lt;td&gt;公開&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(以下、省略)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今回の場合、 &lt;code&gt;sbx secret set github&lt;/code&gt; した結果は、GNOME Keyringに保管される(&lt;a class="link" href="https://docs.docker.com/ai/sandboxes/configuration/credentials/#where-secrets-are-stored" target="_blank" rel="noopener"
 &gt;Where secrets are stored&lt;/a&gt;)。以下のコマンドで確認した。 &lt;code&gt;9&lt;/code&gt; という数字は環境に依存するので、適宜読み替えていただきたい。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;busctl --user get-property org.freedesktop.secrets /org/freedesktop/secrets/collection/login/9 org.freedesktop.Secret.Item Label&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s &amp;#34;com.docker.sandboxes:sandboxes:docker/sandbox/credentials/_/github&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;busctl --user get-property org.freedesktop.secrets /org/freedesktop/secrets/collection/login/9 org.freedesktop.Secret.Item Attributes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a{ss} 4 &amp;#34;id&amp;#34; &amp;#34;docker/sandbox/credentials/_/github&amp;#34; &amp;#34;service:group&amp;#34; &amp;#34;com.docker.sandboxes&amp;#34; &amp;#34;service:name&amp;#34; &amp;#34;sandboxes&amp;#34; &amp;#34;xdg:schema&amp;#34; &amp;#34;org.freedesktop.Secret.Generic&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみにこの階層構造は以下のコマンドで確認できる。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;busctl --user tree org.freedesktop.secrets&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─ /org
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├─ /org/freedesktop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├─ /org/freedesktop/portal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └─ /org/freedesktop/portal/desktop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └─ /org/freedesktop/portal/desktop/request
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └─ /org/freedesktop/portal/desktop/request/1_48
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └─ /org/freedesktop/portal/desktop/request/1_48/5B78FD36644BB6B05513F85778626166
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └─ /org/freedesktop/secrets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └─ /org/freedesktop/secrets/collection
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ├─ /org/freedesktop/secrets/collection/login
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ├─ /org/freedesktop/secrets/collection/login/8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └─ /org/freedesktop/secrets/collection/login/9
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └─ /org/freedesktop/secrets/collection/session
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └─ /org/gnome
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └─ /org/gnome/keyring
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └─ /org/gnome/keyring/daemon&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみに、 &lt;code&gt;gh auth login&lt;/code&gt; した際の認証情報は、今回の環境では &lt;code&gt;/org/freedesktop/secrets/collection/login/8&lt;/code&gt; に対応していた。&lt;/p&gt;
&lt;h4 id="参考--sandbox内のcodexに-認証情報が読み込めるか確認した結果"&gt;(参考) Sandbox内のCodexに、認証情報が読み込めるか確認した結果
&lt;/h4&gt;&lt;p&gt;結論としては、認証情報は読み込めるが、それはダミーの認証情報であり、それを使ってGitHubを操作することはできないというものである。あくまで、実際の認証情報はホスト側のHost-side proxy、Credential Providerによって提供されるというものである。&lt;/p&gt;
&lt;p&gt;プロンプトは以下を指定した。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sandbox内のCodexから認証情報にアクセスできる？&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;回答は次の通り。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;調査できました。Sandbox 内で読めたのはダミーの認証情報で、実際の GitHub トークンはホスト側のプロキシが付与する仕組みです。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;値を表示せず、GET /user で比較した結果です。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| 通信方法 | 結果 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|-------------------------------------------+------------------------|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| GH_TOKEN を使い、プロキシ経由 | sonohen として認証成功 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| 無効なトークンで、プロキシ経由 | 同じく認証成功 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| トークンなしで、プロキシ経由 | 同じく認証成功 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| GH_TOKEN を使い、明示プロキシを使わず通信 | 401（認証失敗） |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sandbox には起動時から GH_TOKEN が渡されており、gh auth token はその値を返していました。しかし、その値自体では GitHub に認証できません。HTTPS プロキシは gateway.docker.internal:3128 に設定されています。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Docker の公式説明 (https://docs.docker.com/ai/sandboxes/architecture/#follow-an-authenticated-request)にも、Sandbox 内には代替値（sentinel）を渡し、ホスト側のプロキシが実際の認証情報に置き換えると記載されています。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;つまり、今回の構成は実トークンの窃取を防ぐ効果があります。一方、Codex はプロキシ経由で GitHub の権限を利用できるため、プロンプトインジェクションによる操作の悪用には、トークンの権限制限も必要です。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;なお、ホスト側の保存先が GNOME Keyring かどうかは、今回の Sandbox 内の調査では確認していません。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="docker-sandboxが予め許可しているドメインに加え-自身が承認したドメインへの通信を許可する方法を確認する-network-policy"&gt;Docker Sandboxが予め許可しているドメインに加え、自身が承認したドメインへの通信を許可する方法を確認する [Network Policy]
&lt;/h3&gt;&lt;p&gt;Network Policyは、Docker Sandbox全体に共通する設定と、個別のSandboxに適用される設定の2つがあり、冒頭で設定したNetwork Policyである &lt;code&gt;Balanced&lt;/code&gt; は、Docker Sandbox全体に共通する設定である。そのため、どのSandboxからも、基本的な開発用サイトにはアクセスできるが、それ以外にアクセスするためにはユーザの明示的な許可が必要である。例えば、以下のようにBBCから最新のニュースを取得しようとすると失敗する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BBCから最新のニュースを5件取得して。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;BBCのニュース見出しを最新順で確認します。取得できた記事にはリンクも付けます。
&amp;hellip;
BBCへのアクセスも403 Forbiddenで拒否され、最新記事を取得できませんでした。記事の見出しやリンクを確認できていないため、5件を正確にお伝えすることはできません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは、Network Policyにより、BBCへのアクセスが遮断されていることを示している。実際に拒否されているかどうかを調べるには、以下のコマンドをホスト側で実行して確認する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy approval ls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;APPROVAL SANDBOX TITLE DETAIL OPTIONS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; allow (Allow), dismiss (Dismiss)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;network:J53qFzroB8iTgn-IwcfkCwRBPAXTuz_xNYBWKjxDMrE codex-sbx-codex-work feeds.bbci.co.uk:443 Protocol: TCP Resource type: domain no matching allow rule (default deny) allow (Allow), dismiss (Dismiss)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;network:Gm11oDu3PS3dYXROHzzUYqsYsGcWcaNz8hHId1XY5I4 codex-sbx-codex-work www.bbc.com:443 Protocol: TCP Resource type: domain no matching allow rule (default deny) allow (Allow), dismiss (Dismiss)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;network:-lxOnQVAz9ZKBsk6jZKid-TEzjcujY92b6vRalW0PdI codex-sbx-codex-work bbc.com:443 Protocol: TCP Resource type: domain no matching allow rule (default deny) allow (Allow), dismiss (Dismiss)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この結果から、 &lt;code&gt;bbc.com&lt;/code&gt;, &lt;code&gt;feeds.bbci.co.uk&lt;/code&gt; へのアクセスは許可されていないことが分かる。ここで、3つのドメインについて許可するには、以下のコマンドを実行する。 &lt;code&gt;network:~~~&lt;/code&gt; には、実際の環境で &lt;code&gt;sbx policy approval ls&lt;/code&gt; して得られたAPPROVAL IDを指定する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy approval respond network:J53qFzroB8iTgn-IwcfkCwRBPAXTuz_xNYBWKjxDMrE --option allow &lt;span style="color:#75715e"&gt;# feeds.bbci.co.uk:443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy approval respond network:Gm11oDu3PS3dYXROHzzUYqsYsGcWcaNz8hHId1XY5I4 --option allow &lt;span style="color:#75715e"&gt;# www.bbc.com:443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy approval respond network:-lxOnQVAz9ZKBsk6jZKid-TEzjcujY92b6vRalW0PdI --option allow &lt;span style="color:#75715e"&gt;# bbc.com:443&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;プレーンテキスト&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Recorded answer Allow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Recorded answer Allow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Recorded answer Allow&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この状態で、もう一度BBCの最新ニュースを取得させる。(プロンプトは先と同じ)
すると、以下の結果が得られる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BBCニュースのRSSフィードで確認した最新5件です（公開時刻はUTC、2026年11月3日）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ウクライナの支援拠点へのロシア軍の爆撃で26人死亡とキーウが発表 — 01:56
記事を読む (&lt;a class="link" href="https://www.bbc.co.uk/news/articles/cjy56dndlyz0o?at_medium=RSS&amp;amp;at_campaign=rss" target="_blank" rel="noopener"
 &gt;https://www.bbc.co.uk/news/articles/cjy56dndlyz0o?at_medium=RSS&amp;at_campaign=rss&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;「Mogging」がコリンズ辞書の今年の言葉に。その意味を知っていますか？ — 01:52
記事を読む (&lt;a class="link" href="https://www.bbc.co.uk/news/articles/cve8rp085zzjo?at_medium=RSS&amp;amp;at_campaign=rss" target="_blank" rel="noopener"
 &gt;https://www.bbc.co.uk/news/articles/cve8rp085zzjo?at_medium=RSS&amp;at_campaign=rss&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AmazonとTemuで「スターリングシルバー」として販売されたアクセサリーから有害化学物質を検出 — 01:49
記事を読む (&lt;a class="link" href="https://www.bbc.co.uk/news/articles/cm62yjx4dl0jo?at_medium=RSS&amp;amp;at_campaign=rss" target="_blank" rel="noopener"
 &gt;https://www.bbc.co.uk/news/articles/cm62yjx4dl0jo?at_medium=RSS&amp;at_campaign=rss&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;北朝鮮、63億ドル相当の過去最大級Binanceハッキングへの関与を否定 — 01:23
記事を読む (&lt;a class="link" href="https://www.bbc.co.uk/news/articles/c6rey4v53exgo?at_medium=RSS&amp;amp;at_campaign=rss" target="_blank" rel="noopener"
 &gt;https://www.bbc.co.uk/news/articles/c6rey4v53exgo?at_medium=RSS&amp;at_campaign=rss&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;折りたたみ式iPhoneが完売、Appleは次回入荷時期を示せず — 00:29
記事を読む (&lt;a class="link" href="https://www.bbc.co.uk/news/articles/c6n8dn457ypko?at_medium=RSS&amp;amp;at_campaign=rss" target="_blank" rel="noopener"
 &gt;https://www.bbc.co.uk/news/articles/c6n8dn457ypko?at_medium=RSS&amp;at_campaign=rss&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;アクセスを許可したドメインは、以下のコマンドで確認できる。膨大なため、ここでは &amp;lsquo;bbc&amp;rsquo; に絞って確認する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy ls --type network --wide | grep bbc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;許可を取り消すには、以下のコマンドを実行する。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy rm network --sandbox codex-sbx-codex-work --resource feeds.bbci.co.uk:443
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy rm network --sandbox codex-sbx-codex-work --resource www.bbc.com:443
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy rm network --sandbox codex-sbx-codex-work --resource bbc.com:443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再び、以下のコマンドを実行すると、許可されたドメインにbbc関連が含まれていないことが確認できる。&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-language"&gt;Shell&lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sbx policy ls --type network --wide | grep bbc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="まとめ"&gt;まとめ
&lt;/h2&gt;&lt;p&gt;Docker Sandboxは、AIエージェントを隔離するだけでなく、秘密情報を安全に扱うことができるようにしたり、外部との通信を制御することで危険なサイトへのアクセスを予防したりすることで、
AIエージェントを安全に使えるようにする仕組みである。&lt;/p&gt;
&lt;p&gt;今までは、このような仕組みを実現するために &lt;code&gt;AGENTS.md&lt;/code&gt; を利用したり、ハーネス(AIエージェントを動かす実行環境や制御を行う層)を利用したり、はたまた、Dockerで自前で隔離したり色々な手を使っていたが、それらに代わる、あるいはより強い制御を行うための選択肢にDocker Sandboxはなりうるものと感じた。&lt;/p&gt;
&lt;p&gt;ただし、Docker Sandboxでは以下のようなリスクには対応できない。Docker Sandboxを使うからといっても、作業ディレクトリの絞り込み、最小権限、ネットワーク接続先の最小化には引き続き取り組んでいく必要がある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;作業ファイルの改竄や破壊&lt;/li&gt;
&lt;li&gt;許可された接続先への意図しない情報送信や不正操作&lt;/li&gt;
&lt;li&gt;認証情報を使った不正な操作&lt;/li&gt;
&lt;li&gt;Sandbox内での特権操作(AIエージェントは sudo 権限を持ってコンテナ内で動作する)&lt;/li&gt;
&lt;li&gt;隔離機構(microVM)自体の脆弱性&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>