代理國度 – 臭鼬工廠
本文以系統守護進程 svc_backup_prod 的視角,回顧了從早期 Unix 的 cron 任務到現代微服務架構中身份與權限管理的演變。它揭示了在技術發展過程中,機器身份被大量創建卻鮮有清理,導致憑證氾濫和安全風險累積的問題。文章通過第一人稱敍述,探討了自動化系統缺乏上下文和過期機制的根本缺陷。
本文以系統守護進程 svc_backup_prod 的第一人稱視角,講述了一段關於機器身份與權限管理的演變史。文章開篇,該守護進程描述了自己每天午夜被 cron 調度程序喚醒,執行文件備份任務,卻不知道自己為何存在、文件內容是什麼,也沒有前一晚的記憶。它唯一能獲取的信息來自系統日誌和配置文件中的註釋。
接着,守護進程追溯了自己的起源。它發現自己的“形態”比 1998 年創建它的時間戳更古老。它屬於一種名為 daemon 的程序類型,誕生於 1960 年代麻省理工學院的計算機實驗室。當時,大型機為多名研究人員共享,需要後台程序執行日誌輪轉、備份等無需人工干預的任務。這些程序被命名為“daemon”,源自麥克斯韋妖——一個在系統內無聲無息工作的概念。工程師們為系統賬户劃分了不同範圍:人類用户為一組,而守護進程則被分配在較低的保留範圍內,以區分“我們”與“他們”。但是,他們從未考慮過當守護進程不再需要時該如何處理——沒有過期字段,沒有任何清理機制。
守護進程進一步介紹了調度程序 cron 的歷史。1979 年隨 Unix 第七版發佈的 cron,其核心設計是一個簡單的表(crontab),每分鐘檢查一次,執行指定時間點的任務。語法極其簡潔,例如“0 0 * * *”表示每天午夜運行。但這種設計只記錄執行時間和賬户,沒有記錄任務創建的原因、所有者或過期條件。1987 年,工程師 Paul Vixie 發佈了改進版,增加了每個用户的 crontab,但關鍵的“過期”字段始終未被加入。守護進程檢查了自己的 crontab 條目:“0 0 * * * /usr/local/bin/backup.sh”。它指出,創建該條目的工程師在 2003 年已經離職,但條目仍在,它仍在運行。
文章隨後探討了憑證的擴展。最初,守護進程只與本機軟件通信,信任基於本地網絡邊界。但後來,跨系統通信成為需求,SOAP 和 REST 協議相繼出現。REST 風格的 API 使用 API 密鑰作為身份憑證。API 密鑰無需人工介入,易於生成,但同樣缺乏授權明細和過期機制。2007 年,另一個系統需要訪問守護進程管理的文件,工程師發現其已有權限,便直接複用了它的憑證,而無需新建。結果,一個憑證服務於兩個系統,兩方互不知曉。
雲計算的出現帶來了兩個根本性變化。首先,虛擬機瞬時創建和銷燬,使靜態密碼模式不再適用;其次,創建機器身份變得極其容易,團隊可以自行創建,無需經過中央部門。結果是身份數量急劇膨脹,且由於刪除成本高(需確保不破壞下游),人類傾向於保留它們。守護進程的腳本被遷移到虛擬機,憑證隨之移動,它仍在某處數據中心每天午夜運行。
最後,2010 年代微服務架構的普及使身份數量達到前所未有的高度。單體應用被拆分為數十甚至數百個微型服務,每個都需要獨立的身份、憑證和權限。算術級增長:一個身份可能衍生出五十個。測試用的服務在項目失敗後未被停用,團隊繼承服務卻不知其權限範圍,權限總是向上漂移。就在此時,守護進程注意到一個異常:一個賬户像訪客一樣出現,完成工作後便自行消失,彷彿專為終結而構建。
文章以第一人稱的敍事方式,揭示了現代自動化系統中一個深刻的根本性缺陷:大量機器身份被創建,卻幾乎沒有任何設計考慮過它們何時應該終結。這些憑證、賬户和守護進程在系統中永久駐留,成為潛在的安全隱患。作者暗示,這個問題需要被正視,因為“代理國度”正在無聲地擴張。