带你读《Linux系统安全:纵深防御、安全扫描与入侵检测》之二:Linux网络防火墙-阿里云开发者社区

开发者社区> 华章出版社> 正文

带你读《Linux系统安全:纵深防御、安全扫描与入侵检测》之二:Linux网络防火墙

简介: 这是一部从技术原理、工程实践两个方面系统、深入讲解Linux系统安全的著作,从纵深防御、安全扫描、入侵检测3个维度细致讲解了如何构建一个如铜墙铁壁般的Linux防护体系。作者是资深的Linux系统安全专家、运维技术专家,有13年的从业经验,厚积薄发。本书得到了来自腾讯、阿里等知名企业的多位行业专家的高度评价。全书不仅包含大量工程实践案例,而且为各种核心知识点绘制了方便记忆的思维导图。

点击查看第一章
点击查看第三章

第2章 Linux网络防火墙

网络防火墙(Network Firewall)是一种网络安全系统,它监控并依据预定义的规则控制进入和外发的网络流量。
对于服务器系统来说,按照纵深防御的原则,使用网络防火墙进行防护是除了保障物理安全之外必须实施的控制措施。
在诸多相关信息安全规范和指南中也特别强调网络控制的实践。例如,在《ISO/IEC 27001:2005 信息安全管理体系规范与使用指南》的“A.10.6.1网络控制的控制措施”中指出,应确保网络充分的管理和控制,以防范威胁、保护使用网络的系统和应用维护安全,包括传输的信息。
本章将介绍网络防火墙的基本原理,并讲解利用iptables、Cisco防火墙、TCP Wrappers和DenyHosts构筑网络防护措施的技术。接下来介绍在公有云上实施网络安全控制的措施以及使用堡垒机进一步加强网络安全的实践。随后介绍分布式拒绝服务攻击(Distributed Denial of Service,DDoS)的防护措施。在本章的最后部分将介绍局域网中ARP欺骗攻击的模型和防御方案。

2.1 网络防火墙概述

在国际标准化组织(International Organization for Standardization,ISO)的开放系统互联参考模型(Open System Interconnection Reference Model)中,网络互联模型分为7层,如表2-1所示。

image.png

一般来说,网络防火墙工作在表2-1所示的第3层和第4层,它根据预定义规则中的上层协议或来源地址、目的地址、来源端口、目的端口来进行放行或者禁止的动作。
按照许可协议类型,网络防火墙可分为商业防火墙和开源防火墙两大类。

  • 大多数商业防火墙以硬件的形式提供给客户,其通过运行在专有硬件上的专有操作系统来实现网络控制。典型的商业防火墙产品有:

    • Cisco自适应安全设备(Adaptive Security Appliance,ASA)
    • Juniper安全业务网关(Secure Services Gateway,SSG)
    • 华为统一安全网关(Unified Security Gateway,USG)
  • 开源防火墙一般以开源软件的形式提供授权。典型的开源防火墙包括Linux iptables、FreeBSD IPFW和PF防火墙等。

值得一提的是,网络防火墙只是整个安全防护体系中的一部分,虽然其具有重要的、无可替代的作用,但是也有一定的局限性。

  • 不能防止自然或者人为的故意破坏。网络防火墙无法阻止对基础设施的物理损坏,不管这种损坏是由自然现象引起的还是人为原因所导致的。
  • 不能防止受病毒感染的文件的传输。受病毒感染的文件经常通过电子邮件、社交工具(例如,即时通信工具)、网站访问的形式传播,而这些途径都是基于正常的网络协议,因此网络防火墙是无能为力的。
  • 不能解决来自内部网络的攻击和安全问题。内部发起的网络攻击并未到达网络边界,因此网络防火墙也无法产生作用。
  • 不能防止策略配置不当或者配置错误引起的安全威胁。
  • 不能防止网络防火墙本身安全漏洞所带来的威胁。例如,在2017年下半年,某知名安全厂商的多个防火墙产品被曝存在未授权远程代码执行漏洞(CVE-2017-15944),该漏洞基于其他3个单独漏洞的综合利用,可以通过Web管理端对防火墙实现root身份的未授权远程代码执行攻击。

基于以上对网络防火墙的局限性分析,我们可以知道,在依赖网络防火墙提供的安全保障服务的基础上,也应该构建多层次、全面保障的纵深防御体系。

2.2 利用iptables构建网络防火墙

Linux系统提供了iptables用于构建网络防火墙,其能够实现包过滤、网络地址转换(Network Address Translation,NAT)等功能。为iptables提供这些功能的底层模块是netfilter框架(Netfilter项目的官方网站是https://www.netfilter.org )。Linux中的netfilter是内核中的一系列钩子(Hook),它为内核模块在网络栈中的不同位置注册回调函数(Callback Function)提供了支持。数据包在协议栈中依次经过这些在不同位置的回调函数的处理。

2.2.1 理解iptables表和链

netfilter钩子与iptables表和链的处理顺序如图2-1所示。

image.png

netfilter有5个钩子可以提供程序去注册。在数据包经过网络栈的时候,这些钩子上注册的内核模块依次被触发。这5个钩子的处理时间如下。

  • NF_IP_PRE_ROUTING:在数据流量进入网络栈后立即被触发,这个钩子上注册的模块在路由决策前即被执行,如图2-1中①所示的阶段。
  • NF_IP_LOCAL_IN:这个钩子在路由判断确定包是发送到本机时执行,如图2-1中②所示的阶段。
  • NF_IP_FORWARD:这个钩子在路由判断是需要转发给其他主机时执行,如图2-1中的③所示的阶段。
  • NF_IP_LOCAL_OUT:这个钩子在本机进程产生的网络被送到网络栈上时执行,如图2-1中④所示的阶段。
  • NF_IP_POST_ROUTING:这个钩子在数据包经过路由判断即将发送到网络前执行,如图2-1中⑤所示的阶段。

iptables中有以下5个链(Chain)。

  • PREROUTING:NF_IP_PRE_ROUTING钩子触发。
  • INPUT:NF_IP_LOCAL_IN钩子触发。
  • FORWARD:NF_IP_FORWARD钩子触发。
  • OUTPUT:NF_IP_LOCAL_OUT钩子触发。
  • POSTROUTING:NF_IP_POST_ROUTING钩子触发。

iptables中有5种表(Table):

  • filter表。iptables中使用最广泛的表,作用是进行过滤,也就是由filter表来决定一个数据包是否继续发往它的目的地址或者被拒绝丢弃。
  • nat表。顾名思义,nat表用于网络地址转换,可以改变数据包的源地址或者目的地址。
  • mangle表。用于修改IP的头部信息,如修改TTL(Time to Live)。
  • raw表。为iptables提供了一种不经过状态追踪的机制,在大流量对外业务的服务器上使用这个表可以避免状态追踪带来的性能问题。
  • security表。提供在数据包中加入SELinux特性的功能。在实际应用中,security一般不常用,因此在下面的章节中不再包含这一部分内容。

通过以上分析,我们知道netfilter仅仅有5个钩子,而iptables有5个链和5种表,由此可见在一个钩子上可能有多个表的不同链需要处理,如图2-1中的raw表、mangle表、filter表都有POSTROUTING链,这些不同表中的链根据自己向内核注册时的优先级(priority)依次处理。

2.2.2 实际生产中的iptables脚本编写

图2-1展示了netfilter钩子与iptables表和链的处理顺序,显示了其强大的处理功能。在实际生产中,使用比较多的是filter表,这个表用于对进入主机或者从主机发出的数据进行访问控制。在实践中,笔者建议使用iptables脚本来管理访问控制规则,而不是通过编辑和修改系统自带的/etc/sysconfig/iptables文件,这样做的好处是可以更加清晰地理解规则。
下面以代码清单2-1作为一个实际生产中的iptables脚本,讲解iptables的语法与使用的最佳实践。

image.png
image.png

2.2.3 使用iptables进行网络地址转换

在实践中,iptables还经常用于网络地址转换(NAT)的环境中。通过网络地址转换技术,可以有效减少直接部署公网IP地址的服务器数量,增强网络环境的安全性。
网络地址转换分为源地址转换和目的地址转换。

1. 源地址转换

源地址转换,主要用于无外网IP的服务器(Server B)需要主动向外发起连接访问互联网的场景下,如图2-2所示。

image.png

在图2-2中,Server B没有外网IP,如其需要访问互联网,则需要进行如下的设置:
1)在服务器Server B上,指定其网络的默认网关是10.128.70.112(即Server A的内网地址)。
2)在服务器Server A上,启用路由功能。启用的方法是执行以下命令。

sysctl -w net.ipv4.ip_forward=1

3)在Server A上,设置iptables规则如下。

iptables -t filter -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to x.y.z.173 #eth0是Server A的外网网卡,x.y.z.173是Server A的外网IP

经过以上3步骤设置后,Server B将会通过Server A访问互联网。此时,在互联网上看到的源地址是Server A的外网IP。
以Server B访问8.8.8.8的DNS服务为例,数据流程如下。
1)在Server B上,网络层数据包格式为:目的地址IP 8.8.8.8,源地址IP10.128.70.111。
2)在Server A上经过源地址转换后的网络层数据包格式为:目的地址IP 8.8.8.8,源地址IP x.y.z.173。该转换条目被记录在/proc/net/nf_conntrack中。
3)8.8.8.8的响应(源地址IP 8.8.8.8,目的地址IP x.y.z.173)到达Server A后,Server A改写网络层数据包为源地址IP 8.8.8.8,目的地址IP 10.128.70.111。
这就是源地址转换的工作过程。

image.png

2. 目的地址转换

目的地址转换用于外部用户直接访问无外网IP的服务器(Server B)提供的服务时,如图2-2所示。例如,外部用户希望通过互联网访问到Server B上的Oracle数据库(监听端口是TCP 1521)时,可以使用如下的命令在Server A上进行目的地址转换设置:

iptables -t nat -A PREROUTING -d x.y.z.173 -p tcp -m tcp --dport 1521 -j DNAT --to-destination 10.128.70.111:1521 #改写目的地址为10.128.70.111,目的端口为1521
iptables -t nat -A POSTROUTING -d 10.128.70.111 -p tcp -m tcp --dport 1521 -j SNAT --to-source 10.128.70.112 #改写源地址IP为Server A的内网IP,此时在Server B上相当于是与Server A在进行通信

网络地址转换是运维人员在工作中经常用到的技术,因此我们需要非常熟悉源地址转换和目的地址转换这两种方案。

2.2.4 禁用iptables的连接追踪

1. 分析连接追踪的原理

概要来说,连接追踪系统在一个内存数据结构中记录了连接的状态,这些信息包括源IP、目的IP、双方端口号(对TCP和UDP)、协议类型、状态和超时信息等。有了这些信息,我们可以设置更灵活的过滤策略。

image.png

我们看一个实际的例子(通过cat /proc/net/nf_conntrack命令可以查看当前连接追踪的表):

ipv4     2 tcp      6 62 SYN_SENT src=xxx.yyy.19.201 dst=87.240.131.117 sport=24943 dport=443 [UNREPLIED] src=87.240.131.117 dst=xxx.yyy.19.201 sport=443 dport=24943 mark=0 secmark=0 use=2 #该条目的意思是:系统收到了来自xxx.yyy.19.201:24943发送到87.240.131.117:443的第一个TCP SYN包,但此时对方还没有回复这个SYN包(UNREPLIED)
ipv4     2 tcp      6 30 SYN_RECV src=106.38.214.126 dst=xxx.yyy.19.202 sport=18102 dport=6400 src=xxx.yyy.19.202 dst=106.38.214.126 sport=6400 dport=18102 mark=0 secmark=0 use=2#该条目的意思是:系统收到了来自106.38.214.126:18102发送到xxx.yyy.19.202:6400的第一个TCP SYN包
ipv4     2 tcp      6 158007 ESTABLISHED src=xxx.yyy.19.201 dst=211.151.144.188 sport=48153 dport=80 src=211.151.144.188 dst=xxx.yyy.19.201 sport=80 dport=48153 [ASSURED] mark=0 secmark=0 use=2#该条目的意思是:xxx.yyy.19.201:48153<-->211.151.144.188:80之间的TCP连接是ESTABLISHED状态,这个连接是被保证的(ASSURED,不会因为内存耗尽而丢弃)

该表中的数据提供的状态信息可以使用iptables的state模块进行状态匹配,进而执行一定的过滤规则。目前iptables支持基于以下4种状态的过滤规则:INVALID、ESTABLISHED、NEW和RELATED。
启用连接追踪后,在某些情况下,在设置iptables时会变得比较简单。我们的服务器需要主动访问https://www.amazon.com提供的接口时,3次握手的示意图如图2-3所示。

image.png

在基于状态进行iptables设置时,使用如下的规则即可:

iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT # rule1
iptables -A OUTPUT -p tcp -j ACCEPT # rule2

工作流程如下:
1)第1个包①匹配到规则rule2,允许。
2)第2个包②因为在nf_conntrack表中有如下的规则匹配到rule1,允许。

ipv4     2 tcp      6 431995 ESTABLISHED src=172.30.16.1 dst=54.239.25.200 sport=50611 dport=443 src=54.239.25.200 dst=172.30.16.1 sport=443 dport=50611 [ASSURED] mark=0 secmark=0 use=2

3)第3个包③匹配到规则rule2,允许。

2. 禁用连接追踪的方法

通过2.2.4节的学习,我们知道在进行大量网络传输连接的时候,启用连接追踪可能导致网络丢包、无法新建连接、TCP重传等问题。因此,我们需要禁用连接追踪。
禁用连接追踪的方法有如下3个。
1)内核中禁用Netfilter connection tracking support。
编译内核时,依次进入Networking support→Networking options→Network packet filtering framework (Netfilter)→Core Netfilter Configuration,禁用的方法如图2-4所示(取消选中Netfilter connection tracking support)。

image.png

这样编译出来的内核将不支持连接追踪功能,也就是不会生成以下的ko文件。

