概述
在做企业生产网络安全相关工作时,首先考虑的就是对服务器端口的管控。可以这么说,中小型企业如果能对服务器端口做严格管控,极大程度上缩小了攻击面,那么入侵事件会相应少很多,对处于救火阶段的安全建设起到立竿见影效果,有点四两拨千斤的味道,值得安全人员花心思在上面。
开放端口
大致上可以定下如下规则:
- 非业务端口一概不对外开放
可以在防火墙或其他网络设备上默认拒绝所有端口的(入/出)流量,然后再针对业务添加需要开放的端口,这样避免了管理工作上的混乱。
- 管理端口必须经过内部统一认证登录,必要时可以加上二次验证。
如果有堡垒机当然最好了,我在开发运维跳板机的过程就嵌入了 Google Authenticator 二次验证因子,使得员工登录服务器除了验证静态密钥外,还需要验证动态密码。
- 对那些开放外网权限的服务,需要做深入的渗透测试。
当然这并不能说要求渗透测试找出所有安全问题,这是不可能的,但是要保证不能携带高危漏洞上线,并且要求做到在收到安全告警时能迅速定位到问题,这才是最主要的。
严格按照上面的规则执行,抵御一些脚本小子的恶意攻击还是绰绰有余的。
监控管理
制定了规则,如何及时发现遗漏或者错误呢?换句话说也就是如何来做端口状态监控这事情呢?有一款 HIDS 是通过定期在主机上执行 netstat 命令探测端口开放情况的,但在一般的互联网创业公司,考虑到成本和收益,这种 HIDS 在服务器上部署 Agent 的方式很少被采用,服务器上仅部署业务相关服务,部署 HIDS 显得过于臃肿了。
在多人运维的环境中,iptables 规则被改错或者设错的情况时有发生,不知不觉高危端口就对外开放了(比如说 SSH,Redis 等),带来的后果十分严重,具体危害可以参考前段时间的(MongoDB)勒索事件以及前年(2015年)的 Redis 事件。
除了规范 iptables 操作外,我们还能做的就是定期对公司 IP 资产做端口扫描,包括服务发现,如果探测是 HTTP 服务,则需要抓取 title 信息。为了提高扫描产出比,分两个任务执行,全端口扫描(次/周)和常规端口扫描(次/天)。全端口这里就不解释了,常规端口就是指一些企业常用到的端口,比如 SSH(22),Rsync(873),MySQL(3306),8080…。这里推荐下猪猪侠的工具 Wyportmap,自己拿来修改下是能满足需求的,工具原理就是利用 Python 的 libnmap 库调用 Nmap 扫描引擎对目标进行扫描。大家都知道 Nmap 这款工具,在端口扫描和服务发现上,该工具的确很赞,也是业内主推的安全渗透测试必备神器,但是 Nmap 有个最大的问题就是慢,当 IP 量上来后,全端口扫描太费时间,严重影响了扫描策略的执行,无法及时反馈端口状态信息,这就完全失去了监控的意义。后面经过调研,决定用 Masscan 替换 Nmap 扫描引擎,Masscan 号称最快的互联网端口扫描器,最快情况下可以在 6 分钟内扫遍互联网。能这么快完全是取决于其扫描方式,Masscan 的扫描并没进行完整的 TCP 三次握手,采用无状态扫描技术可以快速探测 IP 端口开放情况。另外它还支持自定义黑白名单,并可以根据自己情况设置扫描速率。关于 Masscan 的详细介绍可以看 Github
PortScan
我用 Python 给 Masscan 包了一层,主要是解决 Masscan 对 Nmap-style IP 支持不怎么友好的问题,一言不合就改造成了方便使用的扫描工具了,当然其实也可以自己动手改 Masscan 源码,优化下扫描引擎的参数,再自行编译即可。 可以很方便的使用 Masscan 对给定的目标 IP 做端口扫描。
替换上 Masscan 扫描引擎后,同样的 IP 量,全端口扫描的时间缩短到分钟级别(能透露的就这么多了-.-!),反正就是很快啦。当然这个快也带来了相应的代价,就是在准确率上会有一些折扣。
为了方便操作管理,为该扫描服务还开发了一套基于 Web 的系统 — PortScan,这里可以自定义扫描模板,并添加扫描任务,对每个扫描任务还可以设置定时任务,指定运行周期。
场景不单单适用于自己公司哦,比如我先定一个小目标,收集各大 SRC 厂商的 IP 列表,分别添加扫描任务并设置扫描周期,会有意想不到的效果。针对企业告警信息混乱,还添加了设置白名单功能,比如对一些已知的业务端口设置白名单,这样监控层面做到仅关注白名单外的情况,及时发现问题。
总结
在一些中小互联网公司(安全人员有限)开展端口扫描工作还是很有必要的,尽量把攻击面缩小到已知范围,当然这也不是说企业就绝对安全了,这只是能缓解一些脚本小子的扫描攻击,面对黑客,要时常保持警惕,说不定他就在内网盯着你…