单包授权 (SPA) 实现服务隐身
在最近对接华为的项目中,遇到了一个安全问题:为了支持远程办公,必须在公网开放VPN接入点,但端口扫描、暴力破解、漏洞探测轮番上阵,安全告警没完没了。尝试了常规的加固手段后,决定换个思路:能不能让这个服务端口在平时关闭对外不可见,只有合法用户才能让它临时开放?这就是最后引入单包授权的初衷。
一、SPA到底解决了什么问题?
我们在公网的服务器上运行着 wireguard服务,监听在udp 51820端口。只要这个端口暴露着,就不断有探测流量。虽然wireguard协议本身很安全,但被扫描本身就是一种信息泄露,而且持续的恶意连接尝试也在消耗资源。
SPA带来的根本改变是扫描器看不见我们了,因为目标端口在防火墙层面默认是关闭状态。只有知道暗号的人才能触发开门,这个暗号是一个加密的、一次性有效的特殊数据包。并且开门时间极短,通常只开放几十秒给特定IP,完事就关。
二、工作流程
我们在客户端开发了一个小工具,在发起wireguard连接前,自动发送SPA包。对终端用户来说,这个过程是无感知的,点击连接后等待1-2秒,就连接成功了。
1. 客户端要连接时,先用本地存储的密钥生成一个SPA包
2. 这个包发给服务器的任意开放端口,比如我们用的 udp 12345 端口,或者是不用端口封装在 icmp 包中也可以。
3. 运行在服务器上的特定服务捕获到这个包,验证通过后,自动添加iptables规则允许源ip访问udp 51820 端口,有效期30秒。
4. 客户端立即向 51820 端口发起wireguard握手连接,30秒后规则自动删除,端口再次对外不可见。
最好的防御是让攻击者找不到目标,使用 spa 技术后,服务端日志变干净了,以前每天几千条端口扫描告警,现在几乎为零。还有就是服务端资源占用下降,服务器不再需要处理大量的恶意连接尝试,cpu和内存使用更加平稳。
三、什么场景适合用 SPA
根据我们的经验,SPA 适合:
1. 需要暴露在公网的端口,比如 SSH、数据库管理端口。
2. 还有就是企业VPN或者零信任网关的接入点,就像我们的场景。
3. 内部服务需要临时对外开放,比如给第三方临时访问权限。
因为 SPA 带来一次服务敲门的延迟,因此它并不适用对对延迟极度敏感的业务以及被频繁大量访问的服务上。