注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

God is U 做自己的上帝

富原孤島--只发优质级的文章

 
 
 

日志

 
 

Snort 使用手册,第 2 部分: 配置  

2009-11-10 10:49:56|  分类: [网络安全] |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Snort 使用手册,第 2 部分: 配置

通过设置 Snort 报告 Web 站点入侵

developerWorks
文档选项
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送

英文原文

英文原文


级别: 中级

Brett McLaughlin (brett@newInstance.com), 作家兼编辑, O'Reilly Media, Inc.

2008 年 7 月 18 日

Snort 是一款免费、开源的网络入侵防御系统(Network Intrusion Prevention System,NIPS)和网络入侵检测系统(Network Intrusion Detection System,NIDS)工具,可以检测入侵、防止外部攻击损害您的 Web 设计和应用程序编程。本系列的 第一篇文章 完成了 Snort 安装并使它可以检测包、日志通信量,做好了入侵检测的准备工作。在本文中,将了解这些包中的数据含义,以及如何使用这些数据判断是否发生攻击并向系统管理员发出警告。

在上一篇文章中,您了解到 Snort 是什么,以及如何在系统中安装并运行它。也看到了 Snort 如何执行三种关键的基本功能:

  • 包嗅探:Snort 可以针对它所在的机器监视进入和出去的包。它还可以监视它所运行的网络中大量正在传输的包。这是 Snort 最基本的功能,以包的形式检测和观察网络通信量是所有其他功能的基础。
  • 包记录:Snort 不仅可以实时监视包,还可以记录这些包。日志功能可以使您手动或自动处理这些包,并记录已发生的事件。不论是否正在清理旧包来检测入侵,或是 Snort 根据所记录的内容发出软件警告,包记录功能使 Snort 从一个实时工具转到一个可以以不同形式持久存储数据的工具。
  • 入侵检测:从很大程度上讲,入侵检测实际上就是结合了包嗅探和记录功能,并在其上添加一层自动智能层。一个入侵检测系统(即 IDS)具有一个包含网络状态信息的规则集,可以针对网络中可疑的状态进行监视并发出响应。

在本文中,我将越过基本的安装和配置知识,讨论如何 设置 Snort,以检测与 Web 相关的入侵。您将了解如何用最新的规则配置 Snort,并在后台监控服务器的行为。

注意:本文并非从系统管理员的角度考虑 Snort。与 Snort 相关的知识很多,它可以检测各种入侵,包括对 IRC 服务的攻击、与 Web 相关的问题,以及试图通过受保护端口访问机器的恶意代码。但是,本文实际上专门针对 Web 设计者和开发人员,为保护他们的具体项目和应用程序提出改进建议。有关 Snort 的更多参考资料,请参见 参考资料 中的各种链接。

使用 Snort 分析包

在上一篇文章中,我们简单了解了 Snort 的三个功能,并查看了一些包。例如,运行 DE<snort -vDE< 获得如清单 1 所示的输出。


清单 1. 使用 Snort 嗅探
                  [bdm0509:~] sudo snort -v  Password:  Running in packet dump mode            --== Initializing Snort ==--  Initializing Output Plugins!  Verifying Preprocessor Configurations!  ***  *** interface device lookup found: en0  ***    Initializing Network Interface en0  Decoding Ethernet on interface en0            --== Initialization Complete ==--       ,,_     -*> Snort! <*-    o"  )~   Version 2.8.0.2 (Build 75)       ''''    By Martin Roesch & The Snort Team: http://www.snort.org/team.html             (C) Copyright 1998-2007 Sourcefire Inc., et al.             Using PCRE version: 7.6 2008-01-28    Not Using PCAP_FRAMES  03/31-08:55:12.179192 192.168.1.102:64862 -> 239.255.255.253:427  UDP TTL:1 TOS:0x0 ID:10292 IpLen:20 DgmLen:64  Len: 36  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:12.179498 192.168.1.102:64863 -> 239.255.255.253:427  UDP TTL:1 TOS:0x0 ID:10293 IpLen:20 DgmLen:64  Len: 36  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427  UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64  Len: 36  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:12.180278 192.168.1.102:64865 -> 239.255.255.253:427  UDP TTL:1 TOS:0x0 ID:10295 IpLen:20 DgmLen:64  Len: 36  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:12.247880 192.168.1.102:64866 -> 192.168.1.255:137  UDP TTL:64 TOS:0x0 ID:10296 IpLen:20 DgmLen:78  Len: 50  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:12.248297 192.168.1.103:137 -> 192.168.1.102:64866  UDP TTL:64 TOS:0x0 ID:8075 IpLen:20 DgmLen:90  Len: 62  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:12.599248 192.168.1.102:55381 -> 192.168.1.101:139  TCP TTL:64 TOS:0x0 ID:10297 IpLen:20 DgmLen:64 DF  ******S* Seq: 0x42127B5E  Ack: 0x0  Win: 0xFFFF  TcpLen: 44  TCP Options (8) => MSS: 1460 NOP WS: 0 NOP NOP TS: 1428368232 0   TCP Options => SackOK EOL   ...  LOTS more output here  ...  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:21.976018 0.0.0.0:68 -> 255.255.255.255:67  UDP TTL:64 TOS:0x0 ID:48134 IpLen:20 DgmLen:328  Len: 300  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1    03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68  UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576  Len: 548  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:22.977578 ARP who-has 192.168.1.104 tell 192.168.1.104    ^C*** Caught Int-Signal  Run time prior to being shutdown was 14.231224 seconds  ===============================================================================  Packet Wire Totals:     Received:           78     Analyzed:           78 (100.000%)      Dropped:            0 (0.000%)  Outstanding:            0 (0.000%)  ===============================================================================  Breakdown by protocol (includes rebuilt packets):        ETH: 78         (100.000%)    ETHdisc: 0          (0.000%)       VLAN: 0          (0.000%)       IPV6: 0          (0.000%)    IP6 EXT: 0          (0.000%)    IP6opts: 0          (0.000%)    IP6disc: 0          (0.000%)        IP4: 71         (91.026%)    IP4disc: 0          (0.000%)      TCP 6: 0          (0.000%)      UDP 6: 0          (0.000%)      ICMP6: 0          (0.000%)    ICMP-IP: 0          (0.000%)        TCP: 57         (73.077%)        UDP: 14         (17.949%)       ICMP: 0          (0.000%)    TCPdisc: 0          (0.000%)    UDPdisc: 0          (0.000%)    ICMPdis: 0          (0.000%)       FRAG: 0          (0.000%)     FRAG 6: 0          (0.000%)        ARP: 3          (3.846%)      EAPOL: 0          (0.000%)    ETHLOOP: 0          (0.000%)        IPX: 0          (0.000%)      OTHER: 4          (5.128%)    DISCARD: 0          (0.000%)  InvChkSum: 0          (0.000%)    Upconvt: 0          (0.000%)    Up fail: 0          (0.000%)     S5 G 1: 0          (0.000%)     S5 G 2: 0          (0.000%)      Total: 78          ===============================================================================  Action Stats:  ALERTS: 0  LOGGED: 0  PASSED: 0  ===============================================================================  Snort exiting

