מחולל הרשאות לסוכני קוד

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

הכלים מסודרים לפי סדר אלפביתי. כל אחד כותב את הפורמט המתועד שלו.
עריכה בפרויקט, בדיקות ו-lint מותרות; push, התקנות ופקודות אחרות נשאלות.
כלי הרשת של הסוכן, ובכלים שיש להם sandbox, גם הרשת של ה-sandbox.
לא מומלץ: ‏shell יכול למחוק קבצים, לקרוא סודות ולצאת לרשת.
תחילית פקודה אחת בכל שורה, למשל npm run build. מילים בלבד: בלי מרכאות, pipes או משתנים.
שרת אחד בכל שורה: השם שלו ואחריו allow,‏ ask או deny, למשל github ask.

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

נכתב עבור
Claude Code 2.1.x (settings.json permissions, `Bash(cmd *)` rules)
התיעוד נבדק

קובצי ההרשאות שלכם

.claude/settings.json
{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": [
      "Bash(git status *)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(npm test *)",
      "Bash(npm run test *)",
      "Bash(npm run lint *)",
      "Edit(/**)"
    ],
    "ask": [
      "Bash(git push *)",
      "Bash(npm install *)",
      "Bash(npm i *)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(rm -fr *)",
      "Bash(rm -Rf *)",
      "Bash(rm -fR *)",
      "Bash(git push --force *)",
      "Bash(git push -f *)",
      "Bash(git reset --hard *)",
      "Bash(git clean *)",
      "Bash(docker system prune *)",
      "Bash(docker volume prune *)",
      "Bash(sh)",
      "Bash(bash)",
      "Bash(zsh)",
      "Bash(sudo *)",
      "Read(.env)",
      "Edit(.env)",
      "Read(.env.*)",
      "Edit(.env.*)",
      "Read(**/*.pem)",
      "Edit(**/*.pem)",
      "Read(~/.ssh/**)",
      "Edit(~/.ssh/**)",
      "Read(~/.aws/**)",
      "Edit(~/.aws/**)"
    ],
    "defaultMode": "default"
  }
}

שמרו אותו כ-.claude/settings.json בפרויקט (משותף לצוות) או מזגו אותו לקובץ הקיים. כללי deny מכל קובץ הגדרות גוברים על כללי allow.

כדאי לבדוק

שגיאה0
גבוהה0
בינונית0
נמוכה0
מידע0

0 ממצאים: 0 שגיאה, 0 גבוהה, 0 בינונית, 0 נמוכה, 0 מידע.

אין ממצאים.

מה הכלי עושה

סוכני קוד שואלים לפני שהם מריצים פקודה או משנים קובץ, אלא אם קובץ הרשאות קובע אחרת. המחולל כותב את הקובץ הזה ל-Claude Code,‏ Codex CLI או Gemini CLI ממדיניות ניטרלית אחת: מה הסוכן רשאי לעשות לבד, על מה עליו לשאול, ומה אסור לו תמיד.

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

איך זה עובד

  1. הקבצים נכתבים בדפדפן שלכם על ידי ‎@anaroq/agents. אותן בחירות נותנות תמיד אותם bytes; שום דבר שאתם מקלידים לא נשלח, לא נשמר ולא נכנס לקישור.
  2. כל renderer הולך לפי התיעוד של הכלי עצמו, שמופיע ליד הפלט עם התאריך שבו נבדק לאחרונה. כשהכלי מפרסם JSON Schema ‏(Claude Code), הקובץ מפנה אליו.
  3. הכללים נכתבים בסדר שהכלי בודק אותם. ‏Claude Code בודק deny, אחר כך ask ואחר כך allow; ‏Codex מחיל את ההתאמה המחמירה ביותר; ‏Gemini CLI מחיל את העדיפות הגבוהה ביותר, ולכן החסימות מקבלות את העדיפות הגבוהה.

חסום בכל preset

rm -rf, rm -fr
מחיקה רקורסיבית בכוח.
git push --force, git push -f
שכתוב היסטוריה ב-remote.
git reset --hard, git clean
מחיקת עבודה שלא נשמרה ב-commit וקבצים שלא במעקב.
docker system prune, docker volume prune
מחיקת images, קונטיינרים ו-volumes עם הנתונים שבהם.
sh, bash, zsh שקוראים מ-pipe
הסוף של curl … | sh: הרצת סקריפט שהורד.
sudo
כל דבר בהרשאות root.
.env, .env.*, *.pem, ~/.ssh, ~/.aws
קובצי סודות, לקריאה ולכתיבה בכלי הקבצים של הסוכן.

דוגמה

ה-preset לפיתוח מקומי עבור Claude Code, כפי שאותו מנוע כותב אותו בזמן ה-build:

נכתב עבור: Claude Code 2.1.x (settings.json permissions, `Bash(cmd *)` rules)

.claude/settings.json
{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": [
      "Bash(git status *)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(npm test *)",
      "Bash(npm run test *)",
      "Bash(npm run lint *)",
      "Edit(/**)"
    ],
    "ask": [
      "Bash(git push *)",
      "Bash(npm install *)",
      "Bash(npm i *)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(rm -fr *)",
      "Bash(rm -Rf *)",
      "Bash(rm -fR *)",
      "Bash(git push --force *)",
      "Bash(git push -f *)",
      "Bash(git reset --hard *)",
      "Bash(git clean *)",
      "Bash(docker system prune *)",
      "Bash(docker volume prune *)",
      "Bash(sh)",
      "Bash(bash)",
      "Bash(zsh)",
      "Bash(sudo *)",
      "Read(.env)",
      "Edit(.env)",
      "Read(.env.*)",
      "Edit(.env.*)",
      "Read(**/*.pem)",
      "Edit(**/*.pem)",
      "Read(~/.ssh/**)",
      "Edit(~/.ssh/**)",
      "Read(~/.aws/**)",
      "Edit(~/.aws/**)"
    ],
    "defaultMode": "default"
  }
}

מגבלות

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

  • קובץ הרשאות אינו sandbox. הוא מגביל את מה שהסוכן עושה בעצמו, לא את מה שפקודה מותרת עושה: npm test מותר מריץ כל מה שיש בסקריפט הבדיקות.
  • כללי פקודות מתאימים לתחילת הפקודה. דגל בהמשך הפקודה (git push origin main --force), או אותה תוכנית בנתיב אחר או בתוך sh -c, לא נתפסים, ולכן ה-presets שואלים לפני git push עצמו או חוסמים אותו.
  • כללי קבצים חלים על כלי הקבצים של הסוכן. פקודה כמו cat .env היא פקודת shell; החזיקו סודות מחוץ לפרויקט או השתמשו ב-sandbox של הכלי.
  • ל-Codex CLI אין כללים לנתיבי קבצים, והוא מריץ כלל allow מחוץ ל-sandbox שלו, ולכן הקבצים שלו נשענים על ה-sandbox; הממצאים מפרטים מה הושמט.
  • פורמטים משתנים. כל פלט מציין את גרסת הכלי והתיעוד שעבורם נכתב; בדקו אותם מול הגרסה שאתם מריצים.

חבילת העברה לסוכן

מתודולוגיה: איך מחושבים המספרים

מקורות

  1. Claude Code Docs: Configure permissions
  2. Claude Code Docs: Settings files
  3. Codex: Configuration reference
  4. Codex: Rules
  5. Gemini CLI: Policy engine

עודכן

הצעד הבא

חבילת העברה לסוכן

כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה