你的 VPN 配置文件里有私钥,不只是设置
服务器地址就排在私钥、内嵌的秘密和令牌旁边。把配置文件粘贴到支持帖子之前,先弄清哪几行才是身份。
每个把 VPN 配置文件粘贴到论坛帖子里的人,都从同一个想法出发。文件里只有服务器地址和几项设置,所以分享它感觉就像分享一个电话号码。然后有人读了一遍,在第四行发现了一个未加密的私钥。
配置文件不是关于隧道的文档。它是隧道的身份,被写了出来。
文件里的对象并不共享同一个保密级别
公开的 CA 证书本来就是要流通的。客户端私钥不是。当两者出现在同一个文件里,无害的那部分让整个附件看起来是安全的。这就是陷阱。
OpenVPN 在设计上让情况更糟。它允许把证书、密钥和认证材料直接内嵌进去。这对部署很方便,对分享却是灾难。以可读的证书块开头的文件,会一路延伸到私密的那一半。
WireGuard 把这一点说得更直白。接口部分带着私钥,每个对等端还可以再加上一个预共享密钥。哪些行重要,毫无含糊之处。几乎每一行都重要。
截图是同一处泄露的另一种格式
把配置编码成二维码,并不会让它变成预览。二维码承载的是同样的字节,房间里的任何手机摄像头都能解码。客户端的配置窗口也一样,密钥就明明白白地留在角落里。
认证文件和被引用的密钥路径属于同一项审查。指向外部文件的配置文件并不会自动更安全,因为那个路径可能通向读者够得着的地方。认证文件里的令牌和密码一样好用,而且它很少看起来像密码。
发送错误文本,而不是密钥
诊断需要错误文本、客户端版本和试过的选项名称。它不需要密钥。用这三样东西写出问题,并在文件离开你的机器之前,替换掉每一个秘密和每一个不必要的网络标识。
OpenVPN 的内联文件手册章节是一张有用的地图,标出了这些对象的位置。它也提醒你,一个配置文件能装下多少这样的东西。
# which lines in this profile look like secrets?
grep -n -E 'PrivateKey|PresharedKey|password|auth-user-pass|BEGIN .*PRIVATE KEY' wg0.conf
# OpenVPN: show the structure without printing key material
awk '/BEGIN/{print NR": "$0} /^[a-z-]+ /{print NR": "$1}' office.ovpn
然后请读一遍最终的附件,而不是凭记忆相信自己的修改。密钥藏在后面的块里、没有遮盖的注释里,以及你判定为结构性内容的那一行里。
一旦暴露,轮换是唯一的修复
删除帖子不会撤销任何东西。拿到文件的人仍然握有可用的凭据,所以签发方必须通过服务自己的流程撤销或更换它。删掉本地副本,对另一端毫无影响。
用受保护的方式保存正在使用的配置文件,并有意识地删除过时的导入条目,而不是把三份副本留在下载文件夹里。你不再使用的配置文件,在被撤销之前仍然是一份凭据。
值得养成的习惯很小。在任何配置文件离开机器之前,问一问除了地址还有什么,并且靠读文件来回答,而不是靠记忆。