iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
Claude AI

Claude Code 實戰筆記:AI coding 沒有新問題系列 第 8

# Day 8:給 AI 一把萬能鑰匙,跟不給鑰匙一樣危險

  • 分享至 

  • xImage
  •  

最小權限原則

1975 年,Saltzer 和 Schroeder 在一篇 IEEE 論文裡提出了一組後來成為資安基石的設計原則。其中最常被引用的一條:最小權限 — 每個程式、每個使用者,只應該擁有完成工作所需的最小權限集合。不多給,不預留「以防萬一」的額外權限。

這個原則解決的不是惡意攻擊的問題。它解決的是「好人犯錯」的問題。一個擁有 root 權限的工程師不一定會故意搞破壞,但一個手滑的 rm -rf 就夠了。權限收窄不是因為不信任,是因為限縮爆炸半徑。

五十年後,同一個問題出現在 AI coding agent 上。

兩種極端都不能用

一端是全開:agent 可以讀任何檔案、跑任何指令、推任何 branch、刪任何東西。方便,但一個 hallucination 就可能 force push 到 main、把 .env 裡的 API key 印到 log 裡、或是刪掉不該刪的檔案。

另一端是全鎖:每一個動作都要人確認。安全,但你花在按「確認」的時間比自己寫 code 還多。Agent 變成一個需要逐行審批的實習生 — 有 agent 跟沒有一樣。

大部分有用的工作發生在中間地帶。問題是中間地帶怎麼劃。

deny → ask → allow

Claude Code 的權限模型用三個層級處理這件事:

deny — 不管怎樣都不准。Agent 試了也會被擋下來。典型的 deny 對象:讀 .env、跑 rm -rf、force push、改 CI/CD 設定。這些事犯一次錯的代價太高,直接封死。

allow — 不用問,直接做。典型的 allow 對象:讀 code、跑測試、跑 lint、寫測試檔。這些事就算做錯也容易復原,不值得每次都打斷工作流。

ask — 做之前問一聲。Agent 告訴你它打算做什麼,你看一眼決定放行或擋下。典型的 ask 對象:改 production code、跑不認識的 shell 指令、commit、安裝新的 dependency。

三層的優先順序是 deny > ask > allow,而且不論規則的具體程度。一條 deny 規則擋了 Bash(aws *),就算另一條 allow 規則明確放行 Bash(aws s3 ls),deny 還是贏。這個設計讓你可以先大範圍 allow,再針對危險指令加 deny — 而不用逐條列舉所有安全的指令。

中間地帶才是設計重點

deny 和 allow 很好決定。真正要花時間想的是 ask — 哪些事值得暫停讓人過目。

ask 太多,agent 每三十秒彈一次確認框,你開始無腦按 yes — 這跟 allow 沒有差別,還多了假安全感。ask 太少,等於默認 agent 做的所有事都對 — 直到它做了一件不對的。

設計 ask 的判斷標準跟 Day 7 的 CI 閘門是同一個邏輯:只在高風險且不可逆的交界點暫停。改 code 可以 git revert,可以放寬。但 git push 出去之後只有 force push 能救,值得 ask。安裝 dependency 改了 lock file,影響整個團隊,值得 ask。刪檔案不一定撈得回來,值得 ask。

一條實用的判斷法:如果這個動作做錯了,能在三十秒內復原嗎?能,allow。不能,ask。永遠不該做,deny。但如果動作的影響會外溢 — 觸發部署、通知團隊、推到別人看得到的 branch — 就算技術上能復原,也值得 ask。

實際數據印證了這個觀察:Anthropic 的使用統計顯示,使用者在 ask 提示出現時有 93% 的機率按下確認。換句話說,大部分 ask 其實是 allow — 只是多了一個打斷工作流的確認框。Claude Code 在 2026 年加入了 auto mode 來回應這個問題。用 --enable-auto-mode 或是 shift+tab 切換模式來啟動,agent 背後跑一個獨立的分類模型,即時評估每個動作的風險等級 — 低風險的直接放行,高風險的才暫停問人。不是取消 ask,是讓 ask 回到它該出現的頻率。

Permission mode 是一組預設姿態,從最保守到最開放覆蓋不同情境。日常開發用 auto,省掉大部分不必要的確認框。CI 環境沒有人可以按確認,用 dontAsk — 只有明確列在 allow 清單上的動作能跑,其餘靜默拒絕。模式決定預設姿態,deny / ask / allow 規則決定個別例外 — 兩層疊起來,就是完整的權限設計。

一個 pattern,五十年

Saltzer 和 Schroeder 在 1975 年設計的不是 AI 權限。他們設計的是多人共用電腦的時代,怎麼讓每個使用者只能存取自己該存取的東西。

Unix 把這個原則變成 rwx — 三個 bit 乘以三個角色,九個 bit 定義一個檔案的所有存取權限。AWS IAM 把同一個原則變成 JSON policy — allow、deny、condition,一條規則定義一個角色能對哪些資源做什麼操作。

Claude Code 的 deny / ask / allow 跟這些是同一個 pattern。差別在多了 ask — 因為 AI agent 不是「完全信任或完全不信任」的對象。它比腳本聰明,需要一定的自主空間;但它會 hallucinate,不能完全放手。ask 就是為這個灰色地帶設計的。

五十年前的原則從來不是「怎麼限制笨工具」。而是「怎麼跟有能力但會犯錯的執行者合作」。


延伸閱讀


上一篇
# Day 7:測試全過了,不代表能交付
下一篇
# Day 9:AI 每次對話都從零開始,跟新人沒有差
系列文
Claude Code 實戰筆記:AI coding 沒有新問題9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言