注意,您需要以根用户的身份运行或是使用 DE<sudoDE<,详细内容请查看上一篇文章。

当然,这里的难点是利用这些信息。可以进一步把这些信息分解为单个的包,如清单 2 所示(直接使用清单 1 的内容)。


清单 2. 清单 1 输出的单个包
                  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1    03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68  UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576  Len: 548  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

这个包表示什么含义?是否值得关注?

基本上全部关于 IP 地址

包中的最重要信息来自 IP 地址。清单 2 中的包提供了一些;它们在清单 3 中使用粗体突出显示。


清单 3. 注意清单 2 所示包中的 IP 地址
                  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+    03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1    03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68  UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576  Len: 548  =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

这里提到了两个 IP 地址:192.168.1.104 和 192.168.1.1。此外,192.168.1.1 在第二次出现时,后面多了一个端口号。端口号通常出现在 IP 地址之后的冒号后面,例如:192.168.1.1:67

IP 地址实践经验

通常,以 1.1 结尾的 IP 通常一般为路由器或无线网关。在具有多个路由器的位置中,经常会看到从 1.1 到 1.10 等地址,但是低端数字通常表示通向 Internet 或其他网络的路由器和网关。而诸如 100 或 210 等高端数字表示网络中的单个设备。当然,智能管理可以识别这些地址并进行修改,这样恶意攻击者就不会轻松地推测出这些地址,但是可以监视某个包,并从其 IP 地址中获得有关包的发送源和发送目的地的信息。

在利用这些信息之前,需要了解您的机器的 IP 地址。可以使用 Windows® 命令 DE<ipconfigDE<,或者在 Linux®、UNIX®,或 Mac OS X 的终端上,使用 DE<ifconfigDE<。在清单 3 的示例包中,192.168.1.104 正是运行 Snort 的机器的 IP 地址,而 192.168.1.1 则是该机器的网络通往外部网络的路由器的地址。

在这个例子中,这个包来自一个计算机(运行 Snort,IP 地址为 192.168.1.104),并将传输到路由器(192.168.1.1)。随后,将获得一些额外的信息,诸如长度、ID 和一些奇怪的代码,例如 TOS、TTL 和 UDP。

是否适合使用 Snort?

现在看来,详细分析包的过程似乎有些繁琐。如果您是习惯使用 CSS 样式和 DE<divDE< 的 Web 设计师,或者是更加关心类的衔接、接口或某个抽象类是否有意义的开发人员,那么包分析是一个非常枯燥乏味的过程。如果开始就加入一些奇怪的缩写词,那么您很可能再没有兴趣阅读本文,而是查找一些有关 CSS 文本替换或如何使用 C# 实现 Chain of Responsibility 设计模式等内容的资料。

Snort 最擅长于解决这类复杂和困难的包问题。事实上,Snort 对 Web 开发人员如此有用,是因为 它关注设计模式、布局和函数性任务。使用 Snort,在基本理解的基础之上(可以阅读上一篇文章和本节内容),可以让您的工具完成您不愿意完成的工作。本文其余内容将介绍 Snort 如何处理包分析,以及如何利用社区力量保证系统安全,而不需要重新学习已经淡忘的大学网络课程。





回页首


配置 Snort

不需花大量时间研究包,可以对 Snort 进行设置来处理分析,并在发生问题时收到 Snort 的警报;这些功能是通过为 Snort 指定一组规则 实现的。这些规则通常使用文本文件的形式,告诉 Snort 要执行什么操作,为它在包中查找关键细节提供信息,并指导 Snort 在找到键信息后如何操作。此外,这些规则可以限制 Snort 侦听的内容(例如命令 Snort 只监视单个机器,或监视整个网络中的通信量),以及记录查找到的所有内容并生成一个文件方便日后查看。

实际上,使用 Snort 规则可以省去手工分析包的工作。

Snort 的默认配置

在编写规则之前,需要告诉 Snort 作为 IDS 运行。最简单的方法(包括记录包)是使用 Snort 的默认配置,这个配置保存在 Snort 安装目录(我的是 /usr/local/snort-2.8.1/etc/snort.conf)中的 etc/snort.conf 文件。这种方法可以简单地设置并运行 Snort。清单 4 展示了 Snort 配置文件的一部分。


清单 4. 默认的 snort.conf 文件
                  # stream5: Target Based stateful inspection/stream reassembly for Snort  # ---------------------------------------------------------------------  # Stream5 is a target-based stream engine for Snort.  Its functionality  # replaces that of Stream4.  Consequently, BOTH Stream4 and Stream5  # cannot be used simultaneously.  Comment out the stream4 configurations  # above to use Stream5.  #   # See README.stream5 for details on the configuration options.  #  # Example config (that emulates Stream4 with UDP support compiled in)  preprocessor stream5_global: max_tcp 8192, track_tcp yes, \                                track_udp no  preprocessor stream5_tcp: policy first, use_static_footprint_sizes  # preprocessor stream5_udp: ignore_any_rules      # Performance Statistics  # ----------------------  # Documentation for this is provided in the Snort Manual.  You should read it.  # It is included in the release distribution as doc/snort_manual.pdf  #   # preprocessor perfmonitor: time 300 file /var/snort/snort.stats pktcnt 10000    # http_inspect: normalize and detect HTTP traffic and protocol anomalies  #  # lots of options available here. See doc/README.http_inspect.  # unicode.map should be wherever your snort.conf lives, or given  # a full path to where snort can find it.  preprocessor http_inspect: global \      iis_unicode_map unicode.map 1252     preprocessor http_inspect_server: server default \      profile all ports { 80 8080 8180 } oversize_dir_length 500    #  #  Example unique server configuration  #  #preprocessor http_inspect_server: server 1.1.1.1 \  #    ports { 80 3128 8080 } \  #    flow_depth 0 \  #    ascii no \  #    double_decode yes \  #    non_rfc_char { 0x00 } \  #    chunk_length 500000 \  #    non_strict \  #    oversize_dir_length 300 \  #    no_alerts      # rpc_decode: normalize RPC traffic  # ---------------------------------  # RPC may be sent in alternate encodings besides the usual 4-byte encoding  # that is used by default. This plugin takes the port numbers that RPC  # services are running on as arguments - it is assumed that the given ports  # are actually running this type of service. If not, change the ports or turn  # it off.  # The RPC decode preprocessor uses generator ID 106  #  # arguments: space separated list  # alert_fragments - alert on any rpc fragmented TCP data  # no_alert_multiple_requests - don't alert when >1 rpc query is in a packet  # no_alert_large_fragments - don't alert when the fragmented  #                            sizes exceed the current packet size  # no_alert_incomplete - don't alert when a single segment  #                       exceeds the current packet size    preprocessor rpc_decode: 111 32771    # content goes on for a long time...

因此一个单个配置语句如下所示:

preprocessor rpc_decode: 111 32771

Snort 在这里使用了大量的关键字,但是为了配合本文的主题,即提供一种实用的、基本的 Snort 方法,因此不会过多涉及这些内容。但是,需要在这个文件中注意两项内容:

  1. 简短的 Snort 指令,通常包括 DE<preprocessorDE< 语句(关于查找内容)和用于发出警告的 DE<outputDE< 语句(未显示在清单 4 中)。
  2. 默认的 snort.conf 文件实际上是一个功能完整的、有用的配置文件。这不是无用数据,它可用于 Snort 安装。

使用 Snort 检测入侵

准备好配置文件后,可以作为一种入侵检测程序运行 Snort(将在稍后添加规则),清单 5 展示了以 IDS 形式启动 Snort 的输出,并在前台运行。


清单 5. 作为 IDS 运行 Snort
                  bdm0509:/usr/local/snort-2.8.1] sudo snort -de -l logs/ -c etc/snort.conf  Running in IDS mode            --== Initializing Snort ==--  Initializing Output Plugins!  Initializing Preprocessors!  Initializing Plug-ins!  Parsing Rules file etc/snort.conf  PortVar 'HTTP_PORTS' defined :  [ 80 ]  PortVar 'SHELLCODE_PORTS' defined :  [ 0:79 81:65535 ]  PortVar 'ORACLE_PORTS' defined :  [ 1521 ]  Frag3 global config:      Max frags: 65536      Fragment memory cap: 4194304 bytes  Frag3 engine config:      Target-based policy: FIRST      Fragment timeout: 60 seconds      Fragment min_ttl:   1      Fragment ttl_limit (not used): 5      Fragment Problems: 1  Stream5 global config:      Track TCP sessions: ACTIVE      Max TCP sessions: 8192      Memcap (for reassembly packet storage): 8388608      Track UDP sessions: INACTIVE      Track ICMP sessions: INACTIVE  Stream5 TCP Policy config:      Reassembly Policy: FIRST      Timeout: 30 seconds      Min ttl:  1      Options:          Static Flushpoint Sizes: YES      Reassembly Ports:        21 client (Footprint)         23 client (Footprint)         25 client (Footprint)         42 client (Footprint)         53 client (Footprint)         80 client (Footprint)         110 client (Footprint)         111 client (Footprint)         135 client (Footprint)         136 client (Footprint)         137 client (Footprint)         139 client (Footprint)         143 client (Footprint)         445 client (Footprint)         513 client (Footprint)         514 client (Footprint)         1433 client (Footprint)         1521 client (Footprint)         2401 client (Footprint)         3306 client (Footprint)   HttpInspect Config:      GLOBAL CONFIG        Max Pipeline Requests:    0        Inspection Type:          STATELESS        Detect Proxy Usage:       NO        IIS Unicode Map Filename: etc/unicode.map        IIS Unicode Map Codepage: 1252      DEFAULT SERVER CONFIG:        Server profile: All        Ports: 80 8080 8180         Flow Depth: 300        Max Chunk Length: 500000        Max Header Field Length: 0        Inspect Pipeline Requests: YES        URI Discovery Strict Mode: NO        Allow Proxy Usage: NO        Disable Alerting: NO        Oversize Dir Length: 500        Only inspect URI: NO        Ascii: YES alert: NO        Double Decoding: YES alert: YES        %U Encoding: YES alert: YES        Bare Byte: YES alert: YES        Base36: OFF        UTF 8: OFF        IIS Unicode: YES alert: YES        Multiple Slash: YES alert: NO        IIS Backslash: YES alert: NO        Directory Traversal: YES alert: NO        Web Root Traversal: YES alert: YES        Apache WhiteSpace: YES alert: NO        IIS Delimiter: YES alert: NO        IIS Unicode Map: GLOBAL IIS UNICODE MAP CONFIG        Non-RFC Compliant Characters: NONE        Whitespace Characters: 0x09 0x0b 0x0c 0x0d   rpc_decode arguments:      Ports to decode RPC on: 111 32771       alert_fragments: INACTIVE      alert_large_fragments: ACTIVE      alert_incomplete: ACTIVE      alert_multiple_requests: ACTIVE  Portscan Detection Config:      Detect Protocols:  TCP UDP ICMP IP      Detect Scan Type:  portscan portsweep decoy_portscan distributed_portscan      Sensitivity Level: Low      Memcap (in bytes): 10000000      Number of Nodes:   36900    ERROR: Unable to open rules file: ../rules/local.rules or etc/../rules/local.rules  Fatal Error, Quitting..

截至最后一行为止,一切运行顺利。Snort 期望发现一些规则文件,但是没有找到,因此出现错误。

默认的配置文件包含一些规则文件

Snort 提供了一些标准规则文件,具有预定义的名称和函数。如果再次打开 snort.conf 文件,并浏览最底部的内容,将看到如清单 6 所示的一组命令:


