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 操作前,請先告訴我你要執行什麼,讓我確認後再執行。
💡 建議的設定流程
-
先不設定,觀察 Claude 的行為
- 開始使用 Claude Code,觀察它自動執行了哪些操作
- 哪些讓你覺得「這個我希望它先問我」
-
建立初始設定
- 把讓你不安的操作加入 deny
- 把你確定安全的操作加入 allow
-
持續調整
- 每次因為權限不足而需要手動確認時,評估是否要加入 allow
- 每次感覺 Claude 的操作太危險時,加入 deny
-
記錄在 CLAUDE.md
- 說明為什麼有這些限制,讓 Claude 理解脈絡
🎉 結語
settings.local.json 是一個簡單但有效的保護機制。
它不是要阻礙 AI 協作,而是在你需要的地方加上一層確認機制。
對於 Legacy 系統或生產環境相鄰的開發環境, 這個小小的設定可以避免不小心執行了某個危險操作。
一開始設定稍微嚴格一點,隨著你對 Claude Code 的信任度提升,再逐步放寬——這是比較安全的策略。
📎 相關文章: