secs-man: 一款與供應商無關的機密備份工具
secs-man: 一款與供應商無關的機密備份工具
避免關鍵機密的供應商鎖定
secs-man 是一款專為機密資訊的安全備份、還原與驗證而設計的命令列工具。其主要目標是確保使用者不會因為依賴特定的軟體生態系統,而無法在需要時復原最敏感的數據。透過將加密與還原過程與工具本身解耦,secs-man 確保即使軟體不再維護或無法取得,機密資訊仍然可以被存取。
核心哲學:互操作性與標準
secs-man 的基本設計原則是:復原重要數據不應需要使用當初加密它的特定軟體。為了實現這一點,該工具依賴廣泛採用的技術與標準,而非專有格式。
復原技術棧
secs-man 的設計旨在僅使用以下組件即可完美地重現復原過程:
- 終端機
- Coreutils: 標準 Linux 工具,例如
cp、mv與sha256sum - age: 一款現代、簡單且輕量化的加密工具
- 手動操作: 若工具無法使用時,具備執行手動復原步驟的能力
透過依賴 age 進行加密,並使用 coreutils 進行完整性驗證,該工具將因軟體過時而導致數據丟失的風險降至最低。
技術實作與工作流程
secs-man 透過使用中央目錄與一個清單文件 (.secrets-manifest) 來管理機密資訊,該清單文件列出了要管理的檔案,並包含用於還原時的可選擁有者與模式權限。
匯出與加密
在匯出機密資訊時,secs-man 會執行以下步驟:
- 完整性檢查:驗證來源檔案的校驗碼。
- 加密:使用
age並透過互動式提示提供的密碼進行加密。該工具絕不會從環境變數、檔案或參數中讀取密碼。 - 校驗碼生成:生成一個
*.sha256檔案以確保加密數據的完整性。 - 快照製作:將加密後的檔案儲存到匯出目標目錄中帶有時間戳記的快照內。
匯入與解密
若要還原機密資訊,該工具會使用相同的密碼進行解密,並將其還原至目標目錄。如果清單文件中有所指定,工具會套用正確的檔案擁有者與權限(若未指定模式,則預設為 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來解密檔案,隨後手動使用chmod與chown指令來還原權限。
威脅模型與安全考量
secs-man 在匯出期間會建立快照,且這些快照不會自動清理。這根據機密類型而呈現出不同的風險概況:
- 身分驗證機密:對於可輪替的密鑰(例如 SSH 或 WireGuard 密鑰),快照帶來的額外風險極小。
- 解密機密:對於主密鑰或磁碟密鑰,若目前的機密資訊洩漏,舊的快照可能會暴露過去的解密密鑰。作者建議在輪替這類型的機密時,應手動刪除舊的匯出快照。