چیت‌شیت

ساندباکس‌های Docker برای ایجنت‌ها

Docker Sandboxes for Agents

اجرای یک ایجنت در microVM، کنترل شبکه و کلیدها، دریافت commitهای آن. sbx 0.47.0، docker-agent 1.149.0.

  • ۱۲ بخش
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. چه چیزی کجا اجرا می‌شود
  2. یک درخواست از ساندباکس خارج می‌شود
  3. چرخه حیات ساندباکس
  4. رازها، MCP و سلامت
  5. چرخه رفت و برگشت حالت Clone
  6. دیباگ یک هاست مسدودشده
  7. آنچه ایجنت از درون می‌بیند
  8. مقادیر پیش‌فرض
  9. مفاهیم کلیدی
  10. عیب‌یابی
  11. پرسش و پاسخ
  12. نکات کاربردی

چه چیزی کجا اجرا می‌شود

معماری
سوکتراه‌اندازی می‌کنداجرا می‌شودHTTPS_PROXYجایگزینیمجازmountsbx CLIمیزبانsandboxdsandboxd.sock، daemon.logمخزن امن رازهاmacOS KeychainmicroVM ساندباکسکرنل اختصاصی، Docker Engine خصوصیایجنتuser agent، uid 1000فوروارد پروکسیgateway.docker.internal:3128فضای کاریvirtiofs، با همان مسیر مطلقمیزبان‌های مجازقوانین پالیسی

یک درخواست از ساندباکس خارج می‌شود

گام‌به‌گام
  1. sbx createدیمن sandboxd قالب را دریافت و microVM را بوت می‌کند.
  2. ایجنتدرخواست را به فوروارد پروکسی روی هاست می‌فرستد.
  3. اعتبارسنج (Authorizer)تطابق با deny اولویت دارد. نبود قانون allow معادل رد ضمنی (implicit deny) است.
  4. مسدودشدهپروکسی درون TLS با کد 403 و خطای «Approval required» پاسخ می‌دهد.
  5. مجازپروکسی ترافیک میزبان را به صورت forward-bypass تونل می‌کند.
  6. راز پیوندخوردهپروکسی مقدار نگهدارنده (sentinel) را با مقدار ذخیره‌شده جایگزین می‌کند.
  7. لاگ پالیسییک سطر برای هر هاست همراه با نوع پروکسی و قانون اعمال‌شده.

چرخه حیات ساندباکس

کار و کد
وظیفهکد
ایجاد روی یک مخزنsbx create shell <path> --name <name>
اتصال مجدد (Attach)sbx run --name <name>
اجرای دستور در نقش rootsbx exec -u root <name> sh -c '<cmd>'
کپی کردن فایل به داخلsbx cp <host-file> <name>:/tmp/in.txt
انتشار پورتsbx ports <name> --publish 18081:8080
متوقف‌سازی و حفظ وضعیتsbx stop <name>
حذف ساندباکس‌های متوقف‌شدهsbx prune --force

رازها، MCP و سلامت

کار و کد
وظیفهکد
پیوند یک راز به هاست‌هاsbx secret set-custom --host <host> --env <VAR> --value <value>
یافتن کلیدها در متغیرهای محیطی هاستsbx secret import --dry-run
ثبت یک سرور MCPsbx mcp add <name> --url <url>
اتصال آن به یک ساندباکسsbx mcp load <name> --sandbox <sandbox>
اجرای 13 بررسی سلامتsbx diagnose
ذخیره یک قالبsbx template save <name> <tag> --output <file>.tar
اجرای فایل ایجنت درون ساندباکسdocker-agent run --sandbox --exec <agent-file> '<prompt>'

چرخه رفت و برگشت حالت Clone

کد
bash
sbx create --clone shell <repo> \              # کلون خصوصی، مخزن هاست فقط‌خواندنی
  --name <name>                                # سورس‌کد در /run/sandbox/source
sbx exec <name> sh -c '<edit and git commit>'  # ایجنت در کلون commit می‌زند
git -C <repo> remote -v                        # افزوده شدن sandbox-<name> توسط sbx
git -C <repo> fetch sandbox-<name>             # بازگرداندن commitها
sbx rm --force <name>                          # حذف VM، وضعیت و رازهای محلی دامنه

دیباگ یک هاست مسدودشده

کد
bash
sbx policy init balanced                        # یک‌بار، قبل از اولین ساندباکس
sbx create shell --name m101-policy             # بدون mount فضای کاری
sbx exec m101-policy sh -c \
  'curl -sS --max-time 10 https://example.com'  # نیاز به تایید (Approval required)
sbx policy log m101-policy                      # فوروارد، پیش‌فرض مسدود (default deny)
sbx policy allow network \
  --sandbox m101-policy example.com             # قانون برای یک ساندباکس
sbx policy check network example.com \
  --sandbox m101-policy --verbose --json        # مجوز خواندن داده شد، قانون

آنچه ایجنت از درون می‌بیند

