在本系列文章的第一,二部分(我谈网络扫描 -- 之一,之二),我们站在安全从业者的角度,讨论了网络扫描基础,各种端口和漏洞扫描技术及使用经验。接下来,我们讨论如何应对恶意网络扫描。
 
五. 如何应对网络扫描
      现在,互联网上免费的扫描软件,太多了,随便 google 一下,就可以找到一大推;而且,现在的扫描软件,越来越简单易用,从而使得一些没有什么网络和系统技术的 badegg 们(传说中的“脚本小子”),也可以用得得心应手;另外,现在的扫描软件,越来越智能,越来越会逃避 IDS/IPS 的检测和防护。这一方面方便了安全从业者的工作,提高了我们的工作效率,另一方面也给那些专门想搞破坏的 badegg 们大开了方便之门,增加了安全从业者的负担。我们不得不承认,网络扫描工具的这些特点,确实增加了我们工作的难度,但是,那并不意味着我们在面对网络扫描的时候,就应该束手无策,不知所措,坐以待毙了。相反,我们应该使用各种针对端口和漏洞扫描的检测和防护措施,来积极地跟恶意的网络扫描做斗争,限制他们的扫描范围减少他们通过扫描能获得的信息,从而更好地保护我们的网络安全。
 
1. 检测网络扫描
    要有效地检测网络扫描,需要先弄清楚几个问题:
       × 希望检测外网扫描还是内网扫描?
            检测的目的决定了我们到底该进行哪种检测。如果我们想检测来自公网的恶意扫描,并进行及时封堵,或者检查我们的网络防火墙配置是否正确,  那么应该选择检测外网扫描;如果我们对自己内网的安全不太确信,比如曾经被侵入过,想检测出是否有恶意程序存在,那么可以选择检测内网扫描。
       × 扫描检测系统应该部署在哪个位置?
            如果想检测外网扫描,那么建议将扫描检测软件(一般就是***检测/防护系统)部署在公网防火墙后面,因为公网上未经防火墙过滤的恶意扫描实在太多,各种告警信息会把我们弄崩溃,一旦经过防火墙过滤了,能够到达扫描检测软件的恶意扫描就会明显少很多,这样方便我们的工作,而且,也只有经过防火墙过滤后的恶意扫描,才是我们所关心的;如果想检测内网扫描,那么把扫描检测软件部署到内网的任何位置都可以,只要能够接收到内网的所有网络数据包就可以了(当然需要我们的精心配制)。
       × 怎样让网络数据包发送到扫描检测系统?
            通常情况下,不管是检测外网扫描还是内网扫描,都极有可能涉及到端口数据流镜像/复制技术,就是把从同一个交换机的其他某些端口进出的数据包,复制到扫描检测系统所连接的交换机端口上来(这种同一个交换机上的端口数据流镜像/复制,就 cisco 交换机来说,被称之为 SPAN);或者是把进出其它交换机的某些端口的数据包,复制到扫描检测系统所连接的交换机端口上来(这种不同交换机上的端口数据流镜像/复制,就 cisco 交换机来说,被称之为 RSPAN)。
  
        我在这里不详述 SPAN 和 RSPAN 了,只各举一个例子:
          SPAN 例子:
               !指定复制哪些端口的流量
               SwitchA(config)# monitor session 1 source int g0/10 rx   
               !指定把流量复制到哪个端口  
               SwitchA(config)# monitor session 1 dest   int g0/24       
          RSPAN 例子:
              ! 定义 RPSN VLAN,必须保证该 VLAN 定义能够
              ! 被传输到交换机 SwitchB 上去
               SwitchA(config)# vlan 1000
               SwitchA(config-vlan)# remote vlan
               SwitchA(config-vlan)# end
               !指定复制交换机 SwitchA 上的哪些端口的流量 
               SwitchA(config)# monitor session 1 source int g0/2 rx
               SwitchA(config)# monitor session 1 dest remote vlan 1000
               !指定复制到交换机 SwitchB 上的哪个端口
               SwitchB(config)# monitor session 1 source remote vlan 1000
               SwitchB(config)# monitor session 1 dest int g0/1
 
         提示:如果需要检测的流量比较大,建议只分析一个方向的数据包。
 
    接下来,我们看看开源 IDS/IPS snort 对网络扫描的检测:
        a. 当我们用 nmap 来进行扫描的时候,snort 能检测到,并生成 nmap 扫描警告,生成的警告消息如下:
      
        b. 当我们用 nessus 来进行扫描的时候,snort 能检测到,并生成 nmap,nessus 及跟目标运行的服务相关的扫描警告,生成的警告消息如下(为了简洁,我删了一些警告信息):
        c. 当我们用 nikto 来进行扫描的时候,snort 能检测到,并生成许多的信息收集和 WEB 应用***扫描警告,下面是几条有代表性的扫描警告:
          
      再次,我们看看商业 IDS/IPS 对网络扫描的检测:就笔者所知,Juniper NetScreen-IDP 可以准确检测出网络扫描,其它 IDS/IPS 笔者不熟悉,不敢乱说了。
 
