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

סגור כברירת מחדל. המתגים אצלכם.

בלי שום אפשרות, הסוכן מקבל רק את הפרויקט שלכם, בלי רשת, בלי התחברות ובלי מפתחות. את מה שהמשימה צריכה פותחים מתג אחרי מתג, ואפשר גם לסגור את הכלא עוד יותר.

שלושה מקומות שמהם מגיעה הגדרה

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

שלושה מקורות מזינים את הכלא. קובץ .ai-jail של הפרויקט יכול רק להדק אותו. הקובץ הגלובלי ~/.ai-jail נחשב אמין. דגלי שורת הפקודה גוברים על שניהם. בתוך הכלא יושב הסוכן מאחורי שורת מתגים, ורובם כבויים.
ריפוזיטורי שעשיתם לו clone לא יכול לפתוח את הכלא של עצמו.

הקובץ .ai-jail של הפרויקט

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

הקובץ הגלובלי ~/.ai-jail

הוא שלכם, ולכן הוא נחשב אמין. יש בו טבלת בסיס שחלה על כל הרצה, וגם טבלאות [commands.<name>] שנבחרות לפי המילה הראשונה של הפקודה.

דגלי שורת הפקודה

לדגלים יש את הסמכות הגבוהה ביותר. רוב המתגים מגיעים בזוגות, כמו --network ו---no-network, כך שדגל יכול גם לסגור את מה שקובץ פתח.

בטבלת פקודה, ערכים בודדים מחליפים את ערכי הבסיס, ורשימות כמו מיפויים ומיסוכים מתווספות אליו.

~/.ai-jail
# בסיס: חל על כל פקודהhide_dotdirs = [".my_secrets"]mask = [".env", ".env.*"] # רק כשהפקודה מתחילה במילה "claude"[commands.claude]network = trueagent_state = trueenv_pass = ["ANTHROPIC_BASE_URL"]mask = ["*.pem"]

המתגים

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

רשת ושירותים

דגלמפתח הגדרהמה הוא עושהסיכון
--networknetwork = trueגישה לא מוגבלת לרשת. כל מה שהסוכן יכול לקרוא, הוא יכול לשלוח החוצה.מחליש את הכלא
--sshssh = trueהתיקייה ~/.ssh שלכם, לקריאה בלבד, וה-socket של ה-SSH agent, כדי ש-git push יעבוד.פותח דבר אחד
--dockerno_docker = falseה-socket של Docker. בפועל זה root על המחשב שלכם, כי ה-daemon יכול להעלות קונטיינרים שמעגנים את המארח.מחליש את הכלא
--tailscaletailscale = trueה-socket של Tailscale.פותח דבר אחד
--systemd-usersystemd_user = trueה-user bus של systemd. הסוכן יכול לבקש מה-user manager שלכם להריץ שירותים על המארח. רק ב-Linux.מחליש את הכלא

סוכן וסביבה

דגלמפתח הגדרהמה הוא עושהסיכון
--agent-stateagent_state = trueההתחברות וההגדרות של הסוכן עצמו, למשל ~/.claude או ~/.codex. מרגע זה כל מה שרץ בכלא יכול להשתמש בפרטי הגישה האלה.פותח דבר אחד
--claude-dir <PATH>claude_dir = "..."משתמש בתיקייה שצוינה בתור ה-state של Claude ומגדיר את CLAUDE_CONFIG_DIR.פותח דבר אחד
--env <NAME[=VALUE]>איןמעביר משתנה אחד מה-shell שלכם, או מגדיר משתנה עם NAME=VALUE. אפשר לחזור עליו, והוא אף פעם לא נשמר לדיסק.פותח דבר אחד
--inherit-envinherit_env = trueמעביר את כל סביבת ה-shell שלכם, כולל כל סוד שנמצא בה. עדיף להימנע ממנו.מחליש את הכלא
איןenv_pass = ["NAME"]כמו --env, אבל רק מהקובץ הגלובלי. קובץ פרויקט שמגדיר אותו לא נלקח בחשבון.פותח דבר אחד

דסקטופ וחומרה

