Linux IDS 理解

作者:Pedro Paulo Bueno

您觉得您的网络安全吗?您真的了解您的网络现在正在发生什么吗?曾几何时,网络管理员认为他们安全问题的解决方案是一个简单的防火墙。在过去的几年里,我们已经证实情况并非如此。对于能够近乎实时地提醒和告知管理员有关异常情况的元素的需求,促生了入侵检测系统 (IDS)。在本文中,我们讨论了 IDS 的类型和模型:基于主机的入侵检测系统 (HBIDS)、基于网络的入侵检测系统 (NIDS) 以及混合 IDS 的新概念。还将讨论如何分析生成的数据以及如何创建签名(识别攻击的模式),以及一些 Linux 的 IDS 示例,例如开源 NIDS Snort。

什么是 IDS?

IDS 是一个尝试检测可能危及网络的奇怪数据包和行为的程序。第一个 IDS 是基于主机的 IDS,但真正占领市场的是 NIDS,即基于网络的 IDS。通常有一些软件或设备,称为传感器或代理,它有一个或两个网络接口(正如我们稍后将看到的,它可以完美地与一个网络接口一起工作),以混杂模式工作。换句话说,它将捕获到达接口的所有数据包,而不仅仅是那些具有特定目标 IP 地址的数据包。通过这种方式,IDS 可以分析所有穿过网络的数据包,检查它们是否包含,例如,任何可疑字符串,然后决定如何执行反应,例如与防火墙交互以创建阻止 IP 地址的新规则、向安全管理员发送寻呼机/电子邮件警报等等。关于 NIDS 的一个重要话题是将传感器部署在哪里,在防火墙内部还是外部。我想引用 SANS 的 GIAC 主管 Stephen Northcutt 的书 网络入侵检测:分析员手册 中关于此的有趣段落

防火墙之前的 IDS 是攻击检测,防火墙之后的 IDS 是入侵检测……在交换网络中,由于我们没有广播,因此我们在部署 NIDS 时有两个更好的选择,即使用集线器强制广播或在交换机中使用镜像端口。

哪里是最佳位置?我们可能会对此进行长时间的讨论,因为双方都有拥护者,但毫无疑问,所有人都同意最佳选择是在防火墙内部和外部都使用传感器。

IDS 模型

为了更好地理解 IDS,首先我们需要了解它的工作原理。基本上我们有两种 IDS 模型:误用或基于签名的模型和异常模型。

误用或基于签名的模型是最常用的 IDS 模型。签名是通过检查数据包中的各种选项(如源地址、目标地址、源端口和目标端口、标志、有效负载和其他选项)来识别攻击的模式。这些签名的集合构成一个知识库,IDS 使用该知识库来比较所有经过的数据包选项,并检查它们是否与已知模式匹配。稍后我们将讨论 Snort IDS 中的 Nimda 蠕虫签名示例。

异常模型试图通过分析网络中的异常行为来识别新的攻击。为了实现这一点,它首先必须“学习”网络中流量的工作方式,然后尝试识别不同的模式,然后向传感器或控制台发送某种警报。这种模型的缺点是您永远不会知道您的网络是否在 IDS 学习阶段产生了所有类型的行为,因此可能会导致大量的误报警报。

误报是 IDS 产生的虚假警报,用于通知攻击,但实际上它只是未配置的变量或应用程序向与通常端口不同的端口发送了一些数据包,而不是真正的后门,例如。为了解决这个问题,安全管理员必须观察 IDS 生成的警报一段时间,然后对其进行微调。

基于主机的入侵检测系统通常位于服务器中,并且仅检测与安装它的机器相关的事件。HBIDS 的主要目的是避免可能危及机器的更改并检测恶意查询。可以证明这种 IDS 重要性的更改示例包括网页篡改和安装在机器中以攻击其他机器的 rootkit。

Rootkit 是由黑客安装在受感染机器中的软件包,其中包含用于打开后门、擦除日志文件以隐藏其存在以及替换诸如 ps 和 netstat 之类的二进制文件,以及隐藏任何守护程序或开放端口的文件。

