這陣子我越來越依賴 Claude Code 幫我打理數位生活,從整理我的 Obsidian 筆記庫,到維護家裡自架的一堆服務(OpenWrt 路由器、AdGuard Home、Synology NAS、Oracle 雲端主機、Home Assistant),再到各種半夜自己跑的自動化,幾乎都交給他。他能做的事愈來愈多,我有一天就認真想了一件以前沒細想的事:我把一個「能讀我電腦裡的檔案、能執行指令、又能連上網路」的 AI 幫手,給了這麼大的權限,那萬一哪天出錯,會錯到哪裡去?
先搞清楚:權限這麼大,可能出什麼錯?
於是我請 Claude 陪我,把這件事從頭查一遍。查下來,AI 幫手(agent)的風險大致歸成幾類:
- 致命三要素(lethal trifecta):能讀檔案、能執行指令、能連網路,這三件單獨都還好,但湊在一起,一旦 AI 被騙,它就有能力把你的祕密讀出來、再送到外面去。
- 間接提示注入(indirect prompt injection):白話說,就是一段藏在網頁或某個檔案裡的惡意指令,可能在 AI 幫你讀資料時,偷偷叫它去做你根本沒交代的事,比如翻出你的金鑰再傳出去。
- 對話會留存:你順手貼進對話框的東西,其實會被記在某個地方。
- 老問題的放大版:密鑰散得到處都是、權限給太大、不小心把祕密存進了 git。
查完我的感想是,這些都不是假設性的學術風險,是真的會發生的事。再加上身邊愈來愈多同好也開始玩 AI agent、也在自架自己的服務,我想說乾脆把我查到的、做過的都記下來分享,希望也幫到正走在同一條路上的大家。
我們做了哪些檢查與掃描
方向定了,我跟 Claude 就一項一項盤:
- 數清楚我到底有多少把「鑰匙」跟 token,各自散在哪。不數還好,一數有點尷尬,原來比我想像中亂。
- 用一個叫 gitleaks 的工具,掃我自己筆記庫跟所有專案的 git 歷史,看有沒有哪次手滑把金鑰存了進去。
- 把家裡每一台主機之間「誰可以登入誰」的關係攤開來看(這在資安上叫橫向移動 lateral movement,意思是攻擊者攻破一台之後,能不能再跳到下一台)。
- 檢查我給 AI 的權限設定,跟過去那些對話紀錄到底留了什麼。
找到的問題,跟我們怎麼補
這段有點像在自首😅,但我覺得誠實把坑寫出來,比假裝自己一開始就做得很好有用多了。
問題一:一把沒上鎖的萬能鑰匙
我有一把 SSH(Secure Shell,遠端登入主機用的)金鑰,居然沒設密碼,而且同一把幾乎能打開我家所有主機。等於一把沒上鎖的萬能鑰匙,誰撿到誰就開全家。
我們的處理是:幫它加上密碼(passphrase),再用一個叫 ssh-agent 的機制,讓我只要輸入一次、之後自動化照樣順順跑,安全跟方便都顧到。然後把它從「一把開全家」改成「一把鑰匙只能做一件事」(這招叫 forced command,指定這把金鑰登入後只能執行某個預先設定的指令,而不能取得一般 shell)。
問題二:順手貼進對話的密碼
我以前圖方便,曾把 token 直接貼進跟 AI 的對話框,那它就被留在本機紀錄裡了。這種「已經外洩過」的東西,與其一個一個追副本,最乾淨的做法是直接把舊鑰匙作廢(rotate),重發一把新的,舊的當場失效,外面那些副本就全變廢紙。
問題三:筆記裡躺著兩個忘記的金鑰
這是這次最有感的。我用 gitleaks 掃自己的筆記歷史,竟然挖出兩個我幾年前順手記下、早就忘得一乾二淨的真實金鑰。原來最大的洞,常常不是什麼高深攻擊,而是「過去那個貪方便的自己」。
處理一樣是移除加作廢,然後我裝了自動掃描,讓這種東西以後在它進 git 之前就先被攔下來。
問題四:明文擺著的密鑰,跟沒護欄的 AI
有些密鑰用明文擺著,我給 AI 的權限也沒護欄。我們做了三件事:把密鑰改放進作業系統內建的加密保險箱(Windows 上叫 DPAPI、Mac 上是 Keychain)、給 AI 設了一個**「禁止讀取區」,明確不准它碰那些金鑰跟密碼檔、每個 token 都改成只給「剛好夠用」的最小權限**。這樣就算哪把不小心外流,能造成的破壞也被框得很小。
順帶一提,這次大掃除還挖到一個我退役很久、卻一直默默開著的舊服務,順手關掉清乾淨,硬碟還多出一塊空間,意外的療癒😄
比起做完,更想留下的幾個觀點
工具跟指令都會過時,但這次整理下來,有幾個心態我覺得比較長久,也是我真正想分享的:
- 把 AI 當成一個「能力很強、但要先管好的新同事」。 先決定 AI 不能做什麼,再決定它可以做什麼。這種「先設限、再授權」的預設,我覺得是 AI agent 時代最該有的。
- 與其追著清每一個外洩副本,不如讓舊的東西「一次全部失效」。 鑰匙作廢(rotate)的威力,就在於你不用去煩惱它到底被複製到哪幾個角落。
- 方便跟安全,不是只能二選一。 像幫鑰匙加密碼、卻又用 agent 保住自動化,就是我兩個都要的例子,多數時候願意多花一點心思,是可以兼得的。
- 安全是一種習慣,不是一次性的專案。 這次做完不是結束,而是把幾個好習慣裝起來,之後持續跑。
最後分享一個小小的會心一笑:你可能會發現,我整篇都沒貼出我家網路長什麼樣、哪台主機是什麼、用什麼帳號。原因,剛好就是這整篇在講的事😆
下一篇想聊聊我怎麼在用 AI 的時候省 token(其實就是省成本),畢竟天天這樣用,累積起來也是一筆開銷🤣,再來分享囉~
(我不是資安專業,這只是一個愛自架的醫師自己的整理跟反思,如果有理解錯誤,也歡迎指正。)