清单 6. snort.conf 文件的底部
####################################################################  # Step #6: Customize your rule set  #  # Up to date snort rules are available at http://www.snort.org  #  # The snort Web site has documentation about how to write your own custom snort  # rules.    #=========================================  # Include all relevant rulesets here   #   # The following rulesets are disabled by default:  #  #   web-attacks, backdoor, shellcode, policy, porn, info, icmp-info, virus,  #   chat, multimedia, and p2p  #              # These rules are either site policy specific or require tuning in order to not  # generate false positive alerts in most environments.  #   # Please read the specific include file for more information and  # README.alert_order for how rule ordering affects how alerts are triggered.  #=========================================    include $RULE_PATH/local.rules  include $RULE_PATH/bad-traffic.rules  include $RULE_PATH/exploit.rules  include $RULE_PATH/scan.rules  include $RULE_PATH/finger.rules  include $RULE_PATH/ftp.rules  include $RULE_PATH/telnet.rules  include $RULE_PATH/rpc.rules  include $RULE_PATH/rservices.rules  include $RULE_PATH/dos.rules  include $RULE_PATH/ddos.rules  include $RULE_PATH/dns.rules  include $RULE_PATH/tftp.rules    include $RULE_PATH/web-cgi.rules  include $RULE_PATH/web-coldfusion.rules  include $RULE_PATH/web-iis.rules  include $RULE_PATH/web-frontpage.rules  include $RULE_PATH/web-misc.rules  include $RULE_PATH/web-client.rules  include $RULE_PATH/web-php.rules    include $RULE_PATH/sql.rules  include $RULE_PATH/x11.rules  include $RULE_PATH/icmp.rules  include $RULE_PATH/netbios.rules  include $RULE_PATH/misc.rules  include $RULE_PATH/attack-responses.rules  include $RULE_PATH/oracle.rules  include $RULE_PATH/mysql.rules  include $RULE_PATH/snmp.rules    include $RULE_PATH/smtp.rules  include $RULE_PATH/imap.rules  include $RULE_PATH/pop2.rules  include $RULE_PATH/pop3.rules    include $RULE_PATH/nntp.rules  include $RULE_PATH/other-ids.rules  # include $RULE_PATH/web-attacks.rules  # include $RULE_PATH/backdoor.rules  # include $RULE_PATH/shellcode.rules  # include $RULE_PATH/policy.rules  # include $RULE_PATH/porn.rules  # include $RULE_PATH/info.rules  # include $RULE_PATH/icmp-info.rules  # include $RULE_PATH/virus.rules  # include $RULE_PATH/chat.rules  # include $RULE_PATH/multimedia.rules  # include $RULE_PATH/p2p.rules  # include $RULE_PATH/spyware-put.rules  # include $RULE_PATH/specific-threats.rules  include $RULE_PATH/experimental.rules    # include $PREPROC_RULE_PATH/preprocessor.rules  # include $PREPROC_RULE_PATH/decoder.rules    # Include any thresholding or suppression commands. See threshold.conf in the  # <snort src>/etc directory for details. Commands don't necessarily need to be  # contained in this conf, but a separate conf makes it easier to maintain them.   # Note for Windows users:  You are advised to make this an absolute path,  # such as:  c:\snort\etc\threshold.conf  # Uncomment if needed.  # include threshold.conf

该文件试图包含一些规则文件,这些行中最主要的一行如下所示:

include $RULE_PATH/local.rules

接下来,要运行 Snort 需要一些可以加载和使用的规则。





回页首


告诉 Snort 如何使用规则

规则在 Snort 术语里面就是 Snort 指令;具体来讲,规则就是如何检查、分析或报告包。虽然配置是关于 Snort 如何操作的更加一般化的规则集,但在包每次跨过所监视的网络接口时,规则将告诉 Snort 执行什么操作。

Snort 中的规则由两个基本部分组成:

  1. 告诉 Snort 查找包中的特定内容,例如 Web 请求中的 DE<GETDE< 或 telnet 连接中的特定端口。
  2. 告诉 Snort 在找到特定内容时执行何种操作。多数情况下仅是触发一个警告,允许您对警告进行响应。

因此对于每一个可能的入侵连接,Snort 都需要使用一条规则(或涵盖多个相关入侵的规则)。这种方法的缺点十分明显:需要处理的入侵太多了。即使是专职网络管理员或系统管理员,也无法应付所有不同的入侵,而且新的入侵每天都会出现。更糟糕的是,如果您是一个小型组织的 Web 开发人员,并且兼管 Snort,或者试图劝说已经满负荷工作的管理员再负责 Snort,这更不可能。所幸的是,Snort 解决了这些问题。

Snort 要求用户必须进行免费注册

大多数 Web 友好的开源项目不会要求您进行注册。但是必须注册 Snort。只有注册后才能免费下载 Snort 提供的默认规则,这也是本文下一小节的主题。访问 Snort 站点(参见 参考资料),单击 Registration 链接进行注册。

获得 Snort 的默认规则

由于 Snort 是一种技术性的、特定于网络的产品,人们在不断改进 Snort 的同时更新目前流行的入侵类型 —— 以及如何检测并响应这些入侵。每当发布 Snort 的新版本时,将附带一组新的 “默认” 规则集。这个默认规则集基本上涵盖了需要进行保护的所有内容,并且非常简单。

导航到 Snort Web 站点(访问 参考资料 小节的链接),单击左侧导航的 Rules 链接。在规则页面的顶部有一个灰色的导航栏,单击上面的 VRT Rules。向下滚动已注册用户部分,可以找到一组匹配您所使用的 Snort 版本的规则集;图 1 显示了这部分 Snort 站点。

注意:确保在下载规则之前已经登录。


图 1. 从 Snort Web 站点下载默认规则
Snort 提供了可以使用的默认规则集

这将下载一个 ZIP 文件,名为 snortrules-snapshot-2.8.tar.gz。展开这个文件,将得到一个名为 snortrules-snapshot-2.8_s 的文件夹。这个文件夹的内容如图 2 所示。


图 2. 从 Snort Web 站点获得规则
打开从 Snort Web 站点下载的 zip 文件

“安装” 默认规则集

默认情况下,Snort 至少会在 Snort 安装的 rules 目录中查找一个名为 local.rules 的规则集。因此,利用刚才下载的规则,只需将展开的规则文件夹复制或移动到 Snort 安装目录:

[bdm0509:/usr/local/snort-2.8.1] cp -rp ~/Downloads/snortrules-snapshot-2.8_s/rules .

还应该复制下载的规则中的 etc/ 目录。这将更新您的默认配置,从而包括任何附加的规则文件,这些规则文件可能需要用于这个版本的规则:

[bdm0509:/usr/local/snort-2.8.1] cp -rp ~/Downloads/snortrules-snapshot-2.8_s/etc .

完成以上所有操作后,您的 Snort 目录结构应当如清单 7 所示。


