דילוג לתוכן
תפריט
צריכים את זה?לאן סוכן יכול להגיע במחשב שלכםאיך זה עובדהשכבות שבין הסוכן למערכת שלכםהשוואהסביבות sandbox מובנות, Docker ומכונות וירטואליותהגדרהפותחים רק את מה שהמשימה צריכהאבטחהמודל האיומים והגבולות שלוהורדהקבצים בינאריים, checksums והערות גרסההתקנה
התקנה

מתקינים, מציצים פנימה, מריצים סוכן

כל ai-jail הוא תוכנה אחת, בלי daemon ובלי root. מתקינים אותה, כותבים את השם שלה לפני הפקודה שאתם מקלידים ממילא, והסוכן עולה בתוך sandbox.

למי שיושב מול המקלדת.

התקנה

בחרו בדרך שבה אתם כבר מתקינים כלי שורת פקודה. בכל שיטה מקבלים את אותה תוכנה יחידה, ai-jail.

terminal
brew tap akitaonrails/tap && brew install ai-jail

עובד ב-macOS וב-Linux.

מה המערכת שלכם צריכה

Linux

התקינו את bubblewrap, התוכנה הקטנה שבעזרתה ai-jail בונה את ה-sandbox. ברוב ההפצות שם החבילה הוא bubblewrap.

terminal
pacman -S bubblewrapapt install bubblewrapdnf install bubblewrap

macOS

אין מה להתקין. ai-jail משתמש ב-sandbox-exec, שמגיע עם macOS. Apple מסמנת את הממשק הזה כ-deprecated. ב-macOS ה-registries של החבילות לא נגישים כברירת מחדל: הוסיפו אחד עם --allow-host, או פתחו את הרשת עם --network.

Windows

לא נתמך. השתמשו ב-WSL2 ובצעו בתוכו את השלבים של Linux.

ההרצה הראשונה

שלוש פקודות: תוכנית, הצצה פנימה וסוכן שעובד. ההתחברות של הסוכן כבר בפנים, ו-ai-jail פותח בשבילכם את הדרך אל ה-host של ה-API של הסוכן.

↔ החליקו לצדדים כדי לראות את התרשים המלא

תיקיית הבית שלכם נשארת בחוץ בכל שלב, וההתחברות של הסוכן בפנים מההתחלה. בשלב האחרון ai-jail פותח את ה-host של ה-API של הסוכן עצמו; ב-Linux גם ה-toolchains מגיעים למאגרי החבילות. כל השאר נשאר סגור.
  1. רואים את התוכנית בלי להריץ כלום

    עברו לתיקיית הפרויקט ובקשו dry run. הכלי מדפיס את פקודת ה-sandbox שהוא היה מריץ, ויוצא. הרצת dry run אף פעם לא כותבת קובץ.

    dry run
    cd ~/Projects/my-appai-jail --dry-run claude
  2. מסתכלים מסביב מבפנים

    פתחו shell רגיל בתוך הכלא. הפרויקט שלכם נמצא שם בנתיב האמיתי שלו ואפשר לערוך אותו. תיקיית הבית היא תיקייה חדשה, והטוקנים מה-shell שלכם נעלמו. כדי לצאת, הקלידו exit.

    מעטפת shell בכלא
    ai-jail bash
  3. מריצים את הסוכן

    הכלי ai-jail מעגן כברירת מחדל את תיקיית המצב של הסוכן עצמו, ולכן הוא כבר מחובר. כשהוא מכיר את הסוכן, הוא גם מעביר דרך הפרוקסי המסנן שלו את ה-host של ה-API של הסוכן: api.anthropic.com עבור Claude Code, api.openai.com ו-chatgpt.com עבור Codex, generativelanguage.googleapis.com עבור Gemini, api.x.ai עבור Grok, server.codeium.com עבור Devin, ב-Linux וב-macOS. hosts של טלמטריה נשארים סגורים. ב-Linux, ה-toolchains מגיעים כברירת מחדל אל registries של חבילות כמו crates.io, npm ו-PyPI, כדי ש-builds יעבדו. --network פותח במקום זה את כל הרשת.

    ההרצה האמיתית
    ai-jail claude# או, כשכל הרשת פתוחה:ai-jail --network claude
  4. כשצריך יותר

    כתבו רשימת hosts ב-~/.ai-jail, קובץ ההגדרות שלכם, תחת שם הסוכן. הרשימה מתווספת ל-host של ה-API של הסוכן, שנשאר מורשה, וב-Linux github.com וה-registries של החבילות כבר בפנים. או השתמשו ב---network לכל הרשת. להרצה ללא התחברות, העבירו --no-agent-state. קובץ .ai-jail בתוך הפרויקט יכול רק להדק את הכלא: הוא יכול לקצר את רשימת ה-hosts או את רשימת forward_ports ולכבות את ההתחברות, אף פעם לא להפך, ולכן ריפוזיטורי שעשיתם לו clone לא יכול לפתוח לעצמו את הכלא.

    ~/.ai-jail
    [commands.claude]allow_hosts = ["api.example.com"]# מתווסף ל-host של ה-API ול-registries ש-ai-jail כבר מתיר # או, להרצה אחת:# ai-jail --network claude

