作品集 → Tetherlock

系統與工具 · 安全設計研究Tetherlock

Tetherlock

一個保護本機工作區的存取控制元件。只有三件事同時成立,它才讓應用程式打開工作區:登入的人被允許進入、插入的隨身碟上有簽過名的 token、密碼正確。之後某一次檢查發現隨身碟不見了,它就通知應用程式把工作區鎖上。

允許的帳號、簽過名的 USB 隨身碟和密碼三者同時成立,工作區才會打開;拔掉隨身碟就再次上鎖。
打開要三個條件,關上只要一個。

左右滑動可以看到整張圖。

挑戰

本機工作區除了需要開啟條件,也需要在必要的隨身碟不在時,結束存取的明確規則。

我的貢獻

這是我的個人專案。我訂定存取規則、金鑰設計與上鎖流程,審閱設計並透過實際使用測試;模組由 AI 寫程式代理實作。

這是一份設計說明,附上真實的指令與測試輸出。原始碼在 GitHub 上;沒有錄影,也沒有第三方稽核。只設計了、還沒證明的地方,本頁都會直接寫出來。

概要

三個都成立才打開,少了一個就關上

要解決的問題

本機工作區裡放著敏感檔案。它應該只在三件事同時成立時打開:登入的人被允許進入、插著對的隨身碟、而且知道密碼。隨身碟一離開,就應該再關上。

  • 我負責的部分:定義規則——三道關卡、拔掉就上鎖、沒有後門、一支隨身碟可以保護多個區域且各有自己的密碼,以及用委派維護取代分享管理員密碼
  • 程式由 AI 寫程式代理撰寫;每個設計在動工前都經過我審閱,完成後由我實際使用來測試
  • 把模組抽出來獨立時,上鎖監控和信任機制由 AI 依照同樣的規則重寫

一句話說完規則

帳號被允許+隨身碟上有簽過名的 token+密碼正確→工作區打開
隨身碟被拔掉→工作區上鎖 · 通知應用程式關閉它
01

三道檢查,順序固定

帳號必須被允許、隨身碟上必須有簽過名的 token、密碼必須正確。帳號不被允許的話,密碼視窗根本不會出現。

02

拔掉隨身碟,就上鎖

每一輪檢查都會重新確認每個已打開的工作區。token 不見了、被換掉或已經失效,就鎖上那個工作區,只鎖那一個。

03

維護不必交出管理員密碼

另一種維護用的 token 會明確列出它允許做的事。維護時段預設 30 分鐘後自動結束,隨身碟一拔掉也會立刻結束。

運作方式

一輪檢查怎麼跑,一個區域怎麼開關

一輪檢查:先查帳號,再查隨身碟上簽過名的 token,接著是密碼,打開任何東西之前再檢查一次 token。每道關卡都有自己的拒絕路徑。
一輪檢查,一關一關來。前一關通過,才會問到下一關。

左右滑動可以看到整張圖。

  1. 帳號必須被允許。應用程式回答一個問題:這個帳號可以打開受保護的區域嗎?每一輪都最先問這一題。答案是「不行」,就不會跳出密碼視窗,已經打開的也會上鎖。
  2. 隨身碟上必須有簽過名的 token。檢查簽章、信任的金鑰和有效期限。token 綁定某一支隨身碟時,複製到別支隨身碟就會被拒絕;這項檢查比對的是磁碟區序號,所以擋不住一模一樣的完整複製。
  3. 密碼必須正確。密碼是拿來和儲存的驗證值比對;token 裡從來不含密碼。
  4. 輸入密碼後,再檢查一次隨身碟。重新讀取 token,而且必須和跳出密碼視窗之前找到的是同一個;所以有人打字時隨身碟被拔掉或換掉,什麼都不會打開。
一個受保護區域的生命週期:已上鎖、詢問中、已打開,以及每一條回到已上鎖的路。
一個受保護區域的生命週期。多個區域可以同時打開,各自綁在自己的隨身碟上。

左右滑動可以看到整張圖。

保持打開,以及關上

已打開的區域每一輪都會重新檢查。只要隨身碟被拔掉、token 被換掉、過期或是由已淘汰的金鑰簽的,或帳號不再被允許,那個區域就會上鎖,並通知應用程式關閉它。其他隨身碟打開的區域維持打開。關閉畫面、拒絕資料操作是應用程式的工作;Tetherlock 負責告訴它什麼時候該做。