kernel/net/netfilter/nf_conntrack.ko
kernel/net/netfilter/nf_conntrack_proto_dccp.ko
kernel/net/netfilter/nf_conntrack_proto_gre.ko
kernel/net/netfilter/nf_conntrack_proto_sctp.ko
kernel/net/netfilter/nf_conntrack_proto_udplite.ko
kernel/net/netfilter/nf_conntrack_netlink.ko
kernel/net/netfilter/nf_conntrack_amanda.ko
kernel/net/netfilter/nf_conntrack_ftp.ko
kernel/net/netfilter/nf_conntrack_h323.ko
kernel/net/netfilter/nf_conntrack_irc.ko
kernel/net/netfilter/nf_conntrack_broadcast.ko
kernel/net/netfilter/nf_conntrack_netbios_ns.ko
kernel/net/netfilter/nf_conntrack_snmp.ko
kernel/net/netfilter/nf_conntrack_pptp.ko
kernel/net/netfilter/nf_conntrack_sane.ko
kernel/net/netfilter/nf_conntrack_sip.ko
kernel/net/netfilter/nf_conntrack_tftp.ko
kernel/net/netfilter/xt_conntrack.ko
kernel/net/ipv4/netfilter/nf_conntrack_ipv4.ko
kernel/net/ipv6/netfilter/nf_conntrack_ipv6.ko

此时,在iptables中不能再使用网络地址转换功能,同时也不能再使用-m state模块。否则会产生以下的报错信息:

[root@localhost ~]# iptables -t nat -A POSTROUTING -o eth0 -s 172.30.4.0/24 -j SNAT --to 172.30.4.11
iptables v1.4.7: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
 [root@localhost ~]# iptables -I INPUT -p tcp -m state --state NEW -j ACCEPT
iptables: No chain/target/match by that name.

2)在iptables中,禁用-m state模块,同时在filter表的INPUT链中显式地指定ACCEPT。
以图2-3为例,在满足这样的访问需求时,我们使用的iptables必须修改为以下内容:

iptables -A INPUT -p tcp -s 54.239.25.200 --sport 443 -j ACCEPT # rule1
iptables -A OUTPUT -p tcp -j ACCEPT # rule2

同时,在/etc/init.d/iptables中修改如下的内容:

修改前:NF_MODULES_COMMON=(x_tables nf_nat nf_conntrack) # Used by netfilter v4 and v6
修改后:NF_MODULES_COMMON=(x_tables) # Used by netfilter v4 and v6

3)在iptables中,使用raw表,指定NOTRACK。

iptables -t raw -A PREROUTING -p tcp -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -j NOTRACK
iptables -A INPUT -p tcp -s 54.239.25.200 --sport 443 -j ACCEPT # rule1
iptables -A OUTPUT -p tcp -j ACCEPT # rule2

在以上的3种方法中,根据自己的业务情况,可以参考实施其中一种。

image.png

在配置了网络地址转换的服务器上,不能禁用连接追踪,但是此时可以使用如下的方法来提高连接追踪的条目上限。
在/etc/sysctl.conf中,新增如下的内容:

net.nf_conntrack_max = 524288
net.netfilter.nf_conntrack_max = 524288

新增配置文件/etc/modprobe.d/netfilter.conf,内容如下:

options nf_conntrack hashsize=131072

执行以下的命令使其生效:

/etc/init.d/iptables restart #重新加载连接追踪模块,同时更新nf_conntrack配置hashsize
sysctl -p #使得修改的sysctl.conf中nf_conntrack上限提高

在未指定时,系统nf_conntrack_max的值根据以下公式计算得出:

nf_conntrack_max = nf_conntrack_buckets * 4

在未指定时,系统nf_conntrack_buckets的值根据以下公式计算得出:

在系统内存大于等于4GB时,nf_conntrack_buckets = 65536
在系统内存小于4GB时,nf_conntrack_buckets = 内存大小 / 16384

在本案例中,我们使用options nf_conntrack hashsize=131072自主指定了Buckets的大小。
Buckets和连接追踪表的关系如图2-5所示。
设置Buckets合理的值(一般为预计的连接追踪表上限的1/4),可以使得连接追踪表的定位效率最高。

3. 确认禁用连接追踪的效果

我们在禁用了连接追踪后,可以使用如下两个方法来验证效果:
1)检查/var/log/messages内容不再出现table full的报错信息。
2)检查lsmod |grep nf_conntrack的输出,确认没有任何输出即可。
如果是在网络地址转换服务器上,则需要执行以下的命令来检查效果:

sysctl net.netfilter.nf_conntrack_max #确认该值是我们修改后的结果
sysctl net.netfilter.nf_conntrack_count #确认该值能够突破出问题时的最大追踪数

image.png

2.3 利用Cisco防火墙设置访问控制

在网络边界(Network Perimeter)上,笔者建议使用专用的商业硬件防火墙设备进行防护,这主要是基于其性能和可配置管理性的优势。另外,使用异构的网络防火墙设备,还可以为网络内系统和服务增加一层安全防护。本节以Cisco防火墙为例,介绍ACL(Access Control List,访问控制列表)的使用方法。
ACL使用包过滤技术,在路由器上读取IP层及第4层包头中的信息,如源地址、目的地址、源端口、目的端口等,根据预先定义好的规则对包进行过滤,从而达到访问控制的目的。
Cisco IOS的访问控制列表ACL分为两种,根据不同场合应用不同种类的ACL:
1)标准访问控制列表。它通过使用IP包中的源IP地址进行过滤,使用访问控制列表号1到99来创建相应的ACL。
2)扩展访问控制列表。它可以依据第4层的信息进行过滤,相对于标准访问控制列表,可以进行更细粒度的控制。
我们使用扩展访问控制列表来保护Cisco路由器后面的主机。使用的命令如下:

