權限規則是什麼?
權限規則的格式是 Tool 或 Tool(specifier),分成 allow、ask、deny 三種。只寫工具名(如 Bash)匹配該工具的所有使用;加上括號指定更細的範圍,例如 Bash(npm run build) 匹配該完整命令、Read(./.env) 匹配讀取該檔案、WebFetch(domain:example.com) 匹配對該網域的擷取。deny 與 ask 規則還可以用 Tool(param:value) 比對最上層的輸入參數。
為什麼存在?
它讓你在「每次都問」與「全部放行」之間畫出中間地帶:常用的安全命令不再詢問,危險的永遠拒絕。規則可以簽入版本控制與團隊共享,每個開發者也能再自訂。範圍上有明確的優先順序:任何範圍的 deny 都先於 allow,managed 設定的規則最高,連命令列參數都不能覆蓋。
怎麼運作,有哪些限制?
Bash 規則比對 Claude 寫出的命令文字:* 代表任意文字,結尾「空格加 *」也匹配無參數的命令;複合命令(&&、||、;、管線等)每個子命令要各自匹配 allow,deny 與 ask 則任何子命令匹配即生效;比對前會剝掉 timeout、time、nice、nohup 等固定外殼。官方文件明說:deny 或 ask 規則涵蓋的是 Claude 通常產生的寫法,不是圍繞該程式的安全邊界,例如 Bash(rm *) 擋不住 /bin/rm 與 bash -c;要不依賴文字的強制,用沙盒,要自訂檢查,用 PreToolUse hook。
對我有什麼影響?
把規則當成「減少詢問的便利層」,不要當成「禁止某件事的保證」。allow 要寫得具體到包含內層命令(用 Bash(devbox run npm test),不要用 Bash(devbox run *),後者會放行 devbox run 後面的任何東西);真的不能發生的事,交給沙盒或 hook。這段「怎麼用」是我對官方文件的整理。
官方文件的例子:allow Bash(npm run *) 與 Bash(git commit *)、deny Bash(git push *),這樣 npm script 與 commit 不再詢問,git push 被拒;但 git -C . push 不會被 deny 匹配到。
優點是細緻、可共享、有明確優先順序;缺點是只比對文字,繞路寫法與環境執行器容易讓規則比你以為的寬或窄。