每一种无人值守的重连方案最终都会遇到同一个问题:密码存放在哪里。流行的答案是任务操作本身,而这恰恰是最糟糕的位置。还有另外两种设计。哪一种合适,取决于机器能否在无人参与的情况下完成认证,以及服务器是否接受证书。

任务操作会留下哪些可读内容

计划任务中的参数是其定义的一部分,而不是隐藏的运行时值。任何能读取该任务、还原其备份或导出其 XML 的人,都会看到与你输入的完全一致的字符串。运行期间,同一个字符串会出现在进程列表中。监控代理可能把它复制进你从不查看的日志。

schtasks /query /tn "VPN Reconnect" /xml
cmdkey /list

在假设相反之前先检查。第一条命令会打印完整定义,包括操作及其参数。第二条显示当前账户缓存了哪些凭据,这对下面的替代设计很重要。如果密码出现在任务的 XML 中,轮换它只是修复的一半,因为任务仍保留着旧值。

存储的预共享密钥究竟换来了什么

Add-VpnConnection -L2tpPsk 把密钥写入连接的电话簿条目,而不是写入任务。这比任务操作的暴露面更小。它仍然是可恢复的秘密,因为机器上的管理员可以读取电话簿。

对于你控制的两台机器之间的实验链路,这种交换或许可以接受。对于共享端点上的用户凭据则不行。称其为加密存储并不改变谁能读取它。电话簿是一个配置文件。要为能打开它的人做规划,而不只是为能以该用户身份登录的人做规划。

Winlogon 凭据去掉了秘密,却增加了一项依赖

-UseWinlogonCredential 选择了另一条路。连接使用 MSCHAPv2 对照已登录用户的凭据进行认证。该账户不会额外存储任何东西。

它带来的依赖很显著。必须有一个可借用的交互式登录,这就排除了服务账户和登录前任务。连接还会继承该用户凭据在服务器上能触及的一切。要把这个开关理解为关于凭据来源的说明,而不是安全设置。它改变的是来源,而不改变服务器之后如何授权会话。

证书认证之所以可扩展,是因为什么都不存储

在服务器支持 EAP-TLS 的地方,计算机证书完全消除了共享秘密,吊销发生在证书层。以 SYSTEM 运行的任务可以在没有交互式登录的情况下出示该证书。在围绕它构建之前,先确认服务器接受证书认证。依赖不受支持方法的设计只是计划,而不是方案。然后决定私钥存放在哪里:设备身份放在计算机存储,个人身份放在用户存储。

在无法避免用户名和密码的地方,把它们存进 Credential Manager,并限定在任务自己的账户范围内。让客户端从那里读取,而不是从参数读取。任务无需打印就能取到的秘密,比写进其定义的秘密问题更小。

在下一次轮换之前检查这些产物

看实际存储了什么,而不是你打算存储什么。检查每个用户的电话簿、所有用户共用的副本、任务的 XML 以及任何调用拨号命令的脚本。然后确认证书或缓存凭据限定在任务使用的账户范围内,因为为你交互式账户存储的凭据对 SYSTEM 是不可见的。

把认证方式和账户记在任务自己的备注里。下一个修改服务器策略的人需要知道正在使用哪种设计。这个答案无法只从重连行为看出来。把它写在下次轮换最先查看的地方。

相关文章