Router# configure terminal
Router(config)#ip access-list extended SDACL #定义扩展ACL,名称是SDACL
Router(config-ext-nacl)#permit icmp any any
Router(config-ext-nacl)#permit tcp any host x.y.16.134 eq 80
Router(config-ext-nacl)#permit udp host 202.96.209.5 eq 53 host x.y.16.134
Router(config-ext-nacl)#permit tcp host 202.96.209.5 eq 53 host x.y.16.134
Router(config-ext-nacl)#permit udp host 114.114.114.114 eq 53 host x.y.16.134
Router(config-ext-nacl)#permit tcp host 114.114.114.114 eq 53 host x.y.16.134
Router(config-ext-nacl)#permit tcp host 61.172.240.227 host x.y.16.134 eq 22
Router(config-ext-nacl)#permit tcp host 61.172.240.228 host x.y.16.134 eq 22
Router(config-ext-nacl)#permit tcp host 61.172.240.229 host x.y.16.134 eq 22
Router(config-ext-nacl)#deny ip any any #默认禁止所有
Router(config-ext-nacl)#exit
Router(config)#int g0/1
Router(config-if)#ip access-group SDACL out #把ACL绑定到g0/1的出方向
Router(config-if)#exit
Router(config)#exit

image.png

2.4 利用TCP Wrappers构建应用访问控制列表

TCP Wrappers也被称为tcp_wrappers。它是一个基于主机的网络访问控制列表系统,在Linux和BSD等系统上都有支持。最初的代码是由Wietse Venema在1990年编写的,在2001年,以类BSD的许可发布。TCP Wrappers的核心是名为libwrap的库,所有调用这个库的程序都可以利用libwrap提供的网络访问控制能力。
在Linux系统中,我们可以使用ldd命令来判断一个程序是否调用了libwrap的库,示例如代码清单2-2所示。

image.png

在代码清单2-2中,我们可以看到,OpenSSH的服务器端程序/usr/bin/sshd调用了libwrap。那么我们就可以使用TCP Wrappers来控制允许哪些主机或者禁止哪些主机访问sshd。
远程IP请求连接的时候,TCP Wrappers检查策略是先看/etc/hosts.allow中是否允许,如果允许就直接放行;如果没有,则再看/etc/hosts.deny中是否禁止,如果禁止,那么就禁止连接;否则允许连接。
我们可以使用如下的配置来仅仅允许指定的IP 104.224.147.43访问sshd。
配置/etc/hosts.allow来限制sshd的访问。

sshd:104.224.147.43:allow
sshd:ALL:deny #明确禁止不在白名单内的IP访问

/etc/hosts.allow的配置语法如下:

服务名:来源IP/网段(多个IP/网段以英文逗号,分隔):动作(允许 => allow,禁止 => deny)

使用TCP Wrappers时,不需要重新启动程序,修改/etc/hosts.allow和/etc/hosts.deny并保存后,对于所有新建立的TCP连接立即生效;对于已建立的连接则没有作用,此时需要手动把网络连接断掉,例如使用iptables或者使用kill命令终止对应的进程来强制远程重新建立连接。

2.5 利用DenyHosts防止暴力破解

在2.2节和2.4节我们介绍了使用iptables和TCP Wrappers来进行访问控制的方案。以上的措施,全部基于白名单机制,对于没有固定来源IP地址但又需要进行防护的场景来说,使用DenyHosts来防止暴力破解是一种非常有效的措施。
DenyHosts由Phil Schwartz编写,其官方网站是http://denyhosts.sourceforge.net
DenyHosts是使用Python开发的,它通过监控系统安全日志(例如,/var/log/secure)来分析是否存在对OpenSSH的暴力破解行为。如发现暴力破解,则其从该系统安全日志中分析出来源IP地址,然后通过在/etc/hosts.deny中加入相应的条目来使用TCP Wrappers禁止该IP地址的后续连接尝试。
DenyHosts的安装和启动脚本如代码清单2-3所示。

image.png

下面我们来看看DenyHosts的几个核心配置片段(文件/usr/share/denyhosts/denyhosts.cfg)。

  • SECURE_LOG:指定系统安全日志的位置,在CentOS和Redhat系统中设为/var/log/secure。
  • HOSTS_DENY:检测到暴力破解后,指定在哪个文件中添加相应的恶意IP并禁止,在CentOS和Redhat系统中设为/etc/hosts.deny。
  • BLOCK_SERVICE:检测到暴力破解后,指定封停来源IP访问哪些服务,可以指定sshd或者ALL(即封停来源IP访问任何使用了libwrap的服务程序)。
  • DENY_THRESHOLD_INVALID:对于在/etc/passwd不存在的用户名的暴力尝试,指定发现多少次以后封停,这个值使用默认的5即可。
  • DENY_THRESHOLD_VALID:对于在/etc/passwd存在的用户名(除root外)的暴力尝试,指定发现多少次以后封停。建议适当调大这个值(如设置为20),以避免合法用户自己输错密码导致的无法继续登录。
  • DENY_THRESHOLD_ROOT:对于root账户的暴力尝试,指定发现多少次以后封停。建议适当调大这个值(如设置为10),以避免合法root用户自己输错密码导致的无法继续登录。
  • HOSTNAME_LOOKUP:指定是否启用来源IP到完整域名(Fully Qualified Domain Name,FQDN)的解析,建议设置为NO,以节省服务器尝试反向解析的开销。