除此之外,HBIDS 还具有在攻击发生之前尝试检测攻击的功能,分析日志以指出异常行为,并检测端口扫描。

Tripwire

Tripwire 是 Linux 的 HBIDS 的一个例子 [有关 Tripwire 的开源替代方案,请参阅 Michael Rash 的 Paranoid Penguin,LJ 2002 年 2 月]。它可以被识别为 HBIDS,因为它填补了文件完整性检测工具的不足。使用 Tripwire,用户可以在配置文件中定义一组他或她希望保护免受更改的文件,然后 Tripwire 使用这些文件的校验和和属性。如果发生任何更改,它可以向系统管理员发送警报。默认配置文件提供了一个良好的起点,但用户还必须自定义它以减少误报的可能性。特别注意日志文件。将日志文件包含在您选择要检查的文件集中是没有意义的,因为您知道一旦发生任何事件(例如登录),它们就会增长。

Tripwire 可以与 cron 调度程序守护程序一起使用。在这种模式下,用户可以自动化该过程并定义他们想要运行它的任何位置。

PortSentry

PortSentry [另请参阅 Anthony Cinelli 在 LJ 网站上的“PortSentry”,/article/4751] 是 Psionic Software 的 Abacus 项目的一部分,其目标是“生成一套工具,为互联网社区提供基于主机的安全性和入侵检测,且免费”。它是一种重要的 HBIDS,因为它检测寻址到主机的包,并且可以与 TCP Wrappers 和 iptables 一起使用。这种类型的检测非常有用,因为端口扫描通常是攻击的先兆。PortSentry 可以检测 TCP 和 UDP 端口扫描,使您了解在扫描端口中运行服务的其他主机。下一步是验证是否有新的补丁或更新,甚至配置它以创建 ACL(访问控制列表)以阻止来自主机扫描程序的未来连接,使用 TCP Wrappers。它还可以在防火墙(即 iptables)中创建规则,以丢弃来自主机扫描程序的所有内容。以下是 Syslog 中的 PortSentry 警报示例

Dec 9 03:03:17 mobile portsentry[701]: attackalert:
  TCP SYN/Normal scan from host:
  200.185.61.132/200.185.61.132 to TCP port: 111
Dec 9 03:03:17 mobile portsentry[701]: attackalert:
  Host 200.185.61.132 has been blocked via wrappers
  with string: "ALL: 200.185.61.132"
Dec 9 03:03:18 mobile portsentry[701]: attackalert:
  Host 200.185.61.132 has been blocked via dropped
  route using command: "/sbin/iptables -I
  INPUT -s 200.185.61.132 -j DROP"
Swatch

Swatch 是一个日志监视器,它观察日志并就日志文件(即 /var/log/messages)中找到的预定义字符串向安全管理员发出警报。在下面的示例中,我创建了一个非常简单的 Swatch 配置文件,并选择定义字符串“snort”和“portsentry”,并在每次找到这些字符串时以不同的颜色(并发出哔哔声)将警报发送到屏幕

watchfor /snort/
echo red
bell
watchfor /portsentry/
echo blue
bell

我也可以要求 Swatch 在找到某些内容时发送电子邮件或执行命令。作为之前 Swatch 配置文件的结果,我收到了这些警报

Dec 9 03:22:53 flamengo snort[3268]: [1:1256:2]
  WEB-IIS CodeRed v2 root.exe access [Classification:
  Web Application Attack] [Priority: 1]:
  {TCP} 200.31.36.11:2153 -> 200.204.68.154:80
Dec 9 03:03:17 mobile portsentry[701]: attackalert:
  TCP SYN/Normal scan from host:
  200.185.61.132/200.185.61.132 to TCP port: 111
LIDS

LIDS 代表 Linux 入侵检测系统。它是一个旨在为 Linux 提供一些额外的安全功能的项目,以内核补丁的形式部署。在这些功能中,我们可以包括文件和进程保护以及端口扫描检测。前两个值得稍微解释一下。文件和进程保护甚至可以防止 root 超级用户更改。这非常有用,因为当黑客利用您系统中的漏洞(例如缓冲区溢出)时,该人将拥有 root 访问权限,允许他或她几乎做任何事情,例如安装 rootkit、更改日志、擦除您的 HTML 页面等。使用这些功能,您可以定义 ACL 以控制文件,并包含密码来访问/更改它们,从而避免未经授权的用户(甚至是 root 用户)进行更改。进程也是如此,因为它将保护您的系统免受更改的二进制文件/守护程序的影响。另一个优点是它在内核空间中提供了端口扫描检测器。

