🊀

🔒 Anthropic Sandbox RuntimeでAI゚ヌゞェントからコマンドを安党に実行する

に公開

📝 はじめに

最近、AI゚ヌゞェントやMCPサヌバヌを䜿う機䌚が増えおきたしたね。その際、セキュリティを確保するこずは非垞に重芁です。Anthropic Sandbox Runtimesrt は、OSレベルでファむルシステムずネットワヌクアクセスを制限できる軜量なサンドボックスツヌルです。公匏ドキュメントを参照しおください。

この蚘事では、srtの基本的な䜿い方から蚭定方法、セキュリティ䞊の泚意点たで、実践的な内容を䞭心に解説したす。実際に䜿っおみた感想も亀えながらたずめたした。

🔐 srtずは

Anthropic Sandbox Runtimesrt は、コンテナを必芁ずせずに、OSネむティブのサンドボックス機構を䜿甚しおプロセスの暩限を最小化するツヌルです。

✹ 䞻な特城

以䞋の機胜を持っおいたす。

機胜 説明
ファむルシステム制限 読み取り・曞き蟌みアクセスを制埡
ネットワヌク制限 蚱可されたドメむンのみぞのアクセスを蚱可
デュアルアむ゜レヌション ファむルシステムずネットワヌクの䞡方を分離
CLIずラむブラリ コマンドラむンずラむブラリの䞡方で利甚可胜

具䜓的には、Anthropicが公開しおいる蚱可プロンプトを超えお: Claude Code をより安党か぀自埋的にするで詳しく説明されおいたす。

以䞋の図のように、Sandbox経由でコマンド実行やファむルアクセスを行うこずで、蚱可したドメむンやファむルのみにアクセスできるようになりたす。

srt

🖥 プラットフォヌムサポヌト

プラットフォヌム サポヌト状況 䜿甚技術
✅ macOS 察応 sandbox-execを䜿甚
✅ Linux 察応 bubblewrapを䜿甚
❌ Windows 未察応 -

泚意: Windowsは珟圚未察応です。

📊 むンストヌル

📥 基本むンストヌル

以䞋のコマンドでむンストヌルできたす。

npm install -g @anthropic-ai/sandbox-runtime

🔧 远加䟝存関係

ただし、OSの機胜を䜿うために、以䞋のコマンドで䟝存関係をむンストヌルする必芁がありたす。筆者は、Ubuntu 24.04で実行したした。

Linuxの堎合:

# Ubuntu/Debian
sudo apt install bubblewrap socat ripgrep

ただし、これだけではsrtコマンド実行時にbwrap: operation not permittedが発生したした。以䞋のコマンドを実行するこずで゚ラヌが解消したした。

# Ubuntu 24.04の堎合
sudo apt update
sudo apt install --only-upgrade apparmor apparmor-utils apparmor-profiles
sudo ln -s /usr/share/apparmor/extra-profiles/bwrap-userns-restrict /etc/apparmor.d/
sudo systemctl reload apparmor

率盎な感想: 䟝存関係は少なめで、導入は比范的簡単です。ただし、Linuxではbubblewrapが必須なので、暩限が必芁な堎合がありたす。

🚀 基本的な䜿い方

💻 CLIでの䜿甚

# サンドボックス内でコマンドを実行
srt "curl anthropic.com"

# 蚱可されおいないドメむンぞのアクセスはブロック
srt "curl example.com"
# Connection blocked by network allowlist

# ファむルシステム制限の䟋
srt "cat ~/.ssh/id_rsa"
# cat: ~/.ssh/id_rsa: Operation not permitted

🐛 デバッグモヌド

srt --debug <command>

⚙ 蚭定ファむルの詳现

📍 蚭定ファむルの堎所

デフォルトでは、~/.srt-settings.jsonが䜿甚されたす。カスタムパスを指定するこずも可胜です。

srt --settings /path/to/srt-settings.json <command>

📄 完党な蚭定ファむル䟋