在安装和启动了DenyHosts以后,我们可以通过/etc/hosts.deny来查看效果。一般情况下,在较短的时间内就可以发现其已经封停了大量的暴力破解尝试。由此,也可以看出,互联网上时时刻刻存在着风险,总有一些不怀好意的人利用工具来发现可能的“猎物”。
以下是实际生产中抓到的一些恶意IP地址来源,我们可以看到,DenyHosts在记录该IP地址的同时记录了其添加到系统访问控制列表的时间:

# DenyHosts: Thu Dec  6 14:44:33 2018 | sshd: 177.114.90.32
sshd: 177.114.90.32
# DenyHosts: Thu Dec  6 14:44:33 2018 | sshd: 171.11.231.58
sshd: 171.11.231.58
# DenyHosts: Thu Dec  6 14:44:33 2018 | sshd: 193.112.128.197
sshd: 193.112.128.197

2.6 在公有云上实施网络安全防护

随着云计算的兴起和公有云资源性价比的提高,大量的企业正在计划或已经把业务从自有互联网数据中心(Internet Data Center,IDC)迁移到公有云上。
在国内,知名的公有云厂商举例如下:

在国外,知名的公有云厂商举例如下:

在企业IT基础设施迁移到公有云的过程中,可以通过良好的架构设计和运维实践来进行网络安全防护。

2.6.1 减少公网暴露的云服务器数量

通过合理规划架构来减少公网暴露的云服务器数量是减小攻击面和提高系统安全级别的重要手段。笔者建议在规划架构时可以考虑使用公有云上提供的弹性负载均衡(Elastic Load Balance)和NAT网关(NAT Gateway)来实现这一目的。

  • 弹性负载均衡将访问流量自动分发到多台云服务器,从而扩展应用系统对外的整体服务能力,实现更高水平的应用容错。弹性负载均衡除了实现业务分流、负载均衡功能之外,也极大地减少了云服务器对公网IP的需求(减少成本支出),还减少了对外暴露的攻击面(增加安全性)。
  • NAT网关能够为虚拟专有网络(Virtual Private Cloud,VPC)内的弹性云服务器提供源网络地址转换(SNAT)功能。通过灵活简易的配置,即可轻松构建虚拟专有网络的公网出口。NAT网关为虚拟专有网络内云服务器提供主动连接到互联网的服务。

如图2-6所示是某物流电子商务公司的混合云网络架构设计图。

image.png

在图2-6中,我们使用公有云上的VPN Gateway来把本地机房和公有云VPC以内网的形式连接起来,同时在公有云上使用弹性负载均衡、NAT网关来减少云服务器的公网暴露。

2.6.2 使用网络安全组防护

网络安全组(Network Security Group)是一种虚拟防火墙,其具备包过滤功能,用于设置单台或多台云服务器的网络访问控制。它是重要的网络安全隔离手段,用于在公有云上划分安全边界。当服务器迁移到公有云上以后,我们可以借助公有云提供的网络安全组进行防护。以阿里云为例,其配置网络安全组规则的界面如图2-7所示。
各大型公有云厂商提供的网络安全组配置界面大同小异,而且提供了详细的配置说明文档,因此这里不再赘述。
需要说明的是,公有云提供的网络安全组应该仅作为一种附加的安全措施,而不应该作为替代iptables和TCP Wrappers的手段,仅仅依靠网络安全组提供的防护是不够的。

image.png

2.7 使用堡垒机增加系统访问的安全性

堡垒机(Bastion Host)也被称为跳板机,是网络环境中一台特殊的服务器,它提供其他所有服务器的访问控制入口,也就是通过这台服务器来访问和管理其他所有服务器。
使用堡垒机的简化版网络架构图如图2-8所示。
与管理员直接从本机发起网络连接来管理所有服务器相比,使用一台或者多台分布式堡垒机可以提供更多的安全性。

  • 统一登录来源。被管理服务器上仅仅开放更有限的访问来源IP地址。在管理员直接从本机发起网络连接来管理服务器的情况下,往往因为管理员来源IP地址是动态IP地址或者需要从多个场所访问而导致需要在所有被管理服务器上添加较多的白名单来源IP地址。在这些IP地址失效或者被多人共用的情况下,将成为严重的攻击面。在堡垒机模式下,所有被管理服务器上仅仅需要开放信任这些有限个堡垒机的出口IP地址,从而有效地减少了攻击面。
  • 操作可审计。因为管理员从堡垒机上进行服务器的管理,所以其所有操作都可以被记录下来,而不用再依赖每台服务器上记录的操作日志。在每台服务器上非集中式管理操作日志的问题是,在发生了入侵事件后,黑客可以比较容易地删除独立服务器上的操作日志而导致无法追溯。采用堡垒机后,操作日志记录在堡垒机上,黑客无法删除这些操作审计日志。
  • 可设置灵活的访问控制。比如:

    • 在堡垒机上设置在某些时间段内不允许访问和管理被控制服务器,也是增加安全性的一个重要手段。
    • 可以通过在堡垒机上设置可执行命令的范围(黑名单和白名单)来进一步提高安全性。
  • 便于用户授权。通过在堡垒机上集中管理服务器的实际登录账号,可以避免把服务器的账号信息分散地交接给不同的维护人员,从而可以在一定程度上避免服务器登录信息的泄露和被恶意利用。

image.png

2.7.1 开源堡垒机简介

1. Jumpserver

Jumpserver是一款优秀的开源堡垒机软件,其官方网站是http://www.jumpserver.org。Jumpserver 提供的功能如表2-2所示。

image.png
image.png

2. 麒麟堡垒机

麒麟堡垒机是一款易部署、易使用、功能全面的堡垒机产品,其官方网站是http://www.tosec.com.cn。麒麟堡垒机提供开源版本和收费版本,这两个版本的特性对比如表2-3所示。

image.png

2.7.2 商业堡垒机简介

1. 齐治堡垒机

齐治堡垒机的官方网站是https://www.shterm.com 。作为一款成熟的商业堡垒机产品,其解决的问题如下。

  • 自动化操作:这是有效提高运维效率的关键,可以让堡垒机自动帮助运维人员执行大量、重复的常规操作,提高运维效率。
  • 操作审计:解决操作事故责任认定的问题,确保事故发生后,能快速定位操作者和事故原因,还原事故现场和举证。
  • 访问控制:解决操作者合法访问操作资源的问题,通过对访问资源的严格控制,确保操作者在其账号有效权限和期限内合法访问操作资源,降低操作风险。
  • 身份管理:解决操作者身份唯一的问题,身份唯一性的确定是操作行为管理的基础,将确保操作管理的各项内容有源可溯。
  • 集中管理:解决操作分散、无序的问题,管理的模式决定了管理的有效性,对操作进行集中统一的管理,是解决运维操作管理诸多问题的前提与基础。

2. 帕拉迪统一安全管理和综合审计系统

帕拉迪统一安全管理和综合审计系统通过统一运维入口、统一身份认证、统一资源管理、统一权限管理和统一过程审计等一系列手段,将制度落于实处;通过技术手段硬性规范了运维操作的流程,控制人为风险,提高IT系统整体可用性。帕拉迪统一安全管理和综合审计系统的官方网站是http://www.pldsec.com

3. 华为UMA运维审计系统

华为UMA(Unified Maintenance and Audit)运维审计系统是专为运营商、政府、金融、电力、大企业及上市公司而设计的,能够为组织构建一个统一的IT核心资源运维管理与安全审计的平台。通过对核心业务系统、操作系统、数据库、网络设备等各种IT资源的账号、认证、授权和审计的集中管理和控制,实现运维集中接入、集中认证、集中授权、集中审计功能,满足用户IT运维管理和IT内控外审的需求。华为UMA运维审计系统产品介绍地址是http://enterprise.huawei.com/cn/products/security/security-management/security-management-system/hw-143174.htm

2.8 分布式拒绝服务攻击的防护措施

分布式拒绝服务(Distributed Denial of Service,DDoS)攻击是指借助于客户端/服务器技术,将多个计算机(特别是僵尸网络的“肉鸡”,指被黑客入侵后控制的网络服务器或者个人计算机)联合起来作为攻击平台,对一个或多个目标发动拒绝服务攻击,从而成倍地提高拒绝服务攻击的威力。
仅仅从我国国内来看,僵尸网络的规模已十分惊人。中国国家计算机网络应急技术处理协调中心在2018年4月发布的《2017年我国互联网网络安全态势综述》中指出:“据CNCERT抽样监测,2017年我国境内感染计算机恶意程序的主机数量约1256万台。从所控制我国境内主机数量来看,位于美国、中国台湾和中国香港的控制服务器控制规模分列前三位,分别控制了我国境内约323万、42万和30万台主机。”如此数量庞大的僵尸网络,为黑客实施分布式拒绝服务攻击提供了充足的“武器弹药”。

2.8.1 直接式分布式拒绝服务攻击

直接式分布式拒绝服务攻击是一种典型的分布式拒绝服务攻击,其逻辑图如图2-9所示。

image.png