清单 7. 含有一个规则目录的 Snort 安装目录
                  [bdm0509:/usr/local/snort-2.8.1] ls  COPYING  autom4te.cache configure.in ltmain.sh snort.8  ChangeLog config.guess contrib  m4  src  LICENSE  config.h depcomp  missing  stamp-h1  Makefile config.h.in doc  mkinstalldirs templates  Makefile.am config.log etc  preproc_rules verstuff.pl  Makefile.in config.status install-sh rpm  ylwrap  RELEASE.NOTES config.sub libtool  rules  aclocal.m4 configure logs  schemas

嵌套的目录中也包含了大量规则。清单 8 展示了从 Snort 站点获得的所有规则文件。


清单 8. Snort 的 rules/ 目录中的规则
                  [bdm0509:/usr/local/snort-2.8.1] ls rules  Makefile.am  info.rules  smtp.rules  VRT-License.txt  local.rules  snmp.rules  attack-responses.rules misc.rules  specific-threats.rules  backdoor.rules  multimedia.rules spyware-put.rules  bad-traffic.rules mysql.rules  sql.rules  cgi-bin.list  netbios.rules  telnet.rules  chat.rules  nntp.rules  tftp.rules  content-replace.rules open-test.conf  virus.rules  ddos.rules  oracle.rules  voip.rules  deleted.rules  other-ids.rules  web-attacks.rules  dns.rules  p2p.rules  web-cgi.rules  dos.rules  policy.rules  web-client.rules  experimental.rules pop2.rules  web-coldfusion.rules  exploit.rules  pop3.rules  web-frontpage.rules  finger.rules  porn.rules  web-iis.rules  ftp.rules  rpc.rules  web-misc.rules  icmp-info.rules  rservices.rules  web-php.rules  icmp.rules  scan.rules  x11.rules  imap.rules  shellcode.rules

在 Mac OS X 上的问题

如果在这个阶段尝试在大多数平台上运行 Snort,则应该没有问题。然而,值得一提的是与 Mac OS X 有关的一些问题,特别是在将 Snort 引入 UNIX 或 Linux 生产服务器之前使用 Mac 作为测试机器。需要执行一些步骤才能在 Mac OS X 上正确地运行 Snort。

首先,需要删除当前的 Snort 安装并重新构建。但不需要手工删除文件。运行以下命令即可:

make clean

上面的命令将删除所有文件,为重新构建适合 Mac OS X 的安装做好准备。然后,发出以下命令:

[bdm0509:/usr/local/snort-2.8.1] glibtoolize --force  Using `AC_PROG_RANLIB' is rendered obsolete by `AC_PROG_LIBTOOL'  [bdm0509:/usr/local/snort-2.8.1] sudo aclocal -I m4  Password:  [bdm0509:/usr/local/snort-2.8.1] sudo autoheader  [bdm0509:/usr/local/snort-2.8.1] sudo automake --add-missing --copy  [bdm0509:/usr/local/snort-2.8.1] sudo autoconf  [bdm0509:/usr/local/snort-2.8.1] export LD_TWOLEVEL_NAMESPACE=1

现在,可以重新运行 DE<makeDE< 命令,然后运行 DE<make installDE< 命令(上一篇文章已详细描述)。您将获得大量输出,现在基本上可以开始运行 Snort 了。

还需要进行一处修改,即 etc/snort.conf 配置文件。在 snort.conf 文件中查找以下行(最简单的方法是搜索 “dynamicengine”)。

#  # Load a dynamic engine from the install path  # (same as command line option --dynamic-engine-lib)  #  dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so

通过在行首插入 DE<#DE< 符号注释掉 dynamicengine 行,然后添加以下粗体显示的行:

#  # Load a dynamic engine from the install path  # (same as command line option --dynamic-engine-lib)  #  #dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so  dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.dylib              

还需要执行几个类似的修改。搜索 “Step #2”,将看到清单 9 所示的内容:


清单 9. 在代码中搜索 Step #2
####################################################   # Step #2: Configure dynamic loaded libraries  ## If snort was configured to use dynamically loaded libraries,  # those libraries can be loaded here.#  # Each of the following configuration options can be done via# the command line as well.  ## Load all dynamic preprocessors from the install path  # (same as command line option --dynamic-preprocessor-lib-dir)  #  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.so  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.so  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.so  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.so  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.so    # Comment out above and uncomment this if running OSX  #  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.dylib  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.dylib  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.dylib  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.dylib  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.dylib

注意:为了方便输出和在 Web 上查看,一些行被人为地打断。这些指令在 snort.conf 中都在同一行上,您应该在自己的配置文件中保持这种格式。

您将需要如实地根据说明操作。注释掉前面的几行,然后去掉后面几行的注释,如清单 10 所示。


清单 10. 显示需要注释和去掉注释的行
####################################################   # Step #2: Configure dynamic loaded libraries  ## If snort was configured to use dynamically loaded libraries,  # those libraries can be loaded here.#  # Each of the following configuration options can be done via# the command line as well.  ## Load all dynamic preprocessors from the install path  # (same as command line option --dynamic-preprocessor-lib-dir)  #  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.so  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.so  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.so  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.so  #dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.so    # Comment out above and uncomment this if running OSX  #  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.dylib  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.dylib  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.dylib  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.dylib  dynamicpreprocessor      file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.dylib              

现在,可以运行 Snort 了,看上去似乎需要很多工作,但是使用与网络或系统相关的工具可以轻松地完成此类配置。最棒的是这种工作只需做一次(或少数几次)。

但是,在继续之前需要注意,由于大多数规则包含一个新版本的 snort.conf 文件,您需要在每次复制新的文件或 etc/ 目录时执行这些步骤的最后一个步骤。

这些内容的细节不是本文探讨的范围,并且涉及到真正的网络和系统管理员问题,作为一名 Web 开发人员或设计师不需要花时间细究这些问题。现在,只需执行这些指令,如果有兴趣进一步了解,可访问 Snort 在线论坛(参见 参考资料)。

以 IDS 的形式运行 Snort

具备了默认的规则集,并且对 Mac OS X(如果使用该平台的话)进行了调整,就可以开始启动 Snort 了。清单 11 显示了需要使用的命令,以及该命令的一部分输出。


清单 11. 运行 Snort(没错错误)
                  [bdm0509:/usr/local/snort-2.8.1] sudo snort -de -l logs/ -c etc/snort.conf  Running in IDS mode            --== Initializing Snort ==--  Initializing Output Plugins!  Initializing Preprocessors!  Initializing Plug-ins!  Parsing Rules file etc/snort.conf  PortVar 'HTTP_PORTS' defined :  [ 80 ]  PortVar 'SHELLCODE_PORTS' defined :  [ 0:79 81:65535 ]  PortVar 'ORACLE_PORTS' defined :  [ 1521 ]  Frag3 global config:      Max frags: 65536      Fragment memory cap: 4194304 bytes  Frag3 engine config:      Target-based policy: FIRST      Fragment timeout: 60 seconds      Fragment min_ttl:   1      Fragment ttl_limit (not used): 5      Fragment Problems: 1  Stream5 global config:      Track TCP sessions: ACTIVE      Max TCP sessions: 8192      Memcap (for reassembly packet storage): 8388608      Track UDP sessions: INACTIVE      Track ICMP sessions: INACTIVE  Stream5 TCP Policy config:      Reassembly Policy: FIRST      Timeout: 30 seconds      Min ttl:  1      Options:          Static Flushpoint Sizes: YES      Reassembly Ports:        21 client (Footprint)         23 client (Footprint)         25 client (Footprint)         42 client (Footprint)         53 client (Footprint)         80 client (Footprint)   ...  LOTS more output like this for a while...  ...  +++++++++++++++++++++++++++++++++++++++++++++++++++  Initializing rule chains...  8771 Snort rules read      8771 detection rules      0 decoder rules      0 preprocessor rules  8771 Option Chains linked into 501 Chain Headers  0 Dynamic rules  +++++++++++++++++++++++++++++++++++++++++++++++++++    +-------------------[Rule Port Counts]---------------------------------------  |             tcp     udp    icmp      ip  |     src    1011      38       0       0  |     dst    6684     429       0       0  |     any     494     117      20       7  |      nc      15       4       3       4  |     s+d      16      16       0       0  +----------------------------------------------------------------------------    +-----------------------[thresholding-config]----------------------------------  | memory-cap : 1048576 bytes  +-----------------------[thresholding-global]----------------------------------  | none  +-----------------------[thresholding-local]-----------------------------------  | gen-id=1      sig-id=12224      type=Limit     tracking=src count=1   seconds=600  | gen-id=1      sig-id=12228      type=Limit     tracking=src count=1   seconds=30   | gen-id=1      sig-id=7055       type=Limit     tracking=src count=1   seconds=300  | gen-id=1      sig-id=7069       type=Limit     tracking=src count=1   seconds=300  | gen-id=1      sig-id=7068       type=Limit     tracking=src count=1   seconds=300  | gen-id=1      sig-id=7074       type=Limit     tracking=src count=1   seconds=600  | gen-id=1      sig-id=12121      type=Limit     tracking=src count=1   seconds=300  | gen-id=1      sig-id=12122      type=Limit     tracking=src count=1   seconds=18000  ...  More packet information rolling by...  ...  +-----------------------[suppression]------------------------------------------  | none  -------------------------------------------------------------------------------  Rule application order: activation->dynamic->pass->drop->alert->log  Log directory = logs/  Verifying Preprocessor Configurations!  Warning: 'ignore_any_rules' option for Stream5 UDP disabled because of UDP rule with            flow or flowbits option  Warning: flowbits key 'access.download' is set but not ever checked.  Warning: flowbits key 'dce.bind.mqqm' is checked but not ever set.  Warning: flowbits key 'sylk.download' is set but not ever checked.  Warning: flowbits key 'AdvancedSpy_detection' is set but not ever checked.  Warning: flowbits key 'works.download' is set but not ever checked.  Warning: flowbits key 'mspub_header' is set but not ever checked.  358 out of 512 flowbits in use.  ***  *** interface device lookup found: en0  ***    Initializing Network Interface en0  Decoding Ethernet on interface en0    [ Port Based Pattern Matching Memory ]  +-[AC-BNFA Search Info Summary]------------------------------  | Instances        : 835  | Patterns         : 210306  | Pattern Chars    : 1938187  | Num States       : 1108715  | Num Match States : 177685  | Memory           :   26.49Mbytes  |   Patterns       :   5.86M  |   Match Lists    :   7.21M  |   Transitions    :   13.36M  +-------------------------------------------------            --== Initialization Complete ==--       ,,_     -*> Snort! <*-    o"  )~   Version 2.8.1 (Build 28)       ''''    By Martin Roesch & The Snort Team:                http://www.snort.org/team.html             (C) Copyright 1998-2008 Sourcefire Inc., et al.             Using PCRE version: 6.5 01-Feb-2006               Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 1.8                    <Build 13>             Preprocessor Object: SF_SSH  Version 1.1  <Build 1>             Preprocessor Object: SF_SMTP  Version 1.1  <Build 7>             Preprocessor Object: SF_FTPTELNET  Version 1.1  <Build 10>             Preprocessor Object: SF_DNS  Version 1.1  <Build 2>             Preprocessor Object: SF_DCERPC  Version 1.1  <Build 4>  Not Using PCAP_FRAMES    System will wait here until you exit Snort...    ^C*** Caught Int-Signal  Run time prior to being shutdown was 356.123989 seconds  ===============================================================================  Packet Wire Totals:     Received:          893     Analyzed:          893 (100.000%)      Dropped:            0 (0.000%)  Outstanding:            0 (0.000%)  ===============================================================================  Breakdown by protocol (includes rebuilt packets):        ETH: 893        (100.000%)    ETHdisc: 0          (0.000%)       VLAN: 0          (0.000%)       IPV6: 4          (0.448%)    IP6 EXT: 0          (0.000%)    IP6opts: 0          (0.000%)    IP6disc: 0          (0.000%)        IP4: 884        (98.992%)    IP4disc: 0          (0.000%)      TCP 6: 0          (0.000%)      UDP 6: 0          (0.000%)      ICMP6: 0          (0.000%)    ICMP-IP: 0          (0.000%)        TCP: 807        (90.370%)        UDP: 74         (8.287%)       ICMP: 3          (0.336%)    TCPdisc: 0          (0.000%)    UDPdisc: 0          (0.000%)    ICMPdis: 0          (0.000%)       FRAG: 0          (0.000%)     FRAG 6: 0          (0.000%)        ARP: 5          (0.560%)      EAPOL: 0          (0.000%)    ETHLOOP: 0          (0.000%)        IPX: 0          (0.000%)      OTHER: 0          (0.000%)    DISCARD: 0          (0.000%)  InvChkSum: 458        (51.288%)     S5 G 1: 0          (0.000%)     S5 G 2: 0          (0.000%)      Total: 893         ===============================================================================  Action Stats:  ALERTS: 33  LOGGED: 33  PASSED: 0  ===============================================================================  Frag3 statistics:          Total Fragments: 0        Frags Reassembled: 0                 Discards: 0            Memory Faults: 0                 Timeouts: 0                 Overlaps: 0                Anomalies: 0                   Alerts: 0       FragTrackers Added: 0      FragTrackers Dumped: 0  FragTrackers Auto Freed: 0      Frag Nodes Inserted: 0       Frag Nodes Deleted: 0  ===============================================================================  Stream5 statistics:              Total sessions: 62                TCP sessions: 18                UDP sessions: 44               ICMP sessions: 0                  TCP Prunes: 0                  UDP Prunes: 0                 ICMP Prunes: 0  TCP StreamTrackers Created: 20  TCP StreamTrackers Deleted: 20                TCP Timeouts: 4                TCP Overlaps: 0         TCP Segments Queued: 0       TCP Segments Released: 0         TCP Rebuilt Packets: 0           TCP Segments Used: 0                TCP Discards: 120        UDP Sessions Created: 46        UDP Sessions Deleted: 46                UDP Timeouts: 2                UDP Discards: 0                      Events: 0  ===============================================================================  HTTP Inspect - encodings (Note: stream-reassembled packets included):      POST methods:                   0               GET methods:                    0               Post parameters extracted:      0               Unicode:                        0               Double unicode:                 0               Non-ASCII representable:        0               Base 36:                        0               Directory traversals:           0               Extra slashes ("//"):           0               Self-referencing paths ("./"):  0               Total packets processed:        238         ===============================================================================  Snort exiting