2. 防护网络扫描
    首先,我们看看防火墙在防护网络扫描方面的作用:作为一种静态的网络安全防护工具,防火墙在防护网络扫描方面的作用比较小,它能作的事情就是保护我们网络上监听着的但未开放给公网的端口(比如只开放给特定IP地址的端口),避免这些端口被***扫描到,仅此而已。其它诸如实时告警和防护,就指望不上了。
     当然,这也意味着我们必须好好利用防火墙这个工具,保护好每一个我们不希望公网访问的端口,避免它们被恶意扫描到。

     其次,我们看看主机***检测系统 OSSEC 在防护网络扫描方面的表现:OSSEC 是一款优秀的主机***检测软件,其默认配置就能够检测和防护网络扫描。下面是笔者做的测试,该测试很好地体现了 OSSEC 的自动防护网络扫描功能。

                在 rac1 扫描 rac2 之前,rac2 的 iptables 规则:
                 [root@rac2 ossec]# iptables -L -n
                 Chain INPUT (policy ACCEPT)
                 target     prot opt source               destination        
                 Chain FORWARD (policy ACCEPT)
                 target     prot opt source               destination        
                 Chain OUTPUT (policy ACCEPT)
                 target     prot opt source               destination  
 
                 从 rac2 扫描 rac1:     
                 [root@rac1 ~]# nmap -sS -v 192.168.2.222
                 Starting nmap 3.70 (
[url]http://www.insecure.org/nmap/[/url] ) at    2008-02-                 Initiating SYN Stealth Scan against 192.168.2.222 [1660 ports] at 21:36
 
                 rac1 扫描了 rac2 之后,rac2 的 iptables 规则:
                 [root@rac2 ossec]# iptables -L -n
                 Chain INPUT (policy ACCEPT)
                 target     prot opt source               destination        
                 DROP       all  --  192.168.2.111        0.0.0.0/0           
  
                 hain FORWARD (policy ACCEPT)
                 target     prot opt source               destination        
                 DROP       all  --  192.168.2.111        0.0.0.0/0          
                 Chain OUTPUT (policy ACCEPT)
                 target     prot opt source               destination 
 
           可以看出,rac2 已经自动添加防火墙规则,丢弃来自 rac1(192.168.2.111)的任何数据包,自动防护网络扫描功能,体现出来了,呵呵。
 
    再次,我们看看端口扫描检测工具 PortSentry 在防护网络扫描方面的表现:PortSentry 是一款检测各种类型端口扫描,实时响应的工具。由于笔者先前没有写过关于 PortSentry 的文章,故在此简单描述一下其安装和使用:

            第一步:修改 Makefile 文件
            # vi Makefile
               # 注释掉下面一行
               # CC = cc
 
               # 取消对下面一行的注释
               CC = gcc
            第二步:修改 portsentry.c 文件中的一个小 bug
            # vi portsentry.c
               将 1584 行 和 1585 行
                printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot
             sourceforget dot net>\n");
            修改为下面这一行:
             printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot sourceforget dot net>\n");
            第三步:安装
             # make linux && make install
            第四步:配置
              a. 启用 iptables 防护:修改 /usr/local/psionic/portsentry/portsentry.conf 文件下面两行               
                 # iptables support for Linux
                 #KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP" 
                 为
                 # iptables support for Linux
                 KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"                  
               b. 把我们信任的网络或主机的IP地址写入 /usr/local/psionic/portsentry/portsentry.ignore 文件,PortSentry 不会 理会来自这些地址的网络扫描。
            第五步:运行
              # /usr/local/psionic/portsentry/portsentry -tcp                            
              # /usr/local/psionic/portsentry/portsentry -stcp 或者   
              # /usr/local/psionic/portsentry/portsentry -atcp 
              # /usr/local/psionic/portsentry/portsentry -udp
 
         下面是笔者的测试,该测试很好地体现了 PortSentry 在自动防护网络扫描时的优秀表现:
 
                   扫描前 rac2 的防火墙规则:
                   [root@rac2 portsentry]# iptables -L -n
                   Chain INPUT (policy ACCEPT)
                   target     prot opt source               destination        
                   Chain FORWARD (policy ACCEPT)
                   target     prot opt source               destination        
                   Chain OUTPUT (policy ACCEPT)
                   target     prot opt source               destination  
 
                  从 rac1 扫描 rac2:
                  [root@rac1 ~]# nmap -sS -O -v 192.168.2.222
 
                  当 rac1 开始扫描 rac2 后,rac2 的 iptables 规则:
                  [root@rac2 portsentry]# iptables -L -n
                  Chain INPUT (policy ACCEPT)
                  target     prot opt source               destination         
                  DROP       all  --  192.168.2.111        0.0.0.0/0          
                  Chain FORWARD (policy ACCEPT)
                  target     prot opt source               destination        
                  Chain OUTPUT (policy ACCEPT)
                  target     prot opt source               destination    
  
                  当 rac1 开始扫描 rac2 后,rac2 的 portsentry.history 文件的内容:
                   [root@rac2 portsentry]# cat portsentry.history
                   1202224522 - 02/05/2008 23:15:22 Host: 192.168.2.111/192.168.2.111 Port: 23 TCP Blocked
 
                  当扫描结束后,获得的信息:
                   [root@rac1 ~]# nmap -sS -O -v 192.168.2.222
                   Starting nmap 3.70 (
[url]http://www.insecure.org/nmap/[/url] ) at 2008-02-05 23:26 CST
                   Initiating SYN Stealth Scan against 192.168.2.222 [1660 ports] at 23:26
                   SYN Stealth Scan Timing: About 32.20% done; ETC: 23:27 (0:01:03 remaining)
                   Increasing send delay for 192.168.2.222 from 0 to 5 due to 11 out of 21 dropped probes since last increase.
                  SYN Stealth Scan Timing: About 50.66% done; ETC: 23:29 (0:01:31 remaining)
                  Increasing send delay for 192.168.2.222 from 5 to 10 due to 11 out of 11 dropped probes since last increase.
                  Increasing send delay for 192.168.2.222 from 10 to 20 due to 11 out of 11 dropped probes since last increase.
                 SYN Stealth Scan Timing: About 78.01% done; ETC: 23:30 (0:00:52 remaining)
                 Increasing send delay for 192.168.2.222 from 20 to 40 due to 11 out of 11 dropped probes since last increase.
                The SYN Stealth Scan took 263.62s to scan 1660 total ports.
                Warning:  OS detection will be MUCH less reliable because we did not find at least 1 open and 1 closed TCP port
                Host 192.168.2.222 appears to be up ... good.
                Interesting ports on 192.168.2.222:
                (The 1650 ports scanned but not shown below are in state: filtered)
               PORT     STATE  SERVICE
               21/tcp   closed ftp
               23/tcp   closed telnet
               53/tcp   closed domain
               113/tcp  closed auth
               256/tcp  closed FW1-secureremote
               443/tcp  closed https
               554/tcp  closed rtsp
               636/tcp  closed ldapssl
               1723/tcp closed pptp
               3389/tcp closed ms-term-serv
               Too many fingerprints match this host to give specific OS details
               Nmap run completed -- 1 IP address (1 host up) scanned in 271.799 seconds  
 
              可以看出,PortSentry 及时添加了 iptables 规则,阻挡了 rac1 的扫描,使得 rac1 的扫描根本就没能发现什么有价值的信息,great!
        
        OSSEC 和 PortSentry 在检测和防护 nmap 扫描时确实表现不凡。但是,我们也不得不承认,他们在应对 nessus 和 nikto 扫描时,几乎无能为力。防护 nessus 和 nikto 扫描的重任,就只有交给网络 IDS/IPS 了。
 
        最后,我们看看网络***检测系统在防护网络扫描方面的表现:就笔者所知,工作于 Inline 模式的 Snort 和 Juniper NetScreen-IDP 可以防护各种网络扫描,诸如 nmap, nessus, nikto 等等,其它 IDS/IPS 笔者不熟悉,不敢乱说了。
 
        提示:如果我们正确配置了防火墙,那么恶意端口扫描并不是严重的事情,不会对我们的网络安全构成严重威胁。
 
六. 结语
     在本系列文章的三个部分,我们分别探讨了网络扫描基础和端口扫描,漏洞扫描,如何应对网络扫描。可以看出,网络扫描并没有我们想象的那么简单,需要注意很多地方和细节,才能够获得我们需要的信息,才能够避免给生产网络造成负面影响,才能够避免给自己带来麻烦。为了更好地保护自己的网络,我们需要积极使用多种软件和技术来检测和防护恶意的网络扫描,限制恶意扫描能抵达的范围,减少恶意扫描所能获得的信息,从而蒙上***的“眼睛”。
 
更多信息,请参考笔者的其它几篇文章:
《snort 安装指南》
《主机***检测系统 OSSEC 安装指南》
《某大型网站在某机房网络核心交换机配置》 RSPAN 配置部分;
《linux 系统安全规范》