黑客通过控制机,向被其控制的“肉鸡”(被入侵后的服务器、个人计算机等)发出指令,通过木马程序发起流量,引导到被攻击服务器。被攻击服务器受限于带宽和CPU处理能力,导致业务中断而无法向正常用户提供服务,造成直接的经济损失。在这种攻击模式下,攻击的能力取决于黑客可以控制的“肉鸡”的数量及“肉鸡”提供的网络带宽容量。

2.8.2 反射式分布式拒绝服务攻击

反射式分布式拒绝服务攻击是另外一种典型的分布式拒绝服务攻击模式,如图2-10所示。

image.png

在这种模式情况下,“肉鸡”服务器通过构造虚假DNS请求(UDP数据以被攻击服务器作为来源IP地址)向全球数量巨大的开放DNS服务器发起请求,开放DNS服务器产生响应后发送到被攻击服务器。
在这种攻击模式下,攻击行为充分利用了DNS请求响应的非对称特点,也就是,请求数据流量小,响应数据流量大。在一个典型的DNS放大攻击(DNS Amplification Attack)或者NTP放大攻击(NTP Amplification Attack)中,响应数据和请求数据的数据量对比可以达到20:1甚至200:1,放大效果非常明显。同时UDP不需要实际建立连接,对源地址没有任何形式的校验,因此可以把“肉鸡”伪装成被攻击服务器发起UDP请求。
在目前的情况下,我们发现分布式拒绝服务以UDP协议为多,同时利用类似DNS反射、NTP反射或者Memcached反射的漏洞进行攻击。例如,据The Hack News网站报道,全球知名代码托管商GitHub在2018年2月28日遭受的分布式拒绝服务攻击规模达到惊人的1.3 Tbps,其中大部分流量正是来自于利用Memcached反射漏洞进行的攻击。

2.8.3 防御的思路

对于分布式拒绝服务攻击,我们应如何防御呢?
在遭受小流量分布式拒绝服务攻击时,可以通过上层设备过滤非法的UDP数据进行清洗。
在遭受大流量分布式拒绝服务攻击时,目前比较好的方案是与电信运营商合作,在源头上或者运营商互联的接口上进行清洗。中国人民银行2012年5月发布的《网上银行系统信息安全通用规范》(标准编号:JR/T 0068-2012)中也指出:“应防范对网上银行服务器端的DoS/DDoS攻击。可参考的加固措施包括但不限于:与电信运营商签署DoS/DDoS防护协议。”有兴趣的读者可以参考云堤的方案。云堤是中国电信推出的运营商级DDoS防护方案,使用灵活、高效。云堤官方网站是http://www.damddos.com

2.9 局域网中ARP欺骗的防御

在局域网中,ARP(Address Resolution Protocol,地址解析协议)欺骗是需要特别注意的一种攻击模式,笔者在工作中曾多次遇到这种攻击。ARP欺骗攻击的模型如图2-11所示。

image.png

在图2-11中,被欺骗对象(IP地址为192.168.1.2,真实MAC地址为fa:38:4e:c0:fb:02)发送“①ARP请求(广播):IP地址为192.168.1.1的MAC地址是多少?”,该广播包被发送给同局域网内的所有服务器。攻击者(IP地址为192.168.1.3,真实MAC地址为fa:38:4e:c0:fb:03)抢先回复“②欺骗的ARP响应(单播):IP地址为192.168.1.1的MAC地址是fa:38:4e:c0:fb:03”。此时,被欺骗对象的ARP表中会增加一条IP和MAC地址的映射:192.168.1.1映射到fa:38:4e:c0:fb:03。被欺骗对象主动发到局域网外的任何数据都会被攻击者截获嗅探甚至修改。
防御ARP欺骗攻击的方式一般分为以下两种。

  • 使用静态MAC地址绑定。例如,在图2-11中,在被欺骗对象上使用命令行执行以下语句即可:
arp -s 192.168.1.1 fa:38:4e:c0:fb:01
  • 使用Linux下的arptables。例如,在图2-11中,在被欺骗对象上使用命令行执行以下语句即可:
arptables -A INPUT -i eth0 --src-ip 192.168.1.11 --src-mac ! fa:38:4e:c0:fb:01 -j DROP

2.10 本章小结

网络防火墙是构建服务器系统安全纵深防御体系中不可或缺的一个组成部分。本章详细介绍了使用Linux iptables、Cisco防火墙、TCP Wrappers构建防火墙系统的方法,也介绍了使用DenyHosts阻止来自互联网的暴力破解的实践,然后介绍了在公有云上使用网络安全组保障安全的方案。作为规范化服务器远程网络管理的关键工具,堡垒机发挥了重要作用。本章还简要介绍了开源堡垒机和商业堡垒机的各自特点。随后讲解了分布式拒绝服务攻击的原理和防御方法。作为结束部分,笔者介绍了一种专门针对局域网主机的欺骗攻击—ARP欺骗攻击,并讲解了对于这种攻击模型和防御方法。

推荐阅读材料

本章重点内容助记图

本章涉及的内容较多,因此,笔者特编制了图2-12以帮助读者理解和记忆重点内容。

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接