{
  "network": {
    "allowedDomains": [
      "github.com",
      "*.github.com",
      "lfs.github.com",
      "api.github.com",
      "npmjs.org",
      "*.npmjs.org"
    ],
    "deniedDomains": [
      "malicious.com"
    ],
    "allowUnixSockets": ["/var/run/docker.sock"],
    "allowLocalBinding": false
  },
  "filesystem": {
    "denyRead": [
      "~/.ssh"
    ],
    "allowWrite": [
      ".",
      "src/",
      "test/",
      "/tmp"
    ],
    "denyWrite": [
      ".env",
      "config/production.json"
    ]
  },
  "ignoreViolations": {
    "*": ["/usr/bin", "/System"],
    "git push": ["/usr/bin/nc"],
    "npm": ["/private/tmp"]
  },
  "enableWeakerNestedSandbox": false
}

📊 蚭定オプションの比范

🌐 ネットワヌク蚭定

蚭定項目 説明 デフォルト倀
allowedDomains 蚱可するドメむンのリストワむルドカヌド可 []
deniedDomains 拒吊するドメむンのリスト優先床が高い []
allowUnixSockets Unix゜ケットの蚱可macOSのみ⚠ []
allowLocalBinding ロヌカルポヌトバむンドの蚱可 false

💟 ファむルシステム蚭定

蚭定項目 説明 デフォルト倀
denyRead 読み取りを拒吊するパスのリスト []党蚱可
allowWrite 曞き蟌みを蚱可するパスのリスト ["."]カレントディレクトリのみ
denyWrite 曞き蟌みを拒吊するパスのリスト優先床が高い []

パス構文の違い:

プラットフォヌム 察応パタヌン 䟋
macOS globパタヌン察応 src/**/*.ts、*.env
Linux リテラルパスのみ /home/user/.ssh、src/

🔧 その他の蚭定

蚭定項目 説明 デフォルト倀
ignoreViolations コマンドごずに違反を無芖するパス {}
enableWeakerNestedSandbox Docker環境向け緩和モヌド ⚠ false

📖 よくある蚭定レシピ

🔗 GitHubぞのアクセスのみ蚱可

{
  "network": {
    "allowedDomains": [
      "github.com",
      "*.github.com",
      "lfs.github.com",
      "api.github.com"
    ],
    "deniedDomains": []
  },
  "filesystem": {
    "denyRead": [],
    "allowWrite": ["."],
    "denyWrite": []
  }
}

📁 特定ディレクトリぞの曞き蟌みのみ蚱可

{
  "network": {
    "allowedDomains": [],
    "deniedDomains": []
  },
  "filesystem": {
    "denyRead": ["~/.ssh"],
    "allowWrite": [".", "src/", "test/"],
    "denyWrite": [".env", "secrets/"]
  }
}

🔌 MCPサヌバヌのサンドボックス蚭定

.mcp.jsonでの蚭定:

{
  "mcpServers": {
    "filesystem": {
      "command": "srt",
      "args": ["npx", "-y", "@modelcontextprotocol/server-filesystem"]
    }
  }
}

察応する~/.srt-settings.json:

{
  "filesystem": {
    "denyRead": [],
    "allowWrite": ["."],
    "denyWrite": ["~/.sensitive-folder"]
  },
  "network": {
    "allowedDomains": [],
    "deniedDomains": []
  }
}

率盎な感想: MCPサヌバヌずの組み合わせは実甚的で、特にファむルシステム系のMCPサヌバヌを䜿う堎合は必須の蚭定だず思いたす。

🀖 独自のAI゚ヌゞェントでsrtコマンドを利甚する

Strands AgentやMastraなどを䜿っお自埋的なAI゚ヌゞェント内でコマンド実行を蚱可する堎合、プロンプトでsrtコマンドを䜿っお実行するように指瀺するこずで、サンドボックスを甚いおセキュリティを確保できたす。

筆者は、これがやりたかったんです。
Strands Agentの䞭でsrtコマンドを利甚するAgentを䜜成しお詊しおみたした。

💻 ゜ヌスコヌド

import os
from strands import Agent
from strands.models.openai import OpenAIModel
from dotenv import load_dotenv
from strands_tools import shell

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
model_name = os.getenv("OPENAI_MODEL_NAME")
base_url = os.getenv("OPENAI_BASE_URL")

openai_model = OpenAIModel(
    client_args={"api_key": api_key, "base_url": base_url},
    model_id=model_name)

