打开 auth-nocache 后,密码缓存警告消失,OpenVPN 为下一次重新协商保留的凭据副本也一并消失。这会变成提示、静默重试还是断开的隧道,取决于第二次凭据从哪里来。因此这是部署形态之间的比较,而不是对选项的判决。编辑任何配置文件之前,先读清你实际运行的形态。

第二套凭据必须从哪里来

OpenVPN 把 auth-nocache 应用于 auth-user-pass 和 askpass 收集的机密:一旦用过,进程就丢弃它们,而不是留到下一次握手。重新协商按计时器到来,默认每小时一次,所以第二次请求到达时,输入密码的人早已离开。这个空档就是全部。缓存保持开启时,客户端直接重放已保存的副本,不询问任何人;缓存关闭时,它必须在别处找到机密,否则失败。

因此,列出那一刻机密可能来自的每个地方,并诚实说明其中哪些在该主机上存在。终端前的人、auth-user-pass 或 askpass 能读取的文件,或服务器签发的会话令牌,是这里重要的三种。如果它们都不可用,重新协商会在更改后一小时失败,而不是在你做出更改的那一刻失败。

三种形态,三个失败点

有人坐在前面的桌面客户端是温和情况:提示回来,有人重新输入密码,代价是注意力。无终端运行 OpenVPN 的服务、容器或路由器是严酷情况,因为无人应答,曾经静默的重连现在会结束隧道。混合形态介于两者之间,在能够应答提示的会话消失之前,表现如桌面情况。区分它们的不是是否安装了 GUI,而是重新协商时是否存在凭据来源。

在改动任何东西之前,把你的部署归入这三种形态之一,因为网上找到的建议几乎总是为第一种写的。把桌面的答案套用到无终端服务上,正是运行数月的隧道开始每小时掉线的原因。

指令还是标志:选一个,并知道用了哪个

在配置文件里,auth-nocache 是独立的一行;在显式指定配置文件的调用里,它是该命令行上的标志,OpenVPN 手册 列出了两种形式。两者对凭据保留的作用相同,也都不触及接口类型,也不修复同一日志里无关的警告。区别在持久性:标志只覆盖那一次运行,因此从 unit 文件或包装脚本重启的服务不会有它,除非包装器也传递它。

auth-nocache
openvpn --config /path/client.ovpn --auth-nocache

决定哪个产物拥有这项设置,只在那里改,别处不改。笔记本上编辑过的配置文件,加上用标志覆盖它的 systemd unit,正是重启后产生矛盾行为的那一对。

凭据文件是把机密挪个地方,而不是删除它

把 auth-user-pass 指向文件,会让之后每次重新协商都有来源,也会把密码放在重启之后仍然存在的地方。问清楚谁能读那个文件、守护进程降权后是否还能读,以及文件系统只读挂载或容器视图隐藏路径时会发生什么。磁盘上的机密和内存里的机密是不同的问题,解决一个,另一个仍在原处。轮换正是被跳过的步骤:在服务器上改了密码却没改文件,会产生看起来像网络故障的失败。

让文件归运行守护进程的账户所有,其他人不可读,并放在离开主机的备份之外。OpenVPN 的服务端 auth-gen-token 选项会在登录成功后给客户端一个会话令牌,比起账户密码,这是更小的遗留物。无论如何都把轮换步骤写在文件旁边,因为文件通常比创建它的人活得更久。

拉长重新协商是转移代价,而不是消除它

另一个建议是提高 reneg-sec,直到提示稀少到可以忽略。这会重写会话的密钥轮换安排,把同样的凭据问题推到更晚、更不可预测的时刻;它并不创造凭据来源。因某种原因按计划更新密钥的策略,不应仅仅为了避免输入密码就放宽。

测试重连,而不是你正坐着的会话,因为活着的会话什么也证明不了。从服务器端断开隧道,或重启客户端服务,然后看没有人敲键盘时下一次重新协商会做什么。如果它重连成功,说出提供机密的机制;如果没有,你就找到了这个选项在这台主机上的真实代价。无论哪种结果,给你的都是在故障期间仍成立的答案,而不是只在测试期间成立的答案。

在受管机群里,部署的拥有者应当能说出三件事:凭据从哪里来、存在哪里、谁来轮换。如果其中任何一个答案是当初配置主机的人,那么该选项在那里还不安全。

相关文章