隐蔽嗅探、入侵检测和日志记录
在关于 syslog 的专栏文章中 [参见《LJ》2001 年 12 月刊的“syslog 配置”],我提到了“隐蔽日志记录”——通过在没有 IP 地址的情况下运行中央日志服务器,您可以向入侵者隐藏您的中央日志服务器。但是,日志服务器并不是唯一可以从一点隐蔽性中受益的系统类型。网络嗅探器和网络入侵检测系统 (NIDS) 探针也可以在没有 IP 地址的情况下完美运行,这使得它们比它们保护的系统更不易受到网络攻击。
本月,我将演示在没有 IP 地址的网络接口上,使用功能多样且强大的 Snort 作为隐蔽嗅探器、隐蔽 NIDS 探针和隐蔽日志记录器的三种方法。如果您已经熟悉 Snort,我希望您能看到它如何轻松地用于隐蔽目的。如果您是 Snort 的新手,本文可能对您来说是一个有用的速成课程。本文中的所有 Snort 命令和配置在有 IP 地址和没有 IP 地址的接口上都同样有效。
运行连接到互联网的计算机是有风险的。任何时候您提供服务,都有可能发生恶意用户通过应用程序漏洞劫持系统,或者仅仅通过拒绝服务攻击使系统不堪重负,这种攻击会向您的系统发送超出其处理能力的流量。对于 Web 服务器、FTP 服务器和其他最终用户与之交互的系统,这种风险永远无法消除——只能最大限度地降低或控制。
然而,网络探针和日志服务器是独一无二的,因为它们的角色从根本上是被动的;它们接收数据,但不需要发送任何数据。利用它们的被动性,使它们无法从它们保护的网络访问,这是非常有意义的。
其权衡是,没有 IP 地址的系统只能从控制台进行管理,或者必须具有另一个带有 IP 地址的网络接口。如果一个系统有多个接口,则有两个预防措施至关重要。首先,必须禁用 IP 转发,其次,带有 IP 地址的接口必须连接到与嗅探/日志记录接口不同的网络。例如,它可以连接到仅由 NIDS 探针、日志记录器和管理工作站组成的专用“管理”网络。
物理安装网卡 (NIC) 非常容易。只要您的内核支持您的 NIC,Linux 应该会自动检测到 NIC 并加载相应的内核模块。
然而,不同的发行版以不同的方式处理 NIC 初始化。例如,在向我的 Red Hat 隐蔽嗅探器添加第二个 NIC 后,我必须创建一个新文件 /etc/sysconfig/network-scripts/ifcfg-eth1,其内容如下
DEVICE=eth1 USERCTL=no ONBOOT=yes BOOTPROTO= BROADCAST= NETWORK= NETMASK= IPADDR=
虽然 Red Hat 的 Kudzu 工具自动检测到了新接口,但当我拒绝提供 IP 地址时,其网络配置脚本返回了一个错误。通过创建我自己的 /etc/sysconfig/network-scripts/ifcfg-eth1 文件,我让 Red Hat 激活了新接口,而实际上没有给它分配 IP 地址。在不同的发行版上,可能需要其他步骤。
一旦您安装并激活了您的隐蔽 NIC,并将其连接到您希望监控的网络,就可以尝试一些隐蔽嗅探了。在本文的其余部分,我将假设您已经安装了 Snort。大多数 Linux 发行版都包含自己的 Snort 软件包,最新版本可在 www.snort.org 上获得。如果您要将 Snort 用作 NIDS,那么运行最新版本的 Snort 尤其重要。
“嗅探器模式”的 Snort 命令很简单
snort -dvi eth1
-d 选项告诉 Snort 解码应用程序数据。-v 选项告诉它将数据包打印到控制台,-i 选项让您指定要嗅探的接口。要告诉 Snort 跳过十六进制数据并仅显示 ASCII,请使用 -C 选项(列表 1)。
Snort 的嗅探功能在没有 IP 地址的接口上也能完美运行。
入侵检测是一个很大的主题,Snort 的入侵检测能力是多样且强大的。那么,在我们进一步深入之前,我想强调的是,我只是触及了表面:使用接近默认配置文件的 Snort,仅使用包含的规则,不是将 Snort 用作 NIDS 的最有效方法。我在这里描述这种方法是因为它是一种简单而快速的 NIDS 入门方法。
要开始在 NIDS 模式下使用 Snort,您需要做的就是编辑文件 /etc/snort/snort.conf 并在守护进程模式下启动 Snort。然后,随着新的攻击特征码的出现,定期更新 snort.conf 中引用的 Snort 规则。让我们简要讨论一下这些步骤中的每一个步骤。
虽然您可以使用 Snort 的 -c 启动选项指定任何您喜欢的配置文件,但大多数人使用 /etc/snort/snort.conf。在本文的其余部分,我将假设这也是您的选择。列表 2 显示了一个截断但语法完整的 Snort 配置文件。
正如您所看到的,Snort 配置由全局选项、变量声明、“预处理器”语句、“输出”语句和 Snort 规则组成。全局选项(“config”语句)提供了一种方便的方式来设置大多数也可以通过启动标志传递给 Snort 的选项,这节省了打字时间。
变量被 Snort 规则使用,以使攻击检测更准确。例如,通过使用 DNS_SERVERS 变量指定本地名称服务器的 IP 地址,Snort 将忽略您的 DNS 服务器发送的某些类型的数据包,这些数据包在其他情况下可能看起来像攻击。
预处理器语句用于配置预处理器模块,预处理器模块是 Snort 组件,它们在将数据包与规则匹配之前对数据包进行操作或更改。例如,预处理器 frag2 重新组装分片的数据包,并且它还监视基于 IP 分片的攻击和其他与分片相关的异常。
输出语句配置后处理器模块,后处理器模块提供不同的方法来记录或以其他方式存档 Snort 警报和观察到的数据包。例如,数据库后处理器可用于将数据包记录到 MySQL 数据库中,以便以后通过 ACID 等工具进行关联和分析 (www.andrew.cmu.edu/~rdanyliw/snort/snortacid.html)。
最后,规则可以直接列出,如列表 2 的“Cisco Catalyst 远程访问”警报所示,也可以在包含的文本文件中列出,如列表 2 的其余部分所示。后一种方法可以轻松使用 Snort 团队在 www.snort.org/dl/signatures/snortrules.tar.gz 维护的规则文件(每 30 分钟更新一次!)或 ArachNID 规则,网址为 www.whitehats.com/ids。
要使用此配置文件在 NIDS 模式下启动 Snort,请执行以下命令
snort -c /etc/snort/snort.conf -D -i eth1
请记住,在之前的示例中,我们将 eth1 设置为我们的隐蔽接口。
默认情况下,Snort 会将警报记录到 /var/log/snort/alert,并将端口扫描活动记录到 /var/log/snort/portscan.log。警报中引用的数据包将被记录到 /var/log/snort 的子目录中,如列表 3 中所述。
专用 NIDS 探针需要在其启动例程中启动 Snort。官方 Snort RPM 会自动安装启动脚本 /etc/init.d/snortd。一旦您将 Snort 配置为满意,请使用 chkconfig 命令为所需的运行级别激活此脚本。如果您从源代码安装了 Snort,则可能需要编写自己的启动脚本。
在 NIDS 模式下运行 Snort 值得单独写一篇文章,甚至整个系列文章,但这足以说明 Snort 可以与非 IP 地址接口一起使用,并展示如何开始使用 NIDS 模式。
现在是时候将前两种技术结合到第三种技术中了:隐蔽日志记录。通常,中央日志服务器运行 syslog 或 syslog-ng。实际上,可以使用 Snort 通过非 IP 地址接口捕获日志数据包,并将它们传递给 syslog 或 syslog-ng。但是,让 Snort 自己将数据包写入日志文件要简单得多。我即将描述的方法使用 Snort、tail 和 awk 而不是传统的日志记录器(在中央日志服务器上,即;在发送日志的主机上,您仍然需要配置 syslog 或 syslog-ng,如下所述)。
假设您有一个 LAN 网段,其中有几台服务器,您希望将其日志消息发送到单个日志服务器。进一步假设您对这些日志消息的机密性远不如对其完整性那么关心。您不在乎是否有人窃听消息,但您不希望消息一旦被中央日志服务器接收就被篡改。因此,您的日志服务器通过非 IP 地址接口连接到 LAN,并将嗅探发送到 LAN 上虚假 IP 地址的日志数据包。
在您希望从中发送日志的每台服务器上,您都需要做两件事。第一步是配置每个发送者的系统日志记录器以将其消息发送到虚假 IP。所谓“虚假”,我只是指没有主机实际拥有该 IP 地址;它必须对所讨论的 LAN 有效。假设我们的示例 LAN 的网络地址是 192.168.1.0/24,我们的虚假日志记录器主机地址是 192.168.1.111。LAN 上使用标准 syslog 的服务器都需要在 /etc/syslog.conf 中添加如下行
*.info @192.168.1.111
在使用 syslog-ng 的服务器上,您需要在 /etc/syslog-ng/syslog-ng.conf 中添加几行,如下所示
destination d_loghost { udp(ip(192.168.1.111) port(514)); }; filter f_info { level(info); }; log { filter(f_info); destination(d_loghost); };在任何一种情况下,您都可能希望指定与简单地说“所有严重性为 'info' 或更高的消息”不同的标准,如以上两个示例所示。
除了其日志记录器配置文件中的适当行之外,每个日志发送器还需要一个针对虚假 IP 地址的静态 ARP 条目。如果您的 LAN 由集线器或一系列“级联”集线器组成,则此 ARP 地址也可以是虚假的。如果您的 LAN 是交换式的,您则需要指定日志服务器的真实 MAC 地址(硬件地址)。在我们的示例日志发送服务器上添加静态 ARP 条目的命令是
arp -s 192.168.1.111 00:04:C2:56:54:58
其中 192.168.1.111 是我们的虚假日志主机 IP,00:04:C2:56:54:58 是虚假 MAC 地址或我们的隐蔽日志记录器的非 IP 地址接口的真实 MAC 地址。
现在,我们受保护 LAN 上的每台服务器都配置为将其日志发送到 192.168.1.111,并且在交换式 LAN 的情况下,它们将被发送到隐蔽日志记录器的交换机端口。现在我们只需要配置隐蔽日志记录器本身。
与入侵检测模式一样,我们可以通过仅编辑一个文件 /etc/snort/snort.conf 将 Snort 配置为隐蔽日志记录器。列表 3 显示了我的 Red Hat 隐蔽日志记录器的 snort.conf 文件。让我们剖析一下。
列表 3. 隐蔽日志记录器的 /etc/snort/snort.conf
首先,我们有一个变量声明:EXTERNAL_NET any。我们为 NIDS 模式设置的其他变量在这里都不必要。接下来,我们有一些 config 语句:dump_payload 等同于命令行选项 -d;dump_chars_only 等同于 -C;logdir 指定 Snort 日志的根目录(并且等同于 -l)。
继续列表 3,我们接下来看到一个预处理器语句:我们正在使用默认设置调用 frag2 预处理器。大型日志数据包可能会被分片,如果是这样,frag2 将为我们重新组装它们。
最后,是关键部分:一个自定义 Snort 规则。编写 Snort 规则并不比编写 iptables 或 ipchains 规则复杂,只需要基本了解 TCP/IP 协议和应用程序的行为即可。www.snort.org/docs/writing_rules 上的“Snort 用户手册”对此进行了清晰而全面的文档说明。让我们逐步了解列表 3 中的 Snort 规则
log udp 192.168.1.20/32 any -> 192.168.1.111/32 514 (logto: "logged-packets";)
该规则以规则操作 log 开始。在本例中,我们将 Snort 用作数据包日志记录器。因此,我们不想向 /var/log/snort/alert 写入消息,而是希望 Snort 记录任何与规则匹配的数据包,而不写入警报。
接下来是规则的匹配协议 udp。syslog 消息通常通过 UDP 发送。
规则的协议之后是其源 IP,以 CIDR 表示法表示。192.168.1.20 是发送日志数据包的主机的 IP 地址,因此我们希望匹配该主机发送的数据包。/32 是 CIDR 简写,表示“解析所有 32 个地址位”,这表明这是一个单个主机地址,而不是地址范围。要匹配来自示例 LAN 上所有主机的数据包,我们可以改为指定源 IP 为 192.168.1.0/24。
源端口在源 IP 之后,在本例中为“any”源端口。“Any”是 Snort 规则中常用的源端口指示符,因为除了少数例外,TCP/IP 客户端应用程序从任意高编号端口发送数据包。规则的中间是其方向运算符 (->),它表示其左侧的 IP 和端口与数据包的源相关,而右侧的 IP 和端口与其目标相关。另一个允许的方向运算符是 <>,它表示源和目标 IP/端口对是可互换的。换句话说,Snort 应该匹配在指定 IP 地址之间的指定端口上沿任一方向传输的数据包。
在方向运算符的右侧是规则的目标 IP 和目标端口指示符,分别为 192.168.1.111/32 和 514。192.168.1.111 是我们的服务器记录到的虚假 IP 地址,在 UDP 端口 514 上。
最后,规则的选项列在括号之间,如果有多个选项,则用分号分隔。在本例中只有一个选项,logto:“logged-packets”。logto 选项允许我们指定一个日志文件,用于写入匹配的数据包,在本例中为 /var/log/snort/logged-packets(之前我们将配置选项 logdir 设置为 /var/log/snort)。
如果没有 logto: 选项,Snort 会将数据包记录在根日志目录的新子目录中,每个匹配的源 IP 地址一个子目录。但是,对于隐蔽日志记录器的目的而言,最好使用 logto: 选项来指定一个单个日志文件,用于记录每个规则的匹配数据包。这允许您按规则而不是按事务对数据包进行分组。
哎呀,解释这个单一规则比解释我们隐蔽日志记录器的 snort.conf 文件的其余部分花费的时间更长。但规则是重要部分。如果您有其他服务器发送日志消息,您可能需要为每个服务器设置单独的规则,以便将其消息记录到单独的文件中。
Snort 是一款功能多样且强大的工具,用于嗅探、入侵检测和数据包日志记录。将其配置为在嗅探模式或 NIDS 模式下隐蔽运行很容易;将其融入隐蔽日志记录解决方案中只是稍微难一点。祝您在日志记录和 NIDS 方面取得成功,无论是否隐蔽!
Mick Bauer (mick@visi.com) 是 Upstream Solutions, Inc. 的网络安全顾问,该公司总部位于明尼苏达州明尼阿波利斯。他是即将出版的 O'Reilly 图书《使用 Linux 构建安全服务器》的作者、“网络工程波尔卡舞曲”的作曲者,以及一位自豪的家长(育有子女)。