NIDS

网络入侵检测系统是负责检测与网络相关的攻击的 IDS 类型。一个有争议的点是应该将其部署在哪里。您可能会遇到网络拓扑,其中它位于防火墙之前,也可能发现它位于防火墙之后。正如我之前所说,两者都有充分的理由;这取决于您的需求。在这些示例中,我将使用开源 Snort。

Snort

Snort 由 Marty Roesch 创建,目前拥有 1,000 多个规则,用于检测诸如简单端口扫描甚至诸如 SSH CRC32 漏洞之类的新攻击 [请参阅 Nalneesh Guar 在 LJ 网站上的“Snort:为您的企业规划 IDS”,网址为 /article/4668]。Snort 的最大优势之一是它可以灵活地按需创建新规则。虽然对于某些 IDS 供应商,您必须等到他们发布新软件包,但您可以在攻击暴露后立即自定义和创建签名。一个很好的例子是 2001 年 12 月中旬的 wu-ftpd 漏洞。在漏洞发布后几个小时,Snort 过滤器就在安全邮件列表中发布了。Snort 还具有与防火墙交互的能力,即 Check Point FireWall-1,使用 OPSEC 功能或使用其他插件与 Linux 的 iptables 交互。除了 Snort 拥有大型签名数据库并且主要基于误用模型这一事实之外,它还提供了一个 beta 功能,将其引入异常模型。此功能称为 SPADE,对它收集的数据进行统计分析,并尝试找出普通行为是什么。与许多开源应用程序一样,Snort 有许多您可能想要一起使用的附加应用程序。

Silicon Defense 的一个不错的应用程序是 SnortSnarf,它基于 Snort 收集的数据创建 HTML 报告。

Snort 也可以在一个网络接口卡 (NIC) 的情况下完美运行。与需要两个 NIC 的其他 NIDS 不同,一个用于收集数据,另一个用于管理界面,Snort 可以使用一个处于混杂模式的 NIC 工作,也可以用于管理它,插入新规则或升级它。

混合 IDS

最近,另一种 IDS 概念正变得流行起来。它是混合入侵检测系统。NFR(Network Flight Recorder, Inc.)的创始人 Marcus Ranum 写道:“shim 型混合 IDS 是 HBIDS 和 NIDS 的优点和缺点的有趣结合。” 这意味着它具有 NIDS 的大多数功能,但基于每台主机。这有很多优点,因为它将尝试专门检测对主机的攻击,并且它将分析的流量将仅是具有主机目标 IP 地址的数据包。这种 IDS 的缺点是需要将其部署在每台主机中。

Prelude-IDS

Prelude 是混合 IDS 的一个例子。它分为两个不同的部分:传感器,称为 Prelude NID,负责数据包捕获和分析,以及报告服务器,传感器使用该服务器报告入侵尝试。Prelude 有一个值得评论的有趣功能:读取 Snort IDS 的规则的能力。换句话说,它有一个完整的规则集可供使用。从其网站来看,它还能够读取任何 NIDS 的规则。Prelude 的构建考虑了集群概念。这解释了将信息部署到称为报告服务器的不同机器的想法,该服务器的工作是将收到的所有信息转换为用户友好的格式,例如 HTML。

理解和创建签名

正如我们之前了解到的,签名是攻击模式。了解它们的工作原理非常重要,这样我们就可以按需或在新漏洞被发现时创建它们。在我们的示例中,我们将看到 Snort 如何处理其签名。在 2001 年下半年,我们观察到互联网上出现了新的和强大的蠕虫,例如红色代码、红色代码 II 和 Nimda。当这些攻击开始发生时,Linux 用户(我也是其中之一)感到非常幸运,因为蠕虫主要附着在 Microsoft 的 IIS(Internet 信息服务器)上。这些蠕虫有一些特定的模式,例如,尝试通过 Microsoft 的 IIS 访问 cmd.exe 文件。通过了解这一点,我们可以轻松地创建一个 Nimda Snort 规则,如“IDS 类型和模型”部分所述

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80
  (msg:"WEB-IIS cmd.exe access"; flags: A+;
  content:"cmd.exe"; nocase;
  classtype:web-application-attack; sid:1002; rev:2;)