מה תראו בפנים

ה-prompt משתנה ל-(jail), והפרויקט נמצא איפה שהיה תמיד. גם ה-toolchains שלכם שם, לקריאה בלבד. הדברים ששווה לגנוב חסרים, חוץ מההתחברות של הסוכן עצמו, שנמצאת שם בכוונה.

הפקודה ai-jail bash, ב-Linux
$ ai-jail bash# הפרויקט נמצא בנתיב האמיתי שלו(jail) ~/Projects/my-app $ pwd/home/you/Projects/my-app# טוקן שיוצא ב-shell שלכם לא הגיע לכאן(jail) ~/Projects/my-app $ echo $GITHUB_TOKEN # המפתחות שלכם לא נמצאים בתיקיית הבית הזאת(jail) ~/Projects/my-app $ cat ~/.ssh/id_ed25519cat: /home/you/.ssh/id_ed25519: No such file or directory# לכלא יש שם מארח משלו(jail) ~/Projects/my-app $ hostnameai-sandbox

זה סשן של Linux. ב-macOS אין דרך לבנות עץ קבצים נפרד, ולכן שם אותם נתיבים קיימים והקריאה מהם נדחית.

↔ החליקו לצדדים כדי לראות את התרשים המלא

מבפנים, הפרויקט הוא הדבר היחיד שלכם שאפשר לשנות. ה-toolchains שלכם (mise, cargo, npm ואחרים) נמצאים שם, לקריאה בלבד, עם cache של תלויות ששייך לכלא. הרשת נשארת בחוץ, חוץ מה-host של ה-API של סוכן מוכר וב-Linux גם registries של החבילות שה-toolchains האלה מושכים מהם, עד שתפתחו host עם --allow-host, פורט מקומי אחד עם --forward-port, או את כולה עם --network. איך ה-toolchains ממופים.

כשהכלא חוסם משהו

כל מה שהסוכן מפעיל רץ בפנים יחד איתו, ולכן דבר חסום פשוט נכשל, ואף אחד לא שואל אתכם. כך זה נראה, וכך רואים את זה.

  • קובץ מחוץ לפרויקט לא נמצא שם. ב-Linux הנתיב לא קיים, ב-macOS הוא קיים והקריאה ממנו נדחית.
  • ל-host שמחוץ לרשימה אי אפשר להגיע: החיבור נכשל. --allow-host HOST מוסיף אותו להרצה הבאה.
  • משתנה מה-shell שלכם ריק בפנים, אלא אם העברתם אותו עם --env NAME או --env-from-file.
  • כדי לראות מה נדחה, הוסיפו --audit-log: הוא מתעד כל הפעלה וכל חיבור שהפרוקסי התיר או דחה. ai-jail --audit-show מדפיס אותו.
  • כדי להסתכל מסביב בעצמכם, ai-jail bash פותח shell בתוך אותו כלא.

מה תפתחו ביום הראשון

התקנות

ב-Linux עובדות כמו שהן: ה-registries ו-github.com ברשימת ברירת המחדל. ב-macOS הוסיפו אחד, --allow-host registry.npmjs.org, או פתחו הכול עם --network.

שירותים מקומיים

מסד נתונים, שרת MCP מקומי או socket של עורך על ה-loopback של המחשב שלכם: --forward-port 5432 מעביר את הפורט האחד הזה ב-Linux. ב-macOS, --network.

Git push

clone ו-pull מ-GitHub עובדים ב-Linux. ל-push צריך פרטי גישה: --github ל-token של gh ב-HTTPS (ב-macOS הוסיפו --allow-host github.com), או --network --ssh למפתח ה-SSH שלכם.

שרתי MCP

הם עולים בתוך הכלא יחד עם הסוכן. שרת שקורא token מה-shell שלכם לא מקבל כלום עד שתעבירו אותו, --env GITHUB_TOKEN או --env-from-file. שרת מרוחק ב-HTTP צריך את ה-host שלו ב---allow-host.

אם זה לא עולה

אלה המקרים שמופיעים בפרק פתרון התקלות של ה-README, ועוד שני כללי התקנה שאנשים נתקעים עליהם.

bwrap: setting up uid map: Permission denied

בגרסאות Ubuntu 24.04 ומעלה ו-Debian 13 ומעלה יש מדיניות AppArmor שמונעת מתוכנות ליצור user namespaces בלי root, וזו בדיוק הדרך שבה bubblewrap מבודד את הכלא. זה משפיע על כל כלי rootless מהסוג הזה. אפשר לרכך את המדיניות לכל המערכת:

terminal
echo 'kernel.apparmor_restrict_unprivileged_userns=0' \  | sudo tee /etc/sysctl.d/60-userns.confsudo sysctl --system

