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 密钥),快照带来的额外风险极小。
- 解密密钥:对于主密钥或磁盘密钥,如果当前密钥泄露,旧的快照可能暴露过去的解密密钥。作者建议在轮换此类密钥时,手动删除旧的导出快照。