一台笔记本坏掉时,里面还配着三条 WireGuard 隧道,配置文件仍留在磁盘上。把它们复制到替换的机器上,得到的服务会启动,然后却起不来。这些文件受一把属于创建它们的账户和机器的密钥保护,所以字节可以搬走,读取它们的能力却不行。下面的步骤从找到文件开始,一直讲到真正能恢复服务的选项。

隧道文件现在放在哪里

存储位置随版本变化过。较旧的安装把配置文件放在系统配置文件的本地应用数据中一个 WireGuard\Configurations 文件夹下,而当前版本使用程序文件目录树里的一个数据目录。每条隧道都是一个带双扩展名的单独文件,扩展名说明了保护方式:

Get-ChildItem "C:\Program Files\WireGuard\Data\Configurations"

.dpapi 这个后缀不是装饰。该文件是一个受保护的数据块,服务就是被设计成以这种确切形式来读取它。从它安装隧道的受支持方式,是调用一个指向该数据块的高权限命令:

$blob = "C:\Program Files\WireGuard\Data\Configurations\hq.conf.dpapi"
wireguard.exe /installtunnelservice $blob

该命令只有在能够解开这个数据块的上下文中才会成功。它安装的是一个服务;它不会替你解密任何东西。

为什么这个数据块换台机器就打不开

保护机制从用户的登录凭据中派生密钥,并根据所选范围,还会用到机器。Microsoft 关于这个保护调用的文档说,默认范围属于执行加密的用户和机器,而整机范围的选项会改变谁可以解开它。两种情况下,密钥都存放在操作系统的凭据材料里,而不是文件内部。 密文可以移动,密钥不行。

取得文件夹的所有权只改变一个 ACL,别的什么也改变不了。把旧磁盘装进硬盘盒,再把数据块复制到新电脑,你得到的是一段密钥从未被复制过的密文。这是密码学层面的失败,重装多少次服务都改变不了。新机器没有那个账户的主密钥,旧的密钥存储也不会跟着文件一起走。

把设置存进经过混淆的文件的产品,正好清楚地区分这两种情况。仅仅被混淆的配置,只要你找到关闭混淆的开关就能读;受保护的数据块没有密钥就一直是关着的。把两者混淆,会让人去找一个根本不存在的解码器。

旧系统还能启动时该做什么

如果安装还能启动,就以创建隧道的账户登录,从客户端导出这些隧道。导出会生成普通的配置文件,备份从这时起才变得可以携带。

如果磁盘可读但 Windows 无法启动,受保护的文件实际上已经丢了。承诺能恢复它们的工具,要么运行在你已经没有的原始上下文中,要么要求你交出数据块和旧磁盘镜像,这个决定值得停下来想一想。

不管走哪条路,都把了解到的东西记下来:隧道名称、端点和公钥。名称和端点让你能快速重建,公钥则让对端能确定该删掉哪条记录。

改为从对端一侧重建

对于你自己控制的对端,生成一对新密钥,把新的公钥加入对端列表。对于企业或托管端点,请管理员签发新密钥并移除旧的。这个请求和你遭窃后会提的一样,因为磁盘丢失意味着旧的私钥必须当作已经暴露。

然后用你记录下来的值重建隧道,在删除其他任何东西之前先确认握手成功。对端上的旧条目应当在同一处变更中消失,这样被偷走的磁盘之后就无法重新连上。

这条教训属于备份策略,而不是恢复工具。WireGuard 配置就是一份凭据:谁持有私钥,谁就持有对端的身份,中间没有第二道密码。要么有意识地把配置导出,和其他机密一起保存;要么接受恢复就意味着重新签发密钥,并把每条隧道适用哪种选择写下来。

相关文章