אפשר גם להשאיר את המדיניות ולהחריג רק את bwrap. שמרו את זה בתור /etc/apparmor.d/bwrap, ואז הריצו sudo apparmor_parser -r /etc/apparmor.d/bwrap.

/etc/apparmor.d/bwrap
abi <abi/4.0>,include <tunables/global>profile bwrap /usr/bin/bwrap flags=(unconfined) {  userns,}

הערך של BWRAP_BIN נדחה

בעזרת BWRAP_BIN אפשר להפנות את ai-jail אל bubblewrap מסוים. הערך מתקבל רק אם הוא מוביל לתוכנה בבעלות root שמשתמשים אחרים לא יכולים לכתוב אליה, או לתוכנה שנמצאת ב-/nix/store רב-משתמשים סטנדרטי. עותק שנמצא בתיקיית הבית שלכם נדחה, כי מי שיכול להחליף את הקובץ הזה שולט בכלא.

opencode נתקע על Starting background server

opencode 2.x מדבר עם שרת רקע משותף. הכלא הוא עטיפה חד-פעמית עם תיקיית בית חדשה, ולכן השרת הזה לא שורד בין הרצות. הפעילו את opencode עצמאי עם --standalone, וקבעו את זה בקובץ ההגדרות כדי לא להקליד אותו בכל פעם. ai-jail מזהיר בזמן ההפעלה כש-opencode עולה בלי זה:

~/.ai-jail
[commands.opencode]command = ["opencode", "--standalone"]

Failed to create stream fd בזמן העלייה

ההודעה מגיעה מסקריפט login של Ubuntu דסקטופ, בזמן ההכנה של mise. היא לא מזיקה, ו-mise ממשיך לעבוד. העבירו --no-mise כדי לדלג על ההכנה של mise, וההודעה תיעלם יחד איתה.

terminal
ai-jail --no-mise claude

לפי סוכן

הכלי ai-jail יודע איפה כל סוכן שומר את ההתחברות שלו ומעגן אותה כברירת מחדל: רק את התיקיות של הסוכן שאתם מעלים, ורק אם הן קיימות. --no-agent-state מכבה את זה. כשהוא מוגדר ב-shell שלכם, גם משתנה מפתח ה-API של אותו סוכן מגיע: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY או GOOGLE_API_KEY, XAI_API_KEY, MOONSHOT_API_KEY.

הצגת הטבלה לפי סוכן
מה מריציםמעוגן כברירת מחדלכדאי לדעת
ai-jail claude~/.claude
~/.claude.json
לפרופיל שני של Claude, הפנו את --claude-dir לתיקייה שלו.
ai-jail codex~/.codexאחרי שינוי גודל החלון, ai-jail שולח אל Codex מקש redraw. ב-macOS, מחוץ ל-lockdown, Codex מקבל shim פרטי של ps; כשמצב הסוכן דלוק הוא מקבל גם את שירותי המערכת המוגבלים שה-app server צריך. --no-agent-state מסיר את השירותים האלה, לא את ה-shim.
ai-jail gemini~/.gemini
ai-jail opencode~/.config/opencode
~/.local/share/opencode
דורש --standalone. ראו את הסעיף בפתרון התקלות למעלה.
ai-jail antigravity~/.geminiחולק את ההתחברות ל-Google עם Gemini, ולכן התחברות אחת משרתת את שניהם.
ai-jail kimi~/.kimiגם ~/.kimi-code, המיקום הישן יותר, מעוגן כשהוא קיים.
ai-jail kiro-cli~/.kiro
~/.local/share/kiro-cli
ב-macOS התיקייה השנייה היא ~/Library/Application Support/kiro-cli.
ai-jail prime-agent~/.prime/agentרק התיקייה של הסוכן עצמו, אף פעם לא כל ~/.prime.
ai-jail devin~/.local/share/devin
~/.config/devin
ההתקנה של ה-CLI עצמו תחת devin/cli/_versions נשארת לקריאה בלבד. עדכנו את Devin במארח, ואז פתחו סשן חדש.
ai-jail ai-memory run claudeהתיקיות של הסוכן שהועלההסוכן ש-ai-memory מעלה מזוהה, ההגדרות שלו מוחלות, ושתי התוכנות רצות בכלא אחד.

אותו דבר עובד עבור crush, grok, jcode, pi, aider, soulforge ו-omp. גם כל פקודה אחרת רצה, עם אותו כלא ובלי תיקיית התחברות. ai-jail פותח כברירת מחדל את ה-host של ה-API עבור חמשת הסוכנים שבשלב 03; סוכנים אחרים צריכים --allow-host או --network.

שימו את הסוכן מאחורי סורגים

כל ai-jail הוא קובץ בינארי אחד, בלי daemon ובלי root. מוסיפים מילה אחת לפני הפקודה שאתם מריצים ממילא.

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude