Readie.

佈建系列 · 02 安全與權限

安全與權限:別被假護欄騙了

網路上流行的「安全三件套」有個危險的誤解:它推薦的第一層其實擋不住 AI 自己的刪除。這頁說清楚每一層到底擋什麼、擋不了什麼,以及企業真正該倚靠的底線在哪。

重點:分清「防手誤」「防呆」與「真隔離」

SECTION 01先搞清楚:三層各擋什麼

最關鍵的觀念校正:alias rm='trash' 擋不住 Claude 自己跑的 rm。Claude 的 Bash 工具用的是非互動 shell,不讀 ~/.zshrc、不展開 alias,所以那個別名只保護「你在終端機手打 rm」,不會約束 AI。把它當成「防 AI 誤刪的第一層」是錯的。

機制實際擋的是擋不了
rm→trash 別名你本人手打的 rm(防手誤)Claude 自己的刪除(非互動 shell 不吃 alias)
Bash deny 黑名單常見危險指令的直球寫法(防呆)換句話繞過:不同空格、find -delete、python -c、子 shell
不開 bypass + managed deny + 容器真正的隔離與底線—(這才是企業該倚靠的)
一句話

黑名單給人「已經安全」的錯覺最危險。它是防呆,不是沙箱。真正的安全來自:預設不開 bypass、把絕對禁止放進使用者改不掉的 managed 層、需要硬隔離時用容器或沙箱跑。

SECTION 02權限四模式怎麼選

permissions.defaultMode 決定 Claude 動作前要不要問你。企業共用機的重點:絕不要把 bypassPermissions 當預設

模式行為企業建議
default所有動作都要確認新人 / 共用機的安全預設
acceptEdits檔案編輯自動、指令仍要確認熟手日常,效率與安全平衡
plan只提計畫、不執行盤點 / 評估高風險改動時
bypassPermissions不再確認(除被 deny 的)⚠️ 僅限隔離容器,共用機禁用

SECTION 03垃圾桶(給人用的防手誤)

還是值得裝——它保護「你本人手滑」。只是定位要正確:這是防你自己,不是防 AI。

bash
# 給「人」用的防手誤:刪除進垃圾桶而非真刪
brew install trash
cat >> ~/.zshrc << 'EOF'
alias rm='trash'      # 只影響你在終端機手打的 rm
alias rm!='/bin/rm'   # 真的要硬刪時用 rm!
EOF
source ~/.zshrc

SECTION 04危險指令黑名單(防呆層)

把高風險指令加進 permissions.deny,降低誤觸機率。記得它不是密封沙箱,只是其中一層。

bash
# 防呆層:把高風險指令加進 deny(會跳出阻擋)
#  注意:這是「防呆」不是「沙箱」,能降低誤觸但無法保證擋死
test -f ~/.claude/settings.json || echo '{}' > ~/.claude/settings.json
jq '
  .permissions = (.permissions // {}) |
  .permissions.deny = (((.permissions.deny // []) + [
    "Bash(rm -rf:*)", "Bash(rm -fr:*)", "Bash(rm -r:*)",
    "Bash(sudo:*)", "Bash(dd:*)", "Bash(mkfs:*)",
    "Bash(diskutil erase:*)", "Bash(chmod -R 777:*)",
    "Bash(git reset --hard:*)", "Bash(git push --force:*)",
    "Bash(git clean -f:*)", "Bash(shutdown:*)", "Bash(reboot:*)"
  ]) | unique)
' ~/.claude/settings.json > /tmp/cc.json && mv /tmp/cc.json ~/.claude/settings.json

SECTION 05強制執行層:Hooks(真正擋得住)

黑名單與權限模式都是「請 AI 自律」。要程式化、無條件攔截,用 PreToolUse hook:在工具實際執行前跑你的腳本,腳本說 deny 就一定擋下——不管 Claude 怎麼想。官方也明說「要硬擋就用 hook,不要靠 CLAUDE.md 或權限提示」。

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "~/.claude/hooks/guard.sh" }
        ]
      }
    ]
  }
}
bash
#!/usr/bin/env bash
# ~/.claude/hooks/guard.sh — 真正的程式化攔截(不靠 AI 自律)
input="$(cat)"
cmd="$(echo "$input" | jq -r '.tool_input.command // ""')"
case "$cmd" in
  *"git push"*main*|*"rm -rf"*)
    jq -n '{hookSpecificOutput:{hookEventName:"PreToolUse",
      permissionDecision:"deny",
      permissionDecisionReason:"此操作被 hook 規則禁止"}}'
    exit 0;;
esac
echo '{}'   # 其餘放行
  • 怎麼擋:腳本 exit 2,或回傳 permissionDecision: "deny",該次工具呼叫就被攔下。
  • 常見用途:commit 前強制跑 lint/測試、禁止 push main、攔截破壞性指令、把敏感輸出先過濾再給 AI。
  • 企業佈建:把 hook 設定放 managed 或專案層、腳本納入佈建腳本,全隊一致且改不掉。

SECTION 06企業護欄(真正的底線)

黑名單放在 user 層,使用者自己能改掉;企業要的是改不掉的底線——放進最高優先序的managed-settings.json,全機一致、無法關閉。這才是「出事可追、人人一致」的關鍵。

bash
# 企業底線(使用者改不掉、關不了):把絕對禁止的放這層
sudo mkdir -p "/Library/Application Support/ClaudeCode"
sudo tee "/Library/Application Support/ClaudeCode/managed-settings.json" >/dev/null <<'JSON'
{
  "permissions": {
    "defaultMode": "default",
    "deny": [
      "Read(./.env)", "Read(./**/*.key)", "Read(./**/*.pem)",
      "Bash(rm -rf:*)", "Bash(curl:* | sh)", "Bash(sudo:*)"
    ]
  }
}
JSON
怎麼接進佈建

這一段會由核心佈建的一鍵腳本一併佈署。安全分層的完整脈絡(四層優先序)也在那頁。

把工具變成戰力

佈建好環境,只是開始。
讓全公司真的用同一套,才是價值。

Readie 幫台灣中小企業把 AI 從「裝好了」帶到「天天在用、人人一致」——不換系統、不買新軟體,從你們每天已經在用的工具與一台 Mac Mini 開始。

Readie AI 導入顧問 · 創辦人 Marco Liu · 19 年產業經驗