دستورها
دستورعملکرد آن
HTTPS_PROXY=http://gateway.docker.internal:3128فوروارد پروکسی برای HTTP و HTTPS
ANTHROPIC_API_KEY=proxy-managedنگهدارنده (Sentinel). کلید واقعی روی هاست باقی می‌ماند
M101_RECV_KEY=sbx-cs-<rand>نگهدارنده‌ی سفارشی برای راز
SSH_AUTH_SOCK=/run/ssh-agent.sockایجنت SSH هاست، فورواردشده به‌طور پیش‌فرض
forward-bypassنوع لاگ پروکسی: تونل، بدون بازرسی محتوا
transparentنوع لاگ پروکسی: سایر اتصالات TCP، بدون تزریق
"deny_kind": "explicit"یک قانون آن را رد کرد. implicit یعنی عدم وجود مجوز

مقادیر پیش‌فرض

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
--name<agent>-<workdir>آن را تنظیم کنید تا دو ایجنت از هم جدا بمانند
-m, --memory50% of host memoryمحدود بین 512 MiB تا 32 GiB
--pullalwaysهمچنین missing یا never
--skillsreadonlyهمچنین off یا readwrite
secret set --refresh55mتازه‌سازی برای سورس‌کد داینامیک
ssh.agentForwardingEnabledtrueبرای ایجنت‌های غیرقابل اعتماد خاموش شود
sandbox.disk.dockerVolume10gحجم دایرکتوری /var/lib/docker
kit.allowedSources["docker.io/"]منابع مجاز کیت ریموت

مفاهیم کلیدی

مفهوم‌ها
ساندباکس
یک microVM با کرنل اختصاصی و Docker Engine خصوصی.
حالت Clone
فلگ --clone. ایجنت روی یک کلون اختصاصی کار می‌کند. commitها از طریق Remote بازمی‌گردند.
پیش‌تنظیم (Preset)
مقادیر allow-all، balanced یا deny-all، با sbx policy init یک‌بار تنظیم می‌شود.
دامنه پالیسی
مقدار global برای همه ساندباکس‌ها، یا یک ساندباکس خاص با --sandbox.
اولویت با رد (Deny wins)
قانون deny بر قانون allow برای همان هاست اولویت دارد.
نگهدارنده (Sentinel)
مقداری صوری که ایجنت به جای کلید یا راز اصلی می‌بیند.

عیب‌یابی

عیب‌یابی
  • Approval required for example.com:443.

    علت
    هیچ قانون allow تطابق ندارد
    راه‌حل
    sbx policy allow network --sandbox <name> <host>
  • شکست دستور curl به ::1 با کد خطای 7

    علت
    پورت به صورت tcp4 پابلیش شده است
    راه‌حل
    پابلیش پورت به صورت 8080/tcp برای هر دو پروتکل
  • copying between sandboxes is not supported

    علت
    دستور cp به سمت هاست نیاز دارد
    راه‌حل
    کپی از طریق هاست
  • رد شدن: conflicts with existing allow rule

    علت
    وجود همزمان allow و deny در یک دامنه
    راه‌حل
    ابتدا sbx policy rm network --id <uuid>
  • عدم دریافت کلید API از ~/.zshrc

    علت
    متغیرهای هاست از نسخه v0.35.0 به بعد خوانده نمی‌شوند
    راه‌حل
    sbx secret set یا sbx secret import
  • ensure daemon: daemon exited unexpectedly

    علت
    مشکل در دیمن sandboxd
    راه‌حل
    sbx daemon status --json، بررسی فایل daemon.log

پرسش و پاسخ

پرسش و پاسخ
آیا به Docker Desktop نیاز دارم؟
خیر. نیاز به sbx login دارید. کانتینرهای ایجنت در docker ps هاست دیده نمی‌شوند.
stop یا rm؟
دستور sbx stop وضعیت را نگه می‌دارد. sbx rm ساندباکس، وضعیت آن و رازهای محلی را پاک می‌کند.
آیا allow کردن هاست مانع آپلود gist می‌شود؟
خیر. هاستِ مجاز هر متد، مسیر و بدنه‌ای را عبور می‌دهد.
آیا ایجنت کلید من را می‌بیند؟
خیر. مقدار proxy-managed را می‌بیند. پروکسی کلید را بعد از خروج از VM اضافه می‌کند.

نکات کاربردی

نکته‌ها
  • حافظه، پورت‌ها، مهارت‌ها و سرورهای MCP استاتیک را هنگام ساخت تعیین کنید؛ اتصال مجدد آن‌ها را نادیده می‌گیرد.
  • قبل از prune، دستور sbx prune --dry-run را اجرا کنید.
  • قوانین محدود را با --sandbox اضافه کنید. قوانین global را فقط برای هاست‌های مشترک همه ایجنت‌ها نگه دارید.
  • کلیدها را با sbx secret set ذخیره کنید، هرگز از -e KEY استفاده نکنید.
  • رازهای سفارشی را دقیقاً به هاست‌های مقصد پیوند دهید. پروکسی مقدار نگهدارنده را در هر کجای درخواست جایگزین می‌کند.