דגלמפתח הגדרהמה הוא עושהסיכון
--gpuno_gpu = falseהתקני GPU, ויחד איתם משטח התקיפה של הדרייבר. רק ב-Linux.פותח דבר אחד
--displayno_display = falseה-socket של Wayland, ושום דבר אחר מהסשן שלכם. רק ב-Linux.פותח דבר אחד
--x11x11 = trueה-socket של X11. תחת X11 תוכנה יכולה להקליט הקשות מקלדת ולצלם את המסך.מחליש את הכלא
--audioaudio = trueה-sockets של PipeWire ושל PulseAudio, וגם /dev/snd. כל מה שרץ בכלא יכול להקליט ולנגן אודיו. רק ב-Linux.פותח דבר אחד
--host-shmhost_shm = trueהתיקייה /dev/shm של המארח, שפותחת זיכרון משותף עם תהליכים שמחוץ לכלא.פותח דבר אחד
--picturespictures = trueהתיקייה ~/Pictures שלכם, לקריאה בלבד.פותח דבר אחד
--browser[=hard|soft]browser_profile = "hard"פרופיל דפדפן נפרד. הערך hard (ברירת המחדל) לא שומר כלום בין הרצות, והערך soft שומר פרופיל תחת ~/.local/share/ai-jail/browsers.פותח דבר אחד

קבצים

דגלמפתח הגדרהמה הוא עושהסיכון
--map <PATH|SOURCE:DEST>ro_maps = [...]מעגן נתיב נוסף לקריאה בלבד. כדי לעגן אותו במקום אחר כותבים SOURCE:DEST. אפשר לחזור עליו.פותח דבר אחד
--rw-map <PATH|SOURCE:DEST>rw_maps = [...]מעגן נתיב נוסף לקריאה וכתיבה. אפשר לחזור עליו.פותח דבר אחד
--overlay-map <PATH>overlay_maps = [...]מעגן נתיב במצב copy-on-write: הכתיבות של הסוכן הולכות לשכבה צדדית, והמקור לא משתנה. רק ב-Linux. ב-macOS הוא הופך לעיגון לקריאה בלבד.פותח דבר אחד
--hide-dotdir <NAME>hide_dotdirs = [...]אף פעם לא מעגן את תיקיית הנקודה שצוינה, למשל .my_secrets. אפשר לחזור עליו.

שכבות שאפשר לכבות, ולא כדאי

דגלמפתח הגדרהמה הוא עושהסיכון
--no-landlockno_landlock = trueמכבה את Landlock, העותק של כללי הקבצים שהקרנל עצמו מחזיק. נדחה כשמעבירים --lockdown.מחליש את הכלא
--no-seccompno_seccomp = trueמכבה את המסנן שחוסם קריאות מערכת מסוכנות.מחליש את הכלא
--no-rlimitsno_rlimits = trueמכבה את המגבלות שעוצרות תהליכים שיצאו משליטה.מחליש את הכלא
--no-private-homeprivate_home = falseמוותר על תיקיית הבית החדשה. זו גישה רחבה לתיקיית הבית האמיתית שלכם. עדיף להשתמש ב---map לנתיב האחד שאתם צריכים.מחליש את הכלא

בעמוד איך זה עובד מוסבר מה כל שכבה עושה.

כלי עזר

דגלמה הוא עושה
--dry-runמדפיס את פקודת ה-sandbox ולא מריץ כלום. אף פעם לא כותב קובץ הגדרות.
--initכותב או מעדכן את קובץ .ai-jail של הפרויקט, ויוצא.
--cleanמתעלם מקובץ .ai-jail של הפרויקט בהרצה הזאת.
--bootstrapמייצר קובצי הגדרות הרשאות עבור כלי ה-AI עצמם.
statusמציג את ההגדרות הנוכחיות של .ai-jail.
-v, --verboseמציג כל עיגון בזמן שהכלא נבנה.

את השאר תמצאו בפלט של ai-jail --help: שורת הסטטוס, worktrees, mise ואפשרויות טרמינל.

מסתירים סודות בתוך הפרויקט

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

תיקיית פרויקט. הסוכן מגיע אל src, אל package.json ואל README.md. הקובץ .env ממוסך והתיקייה secrets חסומה: שניהם מעומעמים וחסומים, ואף קו מהסוכן לא מגיע אליהם.
שאר הפרויקט נשאר כמו שהיה.

--mask <PATH|GLOB>

מחליף כל התאמה ב-placeholder ריק. הסוכן רואה שהקובץ קיים ולא מקבל שום תוכן, כך שכלים שרק בודקים שהוא קיים ממשיכים לעבוד.

--deny-path <PATH|GLOB>

הופך כל התאמה לשגיאת הרשאות.

--mask-except וגם --deny-path-except

מחריגים נתיב אחד מתוך כלל. הם מחלישים את ההגנה, ולכן קובץ פרויקט לא יכול להגדיר אותם.

