Claude Code 權限控管:用 settings.local.json 保護你的專案


🎯 前言

Claude Code 是一個強大的工具,但「強大」也意味著它能做的事情很多——包括你可能不想讓它做的事。

這篇文章介紹如何用 settings.local.json 設定 Claude Code 的工具使用權限,讓 AI 在你的專案中運作時,只能使用你授權的工具。


🔐 為什麼需要權限控管?

預設情況下,Claude Code 可以使用很多工具:

  • 讀取和修改檔案
  • 執行 bash 指令
  • 搜尋程式碼
  • 存取網路

在大多數情況下,這些都是你希望它能做的事。但在某些特定場景下,你可能需要限制:

場景一:測試環境保護 你有一個正式資料庫的連線設定在本地,不希望 Claude 誤觸任何資料庫操作。

場景二:程式碼審查模式 你只想讓 Claude 分析程式碼,不希望它直接修改任何檔案。

場景三:敏感專案 開發過程中有些目錄(例如包含金鑰的設定目錄)不應該被 AI 讀取。


📂 設定檔的位置

Claude Code 的權限設定可以放在:

位置影響範圍用途
~/.claude/settings.json全域(所有專案)個人預設值
.claude/settings.json單一專案(提交到 git)團隊共用設定
.claude/settings.local.json單一專案(不提交 git)個人本地覆蓋

重要.claude/settings.local.json 應該加入 .gitignore,因為它通常包含個人環境的特定設定。


⚙️ settings.local.json 的結構

基本結構如下:

{
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff*)",
      "Bash(npm run*)"
    ],
    "deny": [
      "Bash(rm -rf*)",
      "Bash(sudo*)",
      "WebFetch"
    ]
  }
}

規則說明

  • allow:明確允許的工具/指令
  • deny:明確禁止的工具/指令
  • 支援萬用字元 *:例如 Bash(git *) 代表所有 git 指令

優先級

deny 的優先級高於 allow。如果一個指令同時匹配 allow 和 deny 規則,會以 deny 為準。


🛡️ 我的實際設定

我在 AppSystem(Legacy PHP 7.4 企業系統)的設定:

{
  "permissions": {
    "allow": [
      "Bash(dir:*)"
    ]
  }
}

這個設定非常簡潔:只允許 dir 指令(Windows 的目錄列舉),其他所有 Bash 指令都需要手動確認。

這樣的設定是因為:

  • 這是一個生產環境相鄰的開發環境
  • 資料庫中有真實的機構資料
  • 我希望 Claude 在執行任何腳本前,都需要我手動確認

每次 Claude 想執行一個不在 allow 清單中的指令時,它會詢問我是否允許。這增加了一點摩擦,但對於敏感的生產環境這是值得的。


🎯 常見設定場景

場景一:只讀模式(Code Review 用)

適合你只想讓 Claude 分析程式碼,不允許任何修改:

{
  "permissions": {
    "deny": [
      "Write",
      "Edit",
      "Bash(rm*)",
      "Bash(git commit*)",
      "Bash(git push*)"
    ]
  }
}

場景二:前端開發環境

允許 npm/node 相關操作,但限制系統層級指令:

{
  "permissions": {
    "allow": [
      "Bash(npm *)",
      "Bash(npx *)",
      "Bash(node *)",
      "Bash(git status)",
      "Bash(git diff*)",
      "Bash(git add*)",
      "Bash(git commit*)"
    ],
    "deny": [
      "Bash(sudo*)",
      "Bash(rm -rf*)",
      "Bash(curl*)",
      "Bash(wget*)"
    ]
  }
}

場景三:Docker 開發環境

允許 Docker 操作,但防止直接修改系統:

{
  "permissions": {
    "allow": [
      "Bash(docker *)",
      "Bash(docker-compose *)",
      "Bash(git *)"
    ],
    "deny": [
      "Bash(sudo*)",
      "Bash(apt*)",
      "Bash(yum*)"
    ]
  }
}

場景四:資料庫敏感環境(我用的方式)

對需要保護資料庫的環境,收緊所有自動權限:

{
  "permissions": {
    "allow": [
      "Bash(dir:*)",
      "Bash(ls*)",
      "Bash(cat*)",
      "Bash(grep*)"
    ]
  }
}

所有寫入操作、資料庫操作、網路操作都需要手動確認。


🔍 如何查看目前的權限狀態

在 Claude Code 中,你可以詢問目前的設定:

我:目前的 settings.local.json 有哪些權限設定?

Claude 會讀取設定檔並告訴你目前的狀態。

你也可以在 session 開始時,讓 Claude 確認它能做什麼:

我:在開始工作之前,請確認目前的權限設定,
告訴我你可以自動執行哪些操作,哪些需要我手動確認。

這個習慣有助於在協作開始前就對齊期望。


⚠️ 注意事項

1. settings.local.json 不要提交到 git

這個檔案通常反映個人的本地環境設定,不應該提交。 確保你的 .gitignore 包含:

.claude/settings.local.json

2. 過度限制會降低效率

如果限制太嚴格,Claude 每個動作都需要手動確認,會大幅降低效率。 根據你的信任程度和風險等級找到平衡點。

3. 和 CLAUDE.md 搭配使用

在 CLAUDE.md 中記錄這個專案的權限限制,讓 Claude 理解為什麼某些操作會被拒絕:

## 權限設定

這個專案的 .claude/settings.local.json 限制了自動執行指令的權限,
原因是資料庫連接指向生產環境相鄰的資料庫。

執行任何 SQL 操作前,請先告訴我你要執行什麼,讓我確認後再執行。

💡 建議的設定流程

  1. 先不設定,觀察 Claude 的行為

    • 開始使用 Claude Code,觀察它自動執行了哪些操作
    • 哪些讓你覺得「這個我希望它先問我」
  2. 建立初始設定

    • 把讓你不安的操作加入 deny
    • 把你確定安全的操作加入 allow
  3. 持續調整

    • 每次因為權限不足而需要手動確認時,評估是否要加入 allow
    • 每次感覺 Claude 的操作太危險時,加入 deny
  4. 記錄在 CLAUDE.md

    • 說明為什麼有這些限制,讓 Claude 理解脈絡

🎉 結語

settings.local.json 是一個簡單但有效的保護機制。 它不是要阻礙 AI 協作,而是在你需要的地方加上一層確認機制。

對於 Legacy 系統或生產環境相鄰的開發環境, 這個小小的設定可以避免不小心執行了某個危險操作。

一開始設定稍微嚴格一點,隨著你對 Claude Code 的信任度提升,再逐步放寬——這是比較安全的策略。


📎 相關文章