好的,但这意味着什么?Snort 规则只不过是顺序参数,分为两部分,我们用它来告知 Snort 我们希望它注意什么。第一部分称为规则标头,包括第一个括号之前的所有内容。此标头中的第一个参数告诉 Snort 当数据包与此规则匹配时该怎么做——在本例中,“alert”表示 Snort 将生成警报,然后记录数据包。第二个参数告诉 Snort 我们想要的协议类型——在本例中,仅为 TCP。接下来的五个参数指示源 IP 地址和端口、数据包的方向、目标 IP 地址和端口。通过这种方式,我们知道来自我们网络外部的任何地址的数据包,具有任何源端口,去往我们内部网络中端口 80(通常 Web 服务器监听此端口)的 IP 地址的数据包将由规则的内部参数(称为规则选项)检查。规则选项部分包含警报消息以及有关将在数据包中检查哪些部分的信息,然后根据此检查的结果,将采取适当的操作。

我们示例中的规则选项

  • msg:“WEB-IIS cmd.exe 访问”——警报的描述。

  • flags:A+——逻辑运算符 (+) 用于测试数据包中的所有标志。

  • content:“cmd.exe”——在数据包有效负载中设置特定内容 (cmd.exe)。

  • nocase——将不区分大小写地匹配指定的字符串。

  • classtype:web-application-attack——警报的分类。

  • sid:1002——Snort 规则 ID。

  • rev:2——规则修订号。

Snort 用户手册 中,您可以找到 30 多个规则选项,您可以用来满足您的需求。太复杂了?不,不是!让我们尝试创建一个简单的规则来警告从您的网络进行的任何色情网站访问尝试,使用上面的几个规则选项

alert tcp $INTERNAL_NET any -> $EXTERNAL_NET  80
  (msg: "Web Porn Access Attempt"; content:"Free porn";
   nocase; flags:A+);
分析生成的数据

对诸如 portmap(端口 111)之类的服务进行的端口扫描,已知存在各种漏洞,PortSentry 会发出警报

Dec 9 03:03:17 flamengo portsentry[701]: attackalert:
  TCP SYN/Normal scan from host:
  200.185.61.132/200.185.61.132 to TCP port: 111

学习如何解释日志文件是入侵或安全分析师必须学习的最重要的事情之一,以便决定在给定情况下采取什么行动。上面 PortSentry 警报的摘录是从 syslog 文件中获得的。此警报声明在 12 月 9 日 03:03,名为 flamengo 的主机(已安装 PortSentry)检测到来自主机 IP 200.185.61.132 的 TCP 端口 111 中的 SYN 标志正常端口扫描,通常,端口 111 运行服务 portmap。

结论

防火墙是网络中的主要安全元素,但它不会检测已经打开的服务上的攻击,例如对您的 DNS 或 Web 服务器的攻击。IDS 本身不能解决您作为安全元素的所有问题,但如果您根据自己的需要对其进行自定义,它肯定会帮助您警告您主机或网络的异常行为和未经授权的尝试。有了这些信息,您应该联系入侵 IP 所在的网络的管理员,然后告知他们正在发生的事情。与安全社区保持联系也是了解最新攻击和检测它们的签名的最佳方式。注意——安装 IDS!

资源

Understanding IDS for Linux
电子邮件:pbueno@opencs.com.brbueno@ieee.org

Pedro Bueno (bueno@ieee.org) 是 Lucent Technologies 的前数据工程师,目前是 Open Communications Security 的安全工程师。他还作为志愿者在 Best Linux 做出贡献,除了足球之外,他最喜欢的爱好是分析 Snort 生成的警报。

加载 Disqus 评论