secs-man: 一款與供應商無關的機密備份工具

secs-man: 一款與供應商無關的機密備份工具

避免關鍵機密的供應商鎖定

secs-man 是一款專為機密資訊的安全備份、還原與驗證而設計的命令列工具。其主要目標是確保使用者不會因為依賴特定的軟體生態系統,而無法在需要時復原最敏感的數據。透過將加密與還原過程與工具本身解耦,secs-man 確保即使軟體不再維護或無法取得,機密資訊仍然可以被存取。

核心哲學:互操作性與標準

secs-man 的基本設計原則是:復原重要數據不應需要使用當初加密它的特定軟體。為了實現這一點,該工具依賴廣泛採用的技術與標準,而非專有格式。

復原技術棧

secs-man 的設計旨在僅使用以下組件即可完美地重現復原過程:

  • 終端機
  • Coreutils: 標準 Linux 工具,例如 cpmvsha256sum
  • age: 一款現代、簡單且輕量化的加密工具
  • 手動操作: 若工具無法使用時,具備執行手動復原步驟的能力

透過依賴 age 進行加密,並使用 coreutils 進行完整性驗證,該工具將因軟體過時而導致數據丟失的風險降至最低。

技術實作與工作流程

secs-man 透過使用中央目錄與一個清單文件 (.secrets-manifest) 來管理機密資訊,該清單文件列出了要管理的檔案,並包含用於還原時的可選擁有者與模式權限。

匯出與加密

在匯出機密資訊時,secs-man 會執行以下步驟:

  1. 完整性檢查:驗證來源檔案的校驗碼。
  2. 加密:使用 age 並透過互動式提示提供的密碼進行加密。該工具絕不會從環境變數、檔案或參數中讀取密碼。
  3. 校驗碼生成:生成一個 *.sha256 檔案以確保加密數據的完整性。
  4. 快照製作:將加密後的檔案儲存到匯出目標目錄中帶有時間戳記的快照內。

匯入與解密

若要還原機密資訊,該工具會使用相同的密碼進行解密,並將其還原至目標目錄。如果清單文件中有所指定,工具會套用正確的檔案擁有者與權限(若未指定模式,則預設為 600)。

驗證

使用者可以透過執行 verify-export 來驗證現有匯出的完整性。此過程會檢查每一個校驗碼是否匹配,以確保舊的匯出內容沒有損壞或發生退化。

遠端機器管理

secs-man 包含一個配套腳本 secs-man-ssh,用於處理遠端主機上的機密資訊,且不會將加密密碼暴露給遠端機器。

  • 從遠端匯出:該腳本會將遠端機密資訊複製到遠端主機上的暫存目錄,將其移動到本地主機,然後在本地執行匯出作業。
  • 匯入至遠端:該腳本會在本地將快照解密到暫存目錄,將明文檔案複製到遠端主機,然後將其匯入至最終的遠端機密目錄。

此工作流程確保了解密過程發生在本地且受信任的機器上,而非在不受信任的遠端主機上。

手動復原流程

由於 secs-man 使用標準工具,因此即使在沒有工具本身的情況下,也可以進行復原。

  • 手動匯出:其行為等同於執行 age --passphrase --output filename.txt.age --encrypt filename.txt
  • 手動驗證:可以使用 find . -name "sha256sums.txt" -execdir sha256sum -c sha256sums.txt \; 來驗證完整性。
  • 手動匯入:可以使用 age --output filename.txt --decrypt filename.txt.age 來解密檔案,隨後手動使用 chmodchown 指令來還原權限。

威脅模型與安全考量

secs-man 在匯出期間會建立快照,且這些快照不會自動清理。這根據機密類型而呈現出不同的風險概況:

  • 身分驗證機密:對於可輪替的密鑰(例如 SSH 或 WireGuard 密鑰),快照帶來的額外風險極小。
  • 解密機密:對於主密鑰或磁碟密鑰,若目前的機密資訊洩漏,舊的快照可能會暴露過去的解密密鑰。作者建議在輪替這類型的機密時,應手動刪除舊的匯出快照。

Sources