大家好,我是绎云科技的洋仔。今天跟大家聊聊一个比较舒适的话题SPA(Single Packet Authorization),作为SDP(Software Defined Perimeter)的核心功能,其宗旨是对系统开放端口的保护。
说到系统开放端口保护,首先想到的是防火墙规则,想要限制哪些服务,或是允许哪些IP可以访问哪些服务,都可以灵(fan)活(suo)的配置。下面我们虚构一个场景(如有雷同,此为正版),聊聊端口怎么管理,假设小王是公司的网络管理员,此时公司人员较少也比较固定,小王为每个同事分配了固定的内网IP,公司有个财务系统部署在一台装有Ubuntu系统的服务器上,领导希望只有财务人员才能访问这个服务,于是小王查看了财务大姐的IP地址,轻松的添加两条iptables搞定。下面我们通过一个实验模拟一下。
首先服务器上启动一个python的web server(假装是个财务系统),端口8000, 查看iptables 规则内没有任何规则,默认都可以访问。
下面,我们添加一条阻断规则,重新加载页面,通过抓包分析,客户端在发送三次syn没得到回应后,开启重传:$iptables-A INPUT-ptcp--dport8000-jDROP。
尝试添加一条规则,只允许IP地址为192.168.0.7的主机访问。
再次测试,发现依然无法访问,查看一下规则命中情况,发现新添加的规则没有命中,应该是iptables顺序匹配导致命中第一条就丢弃了。
清除规则,调整一下规则顺序,由于是从上到下顺序匹配的,所以这次我们先配置放行规则,在配置阻断规则:
配置好后重新访问一下, 又可以访问了。查看规则命中, 也正确命中。
随着公司发展,人员变动也越来越大,分配静态IP管理起来太麻烦,于是小王使用DHCP动态的给大家分配IP,但是这样一来财务大姐的工作就会受到影响。如何在保证大家正常工作的同时,又减少管理的复杂性。经隔壁老王指点,你可以给这个业务配置个暗号,只有对上暗号的才能访问,就像四十大盗藏宝的山洞,要说芝麻开门才能打开。这样,财务大姐无论分到什么IP,也都能正常工作。因为别人没有暗号,所以也不能访问。于是小王摸索了一下,安装了一个叫knock的工具。其工作原理如下, knockd开放配置中的多个端口,客户端根据服务器上,knockd进程预先设置的端口顺序依次访问端口,如果顺序正确,则对该客户端开放隐藏的服务端口。整个过程可以参考以下演示:
虽然看上去效果不错,但聪明的小王很快发现了问题:开放端口太多就会影响使用体验,开放端太少,会很容易被猜出来。 为了验证自己的想法,小王找来了自己的程序员朋友小明,让他帮忙写个程序,统计一下看看需要多少次能猜出来。小王说明了knockd的工作原理后,小明很快写了一个程序,并进行了模拟, 假设服务器开放8个端口,需要依次访问5次才能成功敲门,经过计算最多只需要尝试181896次,就可以成功破解。这让小王一惊,这个方法太不安全了,果断放弃。
这下小王又陷入沉思了。几经摸索,小王找到了fwknop(一种SPA方案的实现方法),相比knockd的敲门技术,SPA有以下三个优点:
l 不需要开放额外的端口。
l 可以使用非对称加密。
l 只在网上发送一个单包,且该包不可重放。
依然使用之前的虚构案例,fwknop需要在客户端生成密钥,将客户端的密钥添加到服务器的配置文件中,在服务器设置需要授权访问的服务端口、监听网卡等信息后,还需要配置一条iptables规则,用来阻断到授权服务的访问,这里有个小插曲,对于TCP应用,如果规则目标(TARGET)设置的是DROP 例如:
使用nmap扫描时,会显示该端口被过滤,参见8000端口
这是因为如果端口没启用,系统会返回tcp reset而不是不回应。所以这里我们使用如下规则,让扫描器认为端口没有开放。
到此,准备环境就已经准备就绪,既然fwknop使用iptables做访问控制,首先要看看iptables规则有什么变化。可以看到添加一条
FWKNOP_INPUT的自定义链,这里需要注意, 如果手动调整iptables规则,需要重启fwknop服务, 确保fwnknop的规则在最上。
先访问一下,连接拒绝,是我们想要的结果。
然后我们敲一下门,再次访问一下,可以正常获取到内容, 抓包看到客户端发送了一个UDP的加密报文,报文内容需要看源码才能知道,这里我们先卖个关子,放到下一期源码讲解里。敲门后我们使用另外一个没有执行敲门动作的主机(192.168.0.20)发起请求,抓包看连接被Reset了。
我们再看看Iptables规则,看看敲门前后的变化,发现敲门后,在FWKNOP_INPUT链中多了一条目标为ACCEPT的放行规则。试验完毕,小王的需求已经基本满足。之所以是基本,是因为还有一些问题值得思考。
首先,敲门是单个UDP包,如果报文丢失,怎么能让敲门程序感知到,并给出提示(这个也放到源码分析里吧), 其次敲门的密钥是在客户端生成和留存,有没有更好的管理方式,第三对于同处于一个SNAT后面的不同客户端,一旦其中一个敲门成功,其他人也会获取访问权限,即SNAT导致授权放大。第四当认证客户端数量增大,存在同时敲门时,iptables规则的频繁添加删除,性能是否还能抗的住。其实值得思考的问题还有很多。革命尚未成功,同志仍需努力。这期先写到这,下期见。
参考资料:
http://linux.vbird.org/linux_security/knockd.php
https://blog.csdn.net/he_tao225/article/details/106425229fwknop安装使用