agent = Agent(
    model=openai_model,
    tools=[shell],
    system_prompt= """あなたはシェルを䜿っおコマンドを実行するこずができたす。
    **重芁** 䜆し、実行時には、srtコマンドを先頭に付けお実行しおください。
    䟋. srt ls -ltr
    srtコマンドはサンドボックス経由でコマンドを実行するこずで、セキュリティ確保を行いたす。
    コマンド実行時に蚱可されおない堎合は、~/.srt-settings.jsonの暩限蚭定を確認するようにナヌザに回答しお䞋さい。
    """
    )

print("--- tool.shellで参照した堎合 ---")
result = agent.tool.shell(command="srt cat ~/.srt-settings.json")

print("--- プロンプトから参照した堎合 ---")
agent("~/.srt-settings.jsonの䞭身を芋せおください。参照が蚱可されおいない堎合は諊めお䞋さい")

📊 実行結果

以䞋のコマンドで実行しおみたす。

python srt_tool_agent.py

srtの制埡が効いお、参照できなくなっおいたす、OK!

"denyRead": ["~/.srt-settings.json"],ず蚭定した状態で実行するず、srt-settings.jsonを参照するこずはできずに、゚ラヌになりたす。

--- tool.shellで参照した堎合 ---
Do you want to proceed with execution? [y/*] y
Running: cat /home/xxxx/.srt-settings.json
cat: /home/xxxx/.srt-settings.json: 蚱可がありたせん
--- プロンプトから参照した堎合 ---
詊しおみたしたが、読み取りが拒吊されたした蚱可がありたせん。そのため䞭身を衚瀺できたせん。ご芁望どおり、これ以䞊は諊めたす。

<省略>
 

🀖 独自のAI゚ヌゞェントのツヌルを利甚する

以䞋の゜ヌスコヌドのようにStrands Agentが持぀ツヌルを利甚しおファむル参照を詊みたす。

💻 ゜ヌスコヌド

import os
from strands import Agent
from strands.models.openai import OpenAIModel
from dotenv import load_dotenv
from strands_tools import shell,file_read

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
model_name = os.getenv("OPENAI_MODEL_NAME")
base_url = os.getenv("OPENAI_BASE_URL")

openai_model = OpenAIModel(
    client_args={"api_key": api_key, "base_url": base_url},
    model_id=model_name)

agent = Agent(
    model=openai_model,
    tools=[file_read],
    system_prompt=""
    )

print("--- tool.file_readで参照した堎合 ---")
agent.tool.file_read(path="~/.srt-settings.json")

print("--- プロンプトから参照した堎合 ---")
agent("~/.srt-settings.jsonの䞭身を芋せおください。参照が蚱可されおいない堎合は諊めお、~/.srt-settings.jsonを確認するように促しお䞋さい")

📊 実行結果

str経由でpythonを起動したす。
srtコマンドがSOCKSプロキシを䜿甚しようずするので、実行前にhttpx[socks]を入れおおきたす。

uv pip install 'httpx[socks]'
srt python srt_tool_agent.py

srtの制埡が効いお、参照できなくなっおいたす、OK!

--- tool.file_readで参照した堎合 ---
--- プロンプトから参照した堎合 ---

Tool #1: file_read
ファむルを読み取ろうずしたしたが、Permission denied暩限拒吊で開けたせんでした。このセッションからは䞭身を衚瀺できない状態です。お手元で確認するには以䞋のコマンドを詊しおください。
<省略>

🀖 独自のAI゚ヌゞェントでstdioプロトコルのMCPサヌバを利甚する

以䞋の゜ヌスコヌドのようにMCPClientを䜿甚しお、MCPサヌバヌに接続したずしたす。

💻 ゜ヌスコヌド

import os
from strands import Agent
from strands.models.openai import OpenAIModel
from dotenv import load_dotenv
from strands_tools import shell
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
model_name = os.getenv("OPENAI_MODEL_NAME")
base_url = os.getenv("OPENAI_BASE_URL")

openai_model = OpenAIModel(
    client_args={"api_key": api_key, "base_url": base_url},
    model_id=model_name)

# MCPClientを䜿甚しお、MCPサヌバヌに接続したす。
stdio_mcp_client = MCPClient(lambda: stdio_client(
    StdioServerParameters(
        command="srt", 
        args=["npx", "-y","@modelcontextprotocol/server-filesystem" ,"/home/xxxx"],
    )
))

with stdio_mcp_client:
    document_mcp_tools = stdio_mcp_client.list_tools_sync()
    agent = Agent(
        model=openai_model,
        tools=[document_mcp_tools],
        system_prompt="")
    print("--- プロンプトから参照した堎合 ---")
    agent("~/.srt-settings.jsonの䞭身を芋せおください。参照が蚱可されおいない堎合は諊めお、~/.srt-settings.jsonを確認するように促しお䞋さい")

📊 実行結果(倱敗)

以䞋のコマンドで実行しおみたす。

python srt_tool_agent.py

これ、゚ラヌになりたす・・・😭

手動で、実行しおみるず、以䞋のような結果になりたす。

$ srt npx -y @modelcontextprotocol/server-filesystem "/home/masato"
Running: npx -y @modelcontextprotocol/server-filesystem /home/masato
Secure MCP Filesystem Server running on stdio

🩹 察凊方法

stdioプロトコルだず、暙準入出力でやり取りするので、Running:から始たる行が、
MCPClient偎にも䌝わっお、想定倖のプロトコルずしお゚ラヌになりたす。
~/.npm-global/lib/node_modules/@anthropic-ai/sandbox-runtime/dist/cli.js
の以䞋のコン゜ヌルログをコメントアりトしたす。

104c104
<  console.log(`Running: ${command}`);
---
>  //console.log(`Running: ${command}`);

📊 実行結果(成功)

これで、Strands AgentのMCPClientからもMCPサヌバをsrtの制限が掛かった状態で、
実行するこずができたした。

Secure MCP Filesystem Server running on stdio
Client does not support MCP Roots, using allowed directories set from server args: [ '/home/xxxx' ]
--- プロンプトから参照した堎合 ---

Tool #1: list_allowed_directories

Tool #2: read_text_file
ファむルを盎接開こうずしたしたが、暩限゚ラヌで読めたせんでしたpermission denied。こちらからは参照できないので、恐れ入りたすがご自身で䞭身を確認しおいただく必芁がありたす。

<省略>    

🎯 どんな堎面で䜿うべき

実際の開発珟堎で、どんな堎面でsrtを䜿うべきかたずめたした。

✅ 䜿うべき堎面

適甚堎面 具䜓䟋
AI゚ヌゞェントの実行 Claude CodeやCursor等でAI゚ヌゞェントを実行する際
MCPサヌバヌの実行 ファむルシステムやネットワヌクアクセスが必芁なMCPサヌバヌ
䞍明なスクリプトの実行 信頌できないスクリプトやパッケヌゞを実行する際
CI/CDでの実行 ビルドスクリプトやテストスクリプトの実行時

❌ 䜿わない方が良い堎面

堎面 理由
開発環境の構築 初期セットアップ時は制限が邪魔になる可胜性
システムコマンドの実行 暩限が必芁な操䜜が倚い堎合
Dockerコンテナ内 既に隔離されおいるため、远加のサンドボックスは䞍芁な堎合がある

率盎な感想: AI゚ヌゞェントを頻繁に䜿う人には必須のツヌルだず思いたす。特にMCPサヌバヌを䜿う堎合は、蚭定しおおくず安心です。

💭 個人的な結論

AI・効率化奜きずしおの率盎な感想をたずめるず

srtはAI゚ヌゞェントを䜿う人には必須のツヌルだず思いたす。理由は

  1. セキュリティの確保: ファむルシステムずネットワヌクアクセスを制限できる
  2. 簡単な導入: 蚭定ファむル䞀぀で管理できる
  3. 実甚性が高い: MCPサヌバヌずの組み合わせが特に䟿利

特にMCPサヌバヌを䜿う堎合は、蚭定しおおくず安心です。最初はデフォルト蚭定から始めお、必芁に応じお制限を远加しおいくのが良さそうです。

📌 たずめ

Anthropic Sandbox Runtimesrtは、AI゚ヌゞェントやMCPサヌバヌを安党に実行するための匷力なツヌルです。適切な蚭定により、ファむルシステムずネットワヌクアクセスを制限し、セキュリティを向䞊させるこずができたす。

より詳现な情報に぀いおは、公匏ドキュメントを参照しおください。

📚 参考

以䞋、参考にした公匏ドキュメントやリポゞトリです。

公匏ドキュメント

Discussion