你的 Windows VPN 服务器只弹出一个用户名加密码的对话框,却藏着三项互不相同的职责。一项证明来者是谁,一项让旁观线路的人无法重放这份证明,还有一项决定他之后能碰哪些地址。多数小规模部署先加固隧道,把前两项职责留在默认值上,这个顺序是反的。

按攻击者的顺序来。先看线路上能抓到什么。再看这份抓包之后能重放什么。最后看通过认证的攻击者进入后能触达什么。

三项职责,一个对话框

身份是大家最先想到的那部分,却只占问题的三分之一。身份证明必须扛得住一个录下交互、稍后再试一次的旁观者。授权则是身份确定之后服务器另做的决定,Windows 把它放在与校验凭据不同的服务里。

三件事挤在同一个思维篮子里,典型结果就是服务器认真认证,然后放用户触达一切。事后纠正比现在定策略更难,因为那时防火墙配置文件、地址池和路由都已经把旧假设写死了。

动任何设置之前,先在笔记里把三者分开,然后从最薄弱的环节往上修。

MS-CHAPv2 为什么过不了重放测试

如果服务器仍接受带 MS-CHAPv2 的 PPTP,隧道就没有在任何实质意义上保护口令。挑战与响应可被抓取并离线攻击,2012 年一项公开破解服务演示过:典型口令从这种握手中恢复约需一天。更长更复杂的口令只是抬高成本,并不能消除攻击者从网络中取得的材料。

你要的性质是不可重放的凭据。基于客户端证书的 EAP-TLS 让每台设备拥有自己的身份,也能只吊销一台设备。

部署证书是实打实的工程:私有 CA、客户端会校验的吊销路径,以及能扛住人员流动的续期方案。把这件事当成项目,而不是你和一条可用隧道之间的障碍。按更换防火墙的规格来编预算。共享口令只有在第一次吊销之前才便宜。

预共享密钥认证的是这一对网关,不是人

L2TP/IPsec 的预共享密钥只证明两个网关知道同一个秘密。它说不清是哪个在连,也无法在这一层区分员工。请用足够长的随机值,远超某些指南建议的十个字符,因为抓到握手的人可以离线攻击这把密钥。

该配置下所有客户端共用同一个秘密,删掉一个人就意味着要把秘密重新分给其余所有人。在机器级秘密之上保留独立的用户认证步骤,并随客户端规模增长转向证书。预共享密钥叠加 MS-CHAPv2 是两层薄弱环节,后一层把前一层抵掉了。

授权属于 Network Policy Server

Windows 上的 NPS 决定谁能连,而且是在认证已经成功之后才做这个判断。这个分离是产品里最有用的加固控制,很多部署却从不去碰。

让策略条件反映真实约束:组成员、支持人员在岗的时间窗,以及健康检查给出的设备状态。在数据足以支撑摩擦的地方再加一个第二因素,并记住策略是按每次连接尝试评估的,这让它成为活的控制而不是一份文档。

RADIUS 计费还给你一条谁在何时连上的记录。这条日志是有据可查与凭空猜测的分界,不管有没有人去读,它都在。

限制登录成功之后能碰到的范围

VPN 适配器应当落在只放行其角色所需服务、而非整个子网的防火墙配置文件里。路由问题是另一回事,与过滤分开。全隧道保护客户端设备,把每个字节推过你的上行链路;拆分隧道让本地流量留在本地,同时把设备暴露在它当时所在的任何网络上。

两种选择都不是安全默认值。两者都该写下来,就写在它们所假设的防火墙配置文件旁边。

验证失败路径

测该坏的地方:错口令、过期证书、被吊销的设备、组外用户。每一种都该在不同的位置失败,日志也该说清是哪一种。先拿测试账号跑一遍,再用真实用户重跑。一条没有理由就落进事件日志的拒绝,值得在你真正需要这条记录之前很久就修好。

再确认开放了哪些端口、为什么。PPTP 需要 TCP 1723,以及作为 IP 协议而非端口的 GRE;IKEv2 需要 UDP 500 和 4500;L2TP 需要 UDP 1701 加上 IPsec。为了让客户端连上而暴露管理接口不是修复,而是第二起等待被发现的事故。

最后,定下服务器记录什么、记多久。没有认证历史的端点,在事故之后回答不了第一个问题:这次尝试到底有没有被授权过。

相关文章