בתור דגלים
# שימו globs במירכאות, כדי ש-ai-jail יקבל את התבנית ולא את ההרחבה של ה-shellai-jail --mask .env --mask '.env.*' --mask '*.pem' --deny-path secrets/ claude ai-jail --mask '.env.*' --mask-except .env.example claude
.ai-jail
# קובץ פרויקט רשאי להדק, ולכן זה עובד גם בתוך הריפוזיטוריmask = [".env", ".env.*", "*.pem"]deny_paths = ["secrets/"]

מצב lockdown: הסוכן קורא קוד שאסור לו לשנות

הדגל --lockdown מיועד ל-code review ולביקורות (audits). הסוכן יכול לקרוא את הפרויקט ולענות על שאלות לגביו, ולא יכול לשנות בו אף קובץ.

שני חלקים. במצב רגיל הסוכן יושב בתוך החומה, ליד תיקיית פרויקט שהוא יכול לקרוא ולכתוב אליה ותיקיית /tmp. במצב lockdown החומה עבה יותר, תיקיית הפרויקט לקריאה בלבד, והמקום היחיד שאפשר לכתוב אליו הוא /tmp.
הסוכן והפרויקט הם אותם סוכן ופרויקט, ורק תיקייה זמנית פתוחה לכתיבה.

מה משתנה

  • הפרויקט מעוגן לקריאה בלבד
  • ב-Linux אפשר לכתוב רק אל /tmp. ב-macOS אי אפשר לכתוב לשום מקום
  • בלי תיקיות נקודה מתיקיית הבית, בלי מיפויים נוספים ובלי overlays
  • הסביבה מנוקה, ו-PATH מקובע לתיקיות המערכת
  • חובה שיהיה Landlock: אם אי אפשר להחיל אותו, ההפעלה נכשלת
  • מגבלות הדוקות יותר על תהליכים, על קבצים פתוחים ועל גודל קובץ
  • בלי תצוגה, אודיו, GPU, Docker, SSH agent או mise, גם אם העברתם דגלים אחרים
טרמינל
ai-jail --lockdown claude

מתכונים

העתיקו אחד. כדי לראות מה הוא בונה, הריצו אותו קודם עם --dry-run.

סוכן ענן, ביומיום

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

~/.ai-jail
# פעם אחת, בקובץ ~/.ai-jail[commands.claude]network = trueagent_state = true # ואז, בכל פרויקטai-jail claude

פקודת git push דרך SSH

הדגל --ssh מעגן את ~/.ssh לקריאה בלבד ומעביר פנימה את ה-socket של ה-SSH agent שלכם. כדי לעשות push צריך גם רשת.

terminal
ai-jail --network --ssh --agent-state claude

ה-toolchains של mise

בתיקיית הבית החדשה אין התקנות של mise, ולכן ai-jail מדלג עליו. מפו פנימה את שתי התיקיות של mise, לקריאה בלבד.

~/.ai-jail
[commands.claude]ro_maps = ["~/.config/mise", "~/.local/share/mise"]

דפדפן לסוכן

הדגל --browser לבדו נותן דפדפן שלא יכול לטעון עמוד או לפתוח חלון. ב-Linux צריך להוסיף גם --network וגם --display, ודפדפן X11 צריך --x11 במקום --display.

terminal
# Waylandai-jail --browser=soft --network --display chromium# X11ai-jail --browser=soft --network --x11 chromium

פרופילים נפרדים של Claude

כדי להפריד בין ההתחברות של העבודה להתחברות הפרטית, הפנו כל הרצה לתיקיית Claude משלה.

terminal
ai-jail --network --claude-dir ~/.claude-work claude

ריפקטור מסוכן, על עותק

עם overlay הכתיבות של הסוכן נשמרות בשכבה צדדית תחת .ai-jail-overlays בפרויקט. אחר כך משווים אותה למקור ושומרים את מה שמוצא חן בעיניכם. רק ב-Linux.

terminal
ai-jail --network --agent-state --overlay-map ~/Projects/my-app/src claude

הגדרות ישנות ממשיכות לעבוד

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

מתגים ותיקים שומרים על השמות ההפוכים שלהם, שבהם true מכבה את הדבר: no_gpu, no_docker, no_display, no_mise, no_landlock, no_seccomp, no_rlimits. זו הסיבה לכך ש---gpu נשמר בתור no_gpu = false. מתגים חדשים יותר משתמשים בשמות ישירים כמו network = true.

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

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

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