这产生了大量输出,并且指出了为什么在命令行运行 Snort 是一种临时的低效的方法。最好是在一个长期的持久的基础上运行 Snort(作为系统或后台进程运行)。

但是,在进一步分析规则之前,如清单 11 所示,在 DE<sudo snort -de -l logs/ -c etc/snort.confDE< 命令中,应该将运行 Snort 的命令的各个部分分解。下面解释了各个部分的作用:

  • DE<sudoDE<:允许您使用管理特权运行 Snort。上一篇文章对此已做讨论,但简而言之,Snort 需要比普通用户更多的权限。
  • DE<snortDE<:显然,这用来运行 Snort。
  • DE<-deDE<:“d” 选项使 Snort 侦听并显示应用程序层的数据,而 “e” 显示链接层包报头。这个选项实际上提供了有关 Snort 包嗅探的最详尽的记录(但都是必要的)。
  • DE<-l logs/DE<:告诉 Snort 记录包和生成的警告,并将所有内容放入到 logs/ 目录。
  • DE<-c etc/snort.confDE<:表示使用 etc/snort.conf 作为配置文件来运行 Snort。




回页首


三种基本的规则

在使用当前的规则集运行 Snort 后,可以进一步编写您自己的规则。这种方法可以添加安全性和针对特定问题的检查,并意味着基于 Web 的攻击和与 HTTP 有关的问题将是关注的重点。但是,您首先需要了解一些有关规则构建的概念和理论。

下面是一些通用的规则类型。通过查看每一种类型,您将大致了解使用 Snort 规则可以实现哪些操作。

  • 包基于它们所指向的端口的规则。这些规则主要侧重于接收包的端口。可以很容易地判断应用程序应该打开哪些端口,因此这种方法可以监视异常的或已关闭端口中潜在的非法通信。在这里,最常出现攻击源的是 IRC(Internet Relay Chat),下面的这条规则可以防止非法利用通用的 IRC 端口:
    alert tcp $EXTERNAL_NET any -> $HOME_NET 6666:7000           (msg:"EXPLOIT CHAT IRC topic overflow"; flow:to_client,established;            content:"|EB|K[S2|E4 83 C3 0B|K|88 23 B8|Pw"; reference:bugtraq,573;            reference:cve,1999-0672; classtype:attempted-user; sid:307; rev:9;)

  • 包基于包协议的规则。这些规则侧重于使用的协议,比如 HTTP 或 IP Mobility。例如,下面这条规则可以检测到潜在的恶意 SMTP SSL 请求:
    alert tcp $SMTP_SERVERS 465 -> $EXTERNAL_NET any           (msg:"SMTP SSLv2 Server_Hello request";            flow:from_server,established; flowbits:isset,sslv2.client_hello.request;            content:"|04|"; depth:1; offset:2; content:"|00 02|"; depth:2; offset:5;            flowbits:set,sslv2.server_hello.request; flowbits:noalert;            metadata:policy balanced-ips drop, policy connectivity-ips drop,                     policy security-ips drop, service smtp;            classtype:protocol-command-decode; sid:3497; rev:4;)

  • 包基于相关的应用程序的规则。很多应用程序本身没有问题,但是存在潜在的安全漏洞,比如这种应用程序所使用的某个端口或协议存在漏洞。下面的规则可以防止一种顽固的访问漏洞,即允许不当的下载请求:
    alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS            (msg:"WEB-CLIENT Microsoft Access file download request";             flow:to_server, established; content:"GET"; nocase; uricontent:".mdb";             nocase; flowbits:set,access.download; flowbits:noalert;             metadata:service http; reference:url,support.microsoft.com/kb/925330;             classtype:misc-activity; sid:13627; rev:1;)  

对于包来讲,不需要理解这些规则中的每一个选项;事实上,要做的是查看 DE<nocaseDE< 的内容,而不是如何理解它的含义,或者弄明白规则创建者如何知道 IRC 通信流量通常经过 6666 与 7000 之间的端口。虽然提到过很多次,但是这里还要再重复一遍:如果您是一名设计人员,那么就关注设计方面的内容,如果是一名编程人员,那么就关注编程。以您的主要职能为重点,然后了解相关的 Snort 知识并使用它。随后则由网络或系统管理员来研究每个细节选项。





回页首


一些常用的规则

尽管不需要了解规则的所有细节,但是有些规则是应该熟悉的。这些规则侧重于 Web 或与 Web 相关的问题,并且不一定包含在从 Snort 获得的默认规则集中。

避免成为垃圾邮件中转站

首先,应当始终防止您的机器(为数百万个用户提供 Web 内容的机器)成为一个邮件中转站。大多数垃圾邮件发送者是这样工作的:他们通过另一个不受保护的机器发送邮件并隐藏自己的身份。实施这种保护实际上出于两种重要的原因:

  • 很明显,垃圾邮件不是什么好东西,没有人希望自己的服务器成为垃圾邮件发送者的资源。
  • 您的服务器的 IP 会被阻塞。这个问题对于 Web 开发人员来说更加严重。如果其他网络及其管理员意识到您的服务器是发送垃圾邮件的源头,那么很可能阻止您的服务器的 IP 地址访问他们的网络。在某些情况下,这只会影响邮件(来自您的服务器的邮件被阻塞或列入黑名单)。然而,有些情况下,来自或流向您的服务器的所有通信都将被阻塞。这意味着当有人尝试从这个网络访问您的站点时,他们也将受到阻塞,这也将缩减您的用户群。

