بازگشت به کتابخانهکتابخانه4.1Permission و Sandbox بومی
تکنیک Ralph WiggumTHE RALPH WIGGUM TECHNIQUEاجرای ایجنت کدنویس در حلقه — از یک اسکریپت Bash تا ارکستراسیون کامل
v1.0.0
LESSON 4.1فصل ۴Permission ،Sandbox و Hook

Permission و Sandbox بومی

  • ~۱۲ دقیقه
  • ۶ پرسش
  • متن را انتخاب کن تا هایلایت شود

تا حالا حلقه‌ها را با حالت پیش‌فرض «Accept Edits» اجرا کردیم. ولی این حالت یک سوءتفاهم بزرگ دارد: فقط ویرایش فایل‌ها را خودکار تأیید می‌کند و روی اجرای دستور Bash هیچ اثری ندارد. در Print Mode هم که راهی برای تأیید تعاملی نیست — پس هر درخواست Permission، حلقه را فلج می‌کند. در این درس سیستم Permission و بعد Sandbox بومی Claude Code را می‌سازیم.

Accept Edits دقیقاً چه می‌کند؟

در CLI تعاملی با Shift+Tab بین حالت‌ها می‌چرخی. `Accept Edits` فقط ویرایش فایل را بدون پرسیدن قبول می‌کند — و چون کد را با Git ردیابی می‌کنی، این نسبتاً امن است: هر تغییر قابل بازبینی و Revert است.

Allow List و Deny List

برای اجرای خودکار دستورها، باید صریح در `‎.claude/settings.json` مجوز بدهی. فقط چیزهای داخل Allow List بدون پرسش اجرا می‌شوند:

{
  "permissions": {
    "allow": [
      "Bash(npm install)",
      "Bash(npm run *)",
      "Bash(*--version)",
      "Bash(gh --help *)"
    ],
    "deny": [
      "Bash(rm *)",
      "Bash(git rm *)",
      "Read(.env*)"
    ]
  }
}

این الگوها Glob اند و موقعیت و مرز کلمه مهم است:

Allow List
فهرست دستورهای مجاز که بدون پرسش اجرا می‌شوند. در Print Mode تنها راه اجازه دادن است.
Deny List
فهرست دستورهای ممنوع. همیشه بر Allow List غلبه دارد — قانون طلایی امنیت.
Glob Pattern
الگوی Wildcard مثل *--version. مرز کلمه مهم است: «ls *» با فاصله فقط ls -la را می‌گیرد، «ls*» بدون فاصله حتی ls-off را هم.

مثال Deny مهم: `Read(.env*)` تا مدل هیچ فایل محیطی را نخواند. و یادت باشد: **Deny همیشه برنده است**، حتی اگر همان چیز در Allow List هم باشد.

چرا در حلقه، این دو لیست حیاتی‌ترند؟

در شل تعاملی می‌توانی دستی Allow بزنی؛ در Print Mode نمی‌توانی. وقتی حلقه به یک Permission برنخورده در لیست می‌رسد، Tool Call در Print Mode «شکست می‌خورد» و مدل مجبور می‌شود دورش بزند. تست ساده:

# تعاملی: از تو اجازه می‌خواهد
claude "do a curl request to laracasts.com and show response headers"

# Print Mode: نمی‌تواند بپرسد، پس مستقیم شکست می‌خورد
claude -p "do a curl request to laracasts.com"

Sandbox بومی

راه امن‌تر، Sandbox داخلی Claude Code است. با دستور `/sandbox` تنظیمش می‌کنی. پیش‌فرض روی No Sandbox است؛ آن را روی «Sandbox Bash tool with auto-allow» بگذار و در Overrides گزینه «Allow un-sandboxed fallback» را روشن کن — یعنی اگر دستوری به‌خاطر محدودیت Sandbox شکست خورد، به سیستم Permission معمولی برگردد.

Sandbox
محیط ایزوله‌ای که سیستم‌عامل اجرایش می‌کند. Bash داخلش خودکار مجاز است، ولی نوشتن بیرون پوشه فعلی و درخواست شبکه در سطح OS مسدود است.
Seatbelt / Bubblewrap
چارچوب زیرین SandboxSeatbelt روی macOS (آماده به کار)، Bubblewrap روی Linux (باید نصب شود).
un-sandboxed Fallback
وقتی دستوری در Sandbox شکست بخورد، به‌جای خطا به سیستم Permission معمولی برمی‌گردد.

با روشن کردن همین Sandbox، از خستگی Permission خلاص می‌شوی: طراحی‌اش این است که Bash خودکار مجاز باشد، ولی مدل نتواند بیرون پوشه فعلی بنویسد یا به شبکه وصل شود. حتی اگر بخواهد `~/.bashrc` را دست بزند یا Home را پاک کند، خود OS اجازه نمی‌دهد.

تنظیم دقیق Sandbox

همه‌چیز در `sandbox` داخل `settings.json` تنظیم می‌شود:

{
  "sandbox": {
    "network": {
      "allow": [{ "domain": "laracasts.com" }]
    },
    "filesystem": {
      "allowWrite": ["fastlane"],
      "denyWrite": [".github"],
      "denyRead": ["**/.aws/**"]
    },
    "excludedCommands": ["docker"]
  }
}
  • **شبکه:** پیش‌فرض همه اتصال‌های خروجی بسته است — این ریسک Prompt Injection و Exfiltration را به‌شدت کم می‌کند. دامنه‌های لازم را صریح Allow کن.
  • **فایل:** خواندن کل سیستم پیش‌فرض باز است ولی نوشتن فقط در پوشه فعلی؛ می‌توانی نوشتن جای خاصی را باز، `‎.github` را قفل، و خواندن Credential های AWS را Deny کنی.
  • **Excluded Commands:** مثلاً Docker در Sandbox بومی کار نمی‌کند، پس مستثنایش کن.

به زبان ساده

Accept Edits فقط فایل را خودکار می‌کند، Bash را نه. در حلقه کسی نیست Allow بزند، پس باید از قبل Allow/Deny بنویسی یا Sandbox بومی را روشن کنی.

مثال واقعی

`curl laracasts.com` در شل تعاملی اجازه می‌خواهد؛ همان دستور با `-p` شکست می‌خورد. با Sandbox و Allow کردن دامنه، Bash راه می‌افتد ولی نوشتن بیرون پوشه و شبکهٔ آزاد هنوز بسته است.

دانش‌سنجی

آزمون درس

۶ Q
01
بزرگ‌ترین سوءتفاهم درباره حالت Accept Edits چیست؟
02
بین Allow List و Deny List، در تعارض کدام برنده است؟
03
چرا Allow/Deny در حلقه‌های Ralph حیاتی‌تر از کار تعاملی است؟
04
در Sandbox بومی، چه چیزی پیش‌فرض خودکار مجاز است و چه چیزی مسدود؟
05
چارچوب زیرین Sandbox روی macOS و Linux چیست؟
06
چرا بستن پیش‌فرض شبکه در Sandbox از نظر امنیتی مهم است؟