委派維護

另一種 token 會列出它允許的權限項目,而且只有應用程式認得的項目才會被授予。維護時段只存在記憶體裡,預設持續 30 分鐘;每次使用都會重新檢查時間和 token。拔掉隨身碟,下一個動作之前就會結束。

實際畫面

獨立版本的七個畫面

終端機:tetherlock init-keys、add-trusted-key 和 issue-token 都執行成功。
01簽發:建立一組金鑰、信任公鑰,再把簽好的 token 寫進隨身碟。
終端機:verify-token 回報簽章有效、密碼通過。
02允許:簽章有效、隨身碟相符、密碼正確。
終端機:執行四次 verify-token,每一次都以錯誤結束。
03拒絕:密碼錯誤、token 被改過、簽署者不明、token 過期。每一種都被拒絕。
終端機:demo-key-1 淘汰之後,它簽的 token 就驗證不過了。
04輪替:加入新金鑰、淘汰舊金鑰;舊金鑰簽的 token 就不能再用。
終端機:用 scope maintenance.v1 和兩個權限項目執行 issue-token。
05委派:維護用的 token,只允許它列出的事。
測試執行:26 個上鎖流程的測試案例通過。
06解鎖和上鎖的每一條規則,都有對應的測試。
測試執行:42 個情境測試案例通過;完整測試組 143 個通過、1 個跳過。
07在獨立版本上跑的資安情境測試。
1 / 7

用新產生的示範金鑰跑出來的真實指令與測試輸出,擷取於 2026-09-22 和 2026-09-26。路徑已縮短,隨身碟序號已隱藏。點一下畫面,可以用原尺寸開啟。

設計決策

三個決定與否決的做法

01

輸入密碼之後,再查一次隨身碟

輸入密碼要花幾秒,這段時間裡,隨身碟可能被拔掉,或換成另一支、用同一個磁碟機代號的隨身碟。所以在輸入密碼之後、打開任何東西之前,會重新讀取並驗證 token。

否決的做法:只在跳出密碼視窗前檢查一次隨身碟,之後一直相信那次的結果。

02

沒有萬能鑰匙

沒有復原金鑰,也沒有繞過的方法。唯一會給出存取權的程式碼,在密碼檢查之後才執行。代價也接受了:所有簽署金鑰都遺失時,信任關係必須從頭重新建立。

否決的做法:「為了永遠救得回來」而設的緊急繞過機制。後門會變成最容易進來的路。

03

拿不準,就先上鎖

檢查時發生預期外的錯誤,或區域打開期間 token 變得讀不出來,就先把區域鎖上,再回報錯誤。擁有者偶爾可能得重新解鎖一次。

反過來,維持打開、等有人來看,只要沒人發現,門就一直開著。

範圍與限制

它自己做的,和留給別人的

Tetherlock 決定受保護的工作區能不能打開,也負責再把它關上。它不加密裡面的檔案:工作區密碼會被檢查,但它不是加密金鑰。讓隨身碟的內容無法被讀取,是全磁碟加密的工作。它也分不出一支隨身碟,和逐位元完整複製的副本。

已完成

  • 簽過名的 token、密碼驗證值、隨身碟綁定
  • 可以輪替金鑰的信任清單
  • 解鎖與上鎖的監控
  • 委派維護
  • 解鎖後才載入模組
  • 加密的交接封包,以及管理用的命令列工具

已驗證 · 2026-09-26

  • 143 個測試通過、1 個跳過(Python 3.10 與 3.14)
  • 全新安裝後,README 的快速上手從頭到尾跑完
  • 把監控裡的每一項保護逐一拿掉,每一次都有測試失敗

還沒有

  • 工作區檔案的加密
  • 撤銷清單
  • 第三方資安稽核
  • 使用者介面;畫面由應用程式自己提供
  • 實際環境中,拔掉隨身碟後多久上鎖:沒有量測

如果你的團隊需要這種思考方式,同樣的思路也出現在 AI Control Center:一次核准,只對它當初核准的那個版本有效。

在新分頁開啟