清单 12 展示了一个示例规则,可以将它添加到 Snort 设置中处理邮件转发。


清单 12. 使用规则防止邮件转发
                  alert tcp $SMTP_SERVERS 25 -> $EXTERNAL_NET any       (msg:"Possible mail relay usage"; content:"Relaying denied";         flags:A+; classtype:trojan-activity; sid:1000001; rev:1;)

详细分析 403 错误

有时您希望 Snort 显示信息警告的内容。这些警告提供有用的数据,但是需要采用人工进一步分析。一个很好的例子就是 403 禁止消息(在请求受保护资源时 Web 服务器生成禁止消息)。Snort 可以检测所有这些 “403 - forbidden” 错误,然后发出警告。您将得到如下内容:

HTTP/1.0 403 Access denied to 72.187.80.82/../../windows/system/cmd.exe

显然,这不仅仅是一个错误的 URL 或坏链接……而是试图恶意利用一个命令行可执行文件。当然,可能还会得到类似如下的警告:

HTTP/1.0 403 Access denied to 203.42.142.32/images/sg_talking.jpg

乍看上去好像一切正常;似乎只是一个关于图像的权限问题。因此首先确定是否需要将一个 IP 或网络添加到黑名单,其次,需要检查您的应用程序。总之,您需要有关 403 的信息,以便作出决定。清单 13 显示了报告这些信息的规则。


清单 13. 报告 403 错误的规则
                  alert tcp $HTTP_SERVERS $HTTP_PORTS -> $EXTERNAL_NET any        (msg:"ATTACK-RESPONSES 403 Forbidden"; flow:from_server,established;         content:"HTTP/1.1 403"; depth:12; classtype:attempted-recon; sid:1201; rev:7;)

实际上这条规则现在包含在了较新的 Snort 版本中,但是如果您已经安装了 Snort,那么确保包含这条规则。如果管理员用电子邮件每月向您发送规则生成的警告,您将得到一些益处。这可以使您了解自己的应用程序设计中存在的潜在安全问题。

避免成为 Snort 权威

最后一条忠告,特别是针对小型组织中的人员:小心不要成为 Snort 权威。学习 Snort 将投入大量的时间,这样就无法将精力集中在您的专长上:设计站点和构建 Web 应用程序等。当然,如果希望 进一步了解网络,那么就尽情地研究 Snort 吧。但是最好向目前的管理员推荐类似本文的文章,并鼓励他们完成这些工作,而不是成为他们学习 Snort 知识的管道。

从某种角度而言,对安全性有了一定的了解之后,就应该就此打住。学习一些关于 Snort 或其他 IDS 知识是容易的,并且容易因此变得多疑。攻击 Web 应用程序有很多方法,您不可能阻止所有攻击方式。与其熟悉并精通 Snort,还不如与管理员建立良好的关系。告诉他们您的安全需求和顾虑,然后由他们解决问题。从长远来看,与亲自接揽本应由管理员负责的安全性维护相比,这将受益匪浅。





回页首


结束语

好像 Snort 应该是由系统和网络管理员来使用的工具。作为一名 Web 设计师或应用程序编程人员,和管理员一起讨论他们如何安装 Snort 时,您可能会感到茫然。因此,如果您将这篇文章(或包含一些 Snort 规则的文本文件)交给管理员时,可能会遭到拒绝,您要为此做好心理准备。

尽管如此,您的职责 是将所有工作整合到设计良好的 Web 站点,或一个经过调优的 Web 应用程序。因此,如果将保护您的工作成果的职责完全交付给其他人,那么这样做不仅愚蠢而且是不负责任的。通过一些准备工作、一些前瞻性考虑以及与您的管理员进行深入的交流,您将可以获得一些提示、技巧和本文详述的规则,并应用到企业的 Snort 设置中。如果您在一个更小的组织中工作,可能需要亲自负责 Snort 的工作。这也没有关系;它允许您使用正确的方式保护您的应用程序,并且最重要的是,确保您 Web 站点可以一直安全运行,使您可以在晚上关掉手机、传呼机等睡个安稳的觉。

最重要的是,Snort 可以让您的 Web 应用程序在更广阔的环境中运行。 如果选择将站点和应用程序放在 Internet 中,那么将在一个非常公开的环境中运行;因此不能确定所有内容运行正常。然而,通过与管理员和组织中的其他成员进行交流,对 Snort 有了充分的了解,那么就可以在开发并部署应用程序之后实现长期运行。



参考资料

学习

获得产品和技术
  • The Snort 下载主页 提供了所有 Snort 二进制文件和源文件下载。

  • 您可以从 Apple Developer Connection 下载一个面向 Mac OS X 的 C 编译器。可能需要一个帐户,但是可以免费注册和下载。

  • 下载 Perl Compatible Regular Expressions 库

  • WinPcap 允许在 Windows 平台上实现 Snort 链接层网络访问。

  • Managing Security with Snort and IDS Tools (Kerry Cox 和 Christopher Gerg,O'Reilly Media,Inc.)提供了有关安全性的更全面的介绍,并为站点管理提供了大量与 Snort 相关的内容。

  • Snort Cookbook (Angela Orebaugh、Simon Biles 和 Jacob Babbin,O'Reilly Media, Inc.)是一份出色的参考资料,介绍了 Snort 知识和一些特殊任务,涵盖了基本安装、高级入侵检测和网络优化等。


讨论


关于作者

Brett McLaughlin 的照片

Brett McLaughlin 从 Logo 时代就开始使用计算机。(还记得那个小三角吗?)近年来他已经成为 Java? 和 XML 社区最知名的作家和程序员之一。他曾经在 Nextel Communications 实现过复杂的企业系统,在 Lutris Technologies 编写应用程序服务器,最近在 O'Reilly Media, Inc. 继续撰写和编辑这方面的图书。在他的新书 Head Rush Ajax 中,他为 Ajax 带来了获奖的创新方法 Head First。他的上一本书 Java 1.5 Tiger: A Developer's Notebook 是第一本可获得的关于最新版本 Java 技术的书籍,而他的经典著作 Java and XML 仍然是在 Java 语言中使用 XML 技术的权威图书。

  评论这张
 
阅读(387)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017