网络边界是企业区分外部互联网和内部网络(包括办公网和生产网等)的位置,也是构建企业网络安全防线的位置,通常会部署防火墙等网关类设备。
网络边界根据其所处位置不同、类型不同以及防护对象不同,可以大致分为以下两类:第一类,企业对外提供业务时的内外网边界,例如互联网用户访问企业门户网站的场景;第二类,企业员工接入内网时的内外网边界,例如系统运维人员通过虚拟专用网络(Virtual Private Network,VPN)接入运维网段的场景。
下面针对这两种不同类型的网络边界,介绍如何构建网络白环境。
1.南北向入向攻击防护
在本节中,我们首先讨论第一种场景,也是企业在构建防御体系时最常见的场景,即针对自身对外业务的防护。
通常,企业除了通过官方网站进行品牌介绍和宣传以外,还会提供多种其他类型的服务,例如内容查询、客户服务、手机应用、服务接口等。无论网站还是其他类型的业务系统,如果直接暴露在互联网上的话,会受到各式各样的攻击,因此需要防火墙、WAF这种网关类设备进行防护。它们通常会起到以下几个关键作用,这也是需要我们特别关注的。
第一,阻断从外到内的直接访问。这就像古代城池周边所建的城墙一样,把城外的蛮荒之地和城内的繁华都市做了隔离。所有从外到内的访问无法直接完成,都需要通过网关类设备进行接收和转发,从而大大减少了内部资产直接受到外部攻击的可能性。
第二,减少互联网的暴露面。同样和古代城池一样,虽然通过城墙把内外做了隔离,但仍然需要通过城门进出城池,只不过虽然城内气象万千,但从城外看只有城墙和城门。通过网关类设备,可以严格控制直接暴露在外的内部资源,例如从互联网只能访问企业官方网站,即一个IP地址加443端口(默认端口号)。毫无疑问,互联网暴露面越少,防守难度就越低,防守效果就越好,这就是现在很多企业在做互联网暴露面收敛的主要原因,只不过这个工作远比边界防火墙上的工作要复杂和困难。
第三,对出入双向流量进行检测。由于边界防火墙处于网关位置,负责流量转发,因此可以用来识别和阻断潜在的风险与攻击行为,就像城门口的士兵一样,负责检查出入城的行人和行李。
针对入向流量,可以利用防火墙,基于五元组信息,对流量进行检测和阻断;利用入侵防御系统,基于样本和特征,对流量进行检测;利用WAF,基于规则或算法,对HTTP/HTTPS流量进行攻击行为检测和阻断;利用应用程序接口(Application Program Interface,API)网关,对API请求进行安全检测。
从白环境的理念出发,如果可以明确访问者的IP地址或者地址段,则可以在防火墙上配置白名单策略,限制只有特定的地址才能访问,这种安全防护效果是最好的。但在更多场景下,边界防火墙还是通过黑名单机制,配合威胁情报信息来进行封堵。虽然有时很难基于源地址实施白名单策略,但是针对企业面向互联网开放的目的地址和目的端口,还是可以很容易地实现白名单机制的。如图2-1所示,我们可以针对入向流量,规定只允许HTTP/HTTPS流量,其他流量都会被拒绝,这就是一个典型的白名单机制。
图2-1 边界防火墙入向流量
2.南北向出向异常检测
讨论完入向流量后,再来看主动发起的出向流量。在生产环境中,由于能够清晰地梳理出所有场景和需求,因此可以考虑完全基于白名单机制对出向流量进行严格管控。如图2-2所示,规定任何从DMZ到互联网主动发起的出向流量都被拒绝。通过这种方式可以有效地发现和阻断异常的外连行为,例如DNS Tunnel、反连到C2服务器、到FTP网站下载恶意软件等。
图2-2 边界防火墙出向流量
企业在生产环境中如果有时间同步的需求,可以考虑自己建立一个内部使用的网络时间协议(Network Time Protocol,NTP)服务器;如果有软件更新的需求,同样可以考虑自己建立一个内部的软件源(YUM)服务器;如果有其他业务层面的连接需求,可以考虑配置点到点的连接白名单。通过这些方式可以有效地减少从内到外的出向连接,大幅降低安全隐患。
在本节中,我们继续讨论第二种场景,也是企业的另外一个通用需求,就是员工远程接入企业内网的场景,或者运维人员远程接入生产环境的场景。
现在,随着数据中心、云化、虚拟化的蓬勃发展,企业应用系统的运维人员已经不需要到机房进行现场维护了,几乎所有工作都可以通过远程完成。尤其是2019年底暴发的疫情,使得远程运维、远程办公、远程管理从可选项变成了必选项。
最早员工可以通过VPN和企业之间建立一个加密隧道,从而实现远程接入企业内网的目的。但随着零信任概念的提出,软件定义边界和安全访问边缘逐步替代了VPN,为企业提供了更为安全的接入方式。
零信任(Zero Trust,ZT)是Forrester首席分析师John Kindervag在2010年率先提出的,其理念是“永不信任,持续验证”,这也完全符合安全的发展趋势。在零信任之后,出现了软件定义边界(Software Defined Perimeter,SDP),它是国际云安全联盟(Cloud Security Alliance,CSA)在2013年提出的,是基于零信任理念的新一代网络安全模型。安全访问服务边缘(Secure Access Service Edge,SASE)则是Gartner分析师Neil MacDonald在2019年提出的,相比SDP,它更为全面地满足了企业员工远程办公的安全需求。零信任、软件定义边界、安全访问服务边缘虽然由三个不同组织在不同时间提出,但它们所解决的都是员工远程接入企业内网时所面临的安全问题。
由于本书以白环境的理念为主,零信任、软件定义边界、安全访问服务边缘并非本书重点,因此不做过多介绍,有兴趣的读者可以通过其他方式了解。但软件定义边界中有一个技术还是值得我们参考和学习的,就是端口隐藏,它可以把互联网暴露面降到最小,甚至完全不暴露端口,实现攻击面为零。
在传统方式中,例如VPN,企业需要先在互联网上有接入点,才能让内部用户使用,但由于直接暴露在互联网上,企业内部员工和攻击者都能看到,因此存在诸如漏洞利用等安全风险。而端口隐藏可以实现只有合法用户才能看到这些服务接入点,攻击者是看不到的,常用的检测工具也看不到,某种意义上讲,端口隐藏技术也是白环境理念的一种实践。那么,这是如何做到的呢?下面举例介绍和端口隐藏相关的两种实现方式:端口敲门(Port Knocking)和单包授权(Single Package Authorization,SPA)。
1.端口敲门
实现端口隐藏的第一种方式是端口敲门,它可以通过knockd来实现。knockd是一个在Linux系统上的端口敲门服务器。它监听特定网卡上的所有流量,并且匹配特定的敲门顺序。客户端(knock)则按照既定顺序向knockd服务器发送端口敲门。当服务器检测到期望的敲门顺序时,就会执行预先定义好的命令或者脚本,通常会利用iptables来向特定地址打开特定端口。下面以一个隐藏SSH服务的案例来介绍端口敲门的实现过程。
首先,在需要隐藏SSH端口的服务器(通常是用于接入企业内网的跳板服务器)上安装knockd,如下所示。
在安装完knockd之后,需要修改它的两个配置文件。第一个是/etc/knockd.conf,其中,[openSSH]下的参数sequence指的就是端口敲门的顺序,7000、8000、9000是默认的顺序,在正式生产环境中,这个默认值需要做修改;当符合顺序时,服务器端的knockd就会运行一条参数command所设定的命令,在这里是执行iptables,主要用途是把敲门顺序正确的源地址以白名单的方式添加到允许访问列表中。[closeSSH]中的参数和[openSSH]中的参数正好相反,在这里就不再详细阐述了,如下所示。
第二个需要修改的配置文件是/etc/default/knockd。其中,参数START_KNOCKD需要配置为1,KNOCKD_OPTS需要配置为监听的网卡,在这个例子中,其值为-i enp0s3,如下所示。
在修改完两个配置文件后,就可以启动knockd服务了,如下所示。
还有一步,就是要通过iptables配置隐藏SSH服务。具体做法是设置INPUT链的默认策略为DROP,这会拒绝所有入向的网络连接,目的是隐藏所有开放的服务和端口。如下所示,其中参数-P代表需要配置的默认策略,在这里是DROP。
以上是SSH服务器侧的所有工作。在装有SSH客户端的主机上,同样先安装knockd,然后尝试连接SSH服务器,由于默认策略为DROP,因此连接失败。如图2-3所示,在通过knock尝试按照顺序做端口敲门(TCP端口7000、8000、9000)后,客户端再次尝试连接并连接成功了,代码如下所示。
图2-3 knockd工作原理
为了验证在SSH服务器上knockd所执行的命令,我们通过iptables可以看到已经添加了一条允许SSH连接的规则,这条规则也是在敲门成功后动态添加的,如下所示。
这种端口敲门技术不仅可以应用在对SSH服务的保护上,针对其他业务系统也可以起到保护作用,只不过需要一些额外的开发工作。
以一个企业自身使用的We b应用系统为例,我们可以开发一个适配浏览器的插件,这个插件的作用相当于knockd客户端,它首先和knockd服务器之间建立信任关系,打通连接通路。在建立信任关系后,浏览器可以通过knockd服务器访问后台的Web应用,knockd服务器还起到了HTTP/HTTPS代理服务器的作用,如图2-4所示。
图2-4 knockd防护Web应用
2.单包授权
实现端口隐藏的第二种方式是单包授权,它可以通过fwknop来实现。fwknop是FireWall KNock OPerator的缩写,可以理解为下一代的端口敲门。fwknop在实现方式上和knockd有些相似,都是利用iptables设置策略,先禁止网络连接,然后打开端口等。与knockd不同的是,fwknop只需一个加密包就可以传递所有需要的信息,完成所有授权和打开端口的工作,速度更快。下面介绍fwknop的安装、配置和使用,以方便大家更好地了解单包授权是如何工作的。
首先,在需要隐藏SSH端口的目标服务器(fwknops)上安装fwknop-server以及必需的软件包libpcap-dev,如下所示。
在装有SSH客户端的主机(fwknopc)上安装fwknop-client,如下所示。
在软件安装完毕后,首先在fwknopc上生成用于授权的密钥。其中,参数--access代表要访问的目标协议和端口,--allow-ip代表允许访问fwknops的源地址,--destination代表目标服务器fwknops的地址,--key-gen代表生成可以用于加密SPA数据包的Rijndael和HMAC密钥。
在fwknops上,修改fwknop的配置文件access.conf,把在fwknopc上生成的两个密钥复制到文件末尾。
在fwknops上,同样设置一个iptables默认为DROP的策略,这样可以拒绝所有的入向连接。
在fwknops上,启动fwknopd进程。其中,参数--interface代表监控的网卡,--foreground代表在前台运行进程,如下所示。
在fwknopc上,向fwknops发送SPA包,如下所示。
在fwknops上,可以看到有两行信息添加到了最后,同时有一个iptables规则被创建出来。至此,从fwknopc上可以通过SSH远程连接到服务器fwknops。
无论是端口敲门还是单包授权,所解决的都是对接入终端的验证工作,尤其是单包授权,必须是那些提前加入服务器白名单的客户端才能通过授权接入企业内网。通过这种方式,也可以构建一个远程接入企业内网的白环境。