swatch:为警惕但又有点懒惰的人设计的自动化日志监控

作者:Mick Bauer

此前,“多疑的企鹅”思考过大量强大的程序,旨在保护人们的个人电脑免受有害之徒的侵害。[过度使用头韵的权利可随时撤销——编者注。] 这些工具的一个重要共同特点是日志记录;与阻止系统入侵者进入同等重要的是,了解他们何时尝试入侵。但是,谁有时间和精力每天在他们管理的每个系统上,筛选大量大多无害的日志文件呢?

swatch(“简单监视器”)可以做到。swatch 完全用 Perl 编写,它会监控正在写入的日志,并在发现您告知它要查找的内容时采取行动。对于任何具有健康恐惧感的系统管理员来说,这个简单、灵活且有用的工具都是必备的。

安装 swatch

安装 swatch 有两种方法。首先,当然是通过您的 Linux 发行版提供的任何 swatch 二进制软件包(如果有的话)。Mandrake 的当前版本有一个 swatch 的 RPM 包,但其他更流行的发行版(即 Red Hat、SuSE、Slackware 或 Debian)似乎都没有包含它。

不过,这也没关系,因为安装 swatch 的第二种方法非常有趣。swatch 的源代码发行版(可从 www.stanford.edu/~atkins/swatch 获取)包含一个名为 Makefile.PL 的复杂脚本。该脚本会自动检查所有必要的 Perl 模块,并使用 Perl 5 的 CPAN 功能下载并安装任何需要的模块;然后它会生成一个可以用来构建 swatch 的 Makefile。

在您安装了必需的模块之后,无论是通过 swatch 的 Makefile.PL 脚本自动安装还是手动安装(然后运行 perl Makefile.PL),Makefile.PL 都应返回以下内容

[root@barrelofun swatch-3.0.1]# perl Makefile.PL
Checking for Time::HiRes 1.12 ... ok
Checking for Date::Calc ... ok
Checking for Date::Format ... ok
Checking for File::Tail ... ok
Checking if your kit is complete...
Looks good
Writing Makefile for swatch
[root@barrelofun swatch-3.0.1]#

一旦 Makefile.PL 成功为 swatch 创建了 Makefile,您就可以执行以下命令来构建和安装它

make
make test
make install
make realclean
make test 命令是可选的,但很有用;它确保 swatch 可以正确使用我们费力安装的 Perl 模块。
swatch 简要配置

由于 swatch 的全部意义在于简化我们的生活,因此配置 swatch 本身也很简单。swatch 由单个文件控制,默认为 $HOME/.swatchrc。此文件包含您希望 swatch 监视的正则表达式形式的文本模式。每个正则表达式后跟您希望 swatch 在遇到该文本时采取的操作。

例如,假设您有一个 Web 服务器,并且您希望在有人尝试通过请求极长的文件名来进行缓冲区溢出攻击时收到警报。通过您自己针对 Web 服务器尝试此操作,同时 tailing 其 /var/apache/error.log,您知道 Apache 将记录一个包含字符串“File name too long”的条目。进一步假设您希望每次发生这种情况时都收到电子邮件。以下是您需要在 .swatchrc 文件中包含的内容

watchfor /File name too long/
    mail addresses=mick\@visi.com,
    subject=BufferOverflow_attempt

如您所见,该条目以“watchfor”语句开头,后跟一个正则表达式。如果您还不精通正则表达式的使用(您计划学习正则表达式,不是吗?),请不要担心:这可以像您要 swatch 查找的文本片段一样简单,在两个斜杠之间逐字拼写出来即可。

swatch 匹配您的正则表达式时,它将执行您选择的多种操作。在本例中,我们告诉 swatch 向 mick\@visi.com 发送电子邮件,主题为 BufferOverflow_attempt。请注意 @ 符号之前的反斜杠;如果没有它,Perl 会将 @ 符号解释为特殊字符。另请注意,如果您希望主题行中包含空格,则每个空格也需要用反斜杠转义,例如 subject=Buffer\ Overflow\ attempt。表 1 中列出了除发送电子邮件之外的其他操作。

表 1. swatch 可以执行的一些操作

有关配置这些操作以及 swatch 支持的其他操作的更多详细信息,请参阅 swatch(1) 手册页。

让我们将我们的示例更进一步。假设,除了收到有关缓冲区溢出尝试的电子邮件外,您还想知道何时有人访问某个网页,但前提是您当时已登录到控制台。在同一个 .swatchrc 文件中,您可以添加类似这样的内容

watchfor /wuzza.html/
      echo=red bell 2

然后,该事件将导致蜂鸣声并在控制台上打印。

重要的是要注意,您只有在与启动 swatch 的同一 shell 会话中登录控制台时,才会看到这些消息并听到这些蜂鸣声。如果您注销去吃三明治,当您返回并重新登录时,您将不再看到旧会话中启动的 swatch 进程生成的消息,即使这些进程仍在运行。

如有疑问,请添加“mail”操作或其他非控制台特定的操作,例如,触发分页脚本的“exec”操作。除非,所讨论的模式并不关键。

细心的读者无疑已经注意到,前一个示例中的场景仅适用于错误消息和访问消息都记录到同一文件中的 Apache 安装。我们尚未将不同的表达式与不同的监视文件关联,我们也无法这样做。但是,如果您希望 swatch 监视多个日志文件怎么办?

没问题。虽然每个 .swatchrc 文件可能只描述一个监视文件,但没有什么能阻止您运行多个 swatch 实例,每个实例都有自己的 .swatchrc 文件。换句话说,.swatchrc 是默认名称,但不是 swatch 配置的必需名称。

因此,要将两个示例拆分为两个文件,您需要将先前简单的 .swatchrc 条目中的行放入名为 .swatchrc.hterror 的文件中,并将先前 watchfor 条目中的行放入名为 .swatchrc.htaccess 的文件中。

高级 swatch 配置

到目前为止,我们只考虑了我们希望在每次匹配给定模式时触发的操作。但是,我们可以通过多种方式更精细地控制 swatch 的行为。

第一个也是最明显的方法是利用搜索模式采用正则表达式形式这一事实。正则表达式实际上构成了一种独立的文本格式语言,功能非常强大,并且是 Perl、sedvi 和许多其他 UNIX 实用程序可以执行的大量魔法的原因。

您有必要至少了解一些“regex”技巧,我将在此处介绍。技巧一称为交替,它以“|”符号的形式向您的正则表达式添加“逻辑或”。考虑以下正则表达式

/reject|failed/

此表达式将匹配任何包含单词“reject”或单词“failed”的行。当您希望 swatch 对多个模式执行相同的操作时,请使用交替。

技巧二是 Perl 特有的正则表达式修饰符“不区分大小写”,也称为“斜杠-i”,因为它总是跟在正则表达式的尾部斜杠之后。正则表达式 /reject/i 匹配任何包含单词“reject”的行,无论它是拼写为“Reject”、“REJECT”、“rEjEcT”等。诚然,这远不如交替有用,并且为了充分公开,我不得不提到斜杠-i 是 CPU 密集型 Perl 修饰符之一。但是,如果您尽了最大的努力进行日志尾部、自我攻击等,但仍不能 100% 确定令人担忧的攻击在日志文件中可能是什么样子,斜杠-i 可以帮助您做出合理的猜测。

如果您希望成为正则表达式的魔法师,我推荐 Jeffrey E. F. Friedl 撰写的 精通正则表达式 一书。有关详细信息,请参阅“资源”。

控制 swatch 的另一种更高级的方法是指定给定操作可以在一天中的哪个时间执行。您可以通过在任何操作后添加“when=”选项来执行此操作。例如,下面我有一个 .swatchrc 条目,用于一个中等重要性的事件,我希望在工作日通过控制台消息了解,但在周末我需要电子邮件消息来了解它。为此,我设置了 when 选项

/file system full/
      echo=red
      mail addresses=mick\@visi.com,
      subject=Volume_Full,when=7-1:1-24

when= 选项的语法是 when=range_of_days:range_of_hours。因此,我们看到,任何时候记录“file system full”消息时,swatch 都会以红色墨水将日志条目回显到控制台。它还将发送电子邮件,但仅当是星期六(“7”)或星期日(“1”)时。

运行 swatch

swatch 希望 .swatchrc 位于调用 swatch 的用户的主目录中。swatch 默认情况下也将其临时文件保存在那里(每次调用时,它都会创建一个名为“watcher process”的脚本并运行,其名称以点号后跟创建它的 swatch 进程的 PID 结尾)。

-c 配置文件路径 和 --script-dir=路径 标志允许您分别指定 swatch 的配置文件和脚本文件的备用位置。但是,永远不要将它们保存在世界可写目录中。实际上,只有这些文件的所有者甚至应该能够读取它们。

例如,要调用 swatch 以使其读取我在 /var/log 中的自定义配置文件,并也使用该目录作为其 watcher 进程脚本,我将使用以下命令

swatch -c /var/log/.swatchrc.access --script-dir=/var/log &

我还需告知 swatch 要 tail 的文件,为此我需要 -t 文件名 标志。如果我想使用上述命令让 swatch 监视 /var/log/apache/access_log,它将如下所示

swatch -c /var/log/.swatchrc.access --script-dir=/var/log \
       -t /var/log/apache/access_log &
swatch 通常不会很好地清理自身;它往往会留下 watcher 进程脚本。请注意并定期删除您主目录或您倾向于使用 --script-dir 指定的脚本目录中的这些脚本。

同样,如果您希望 swatch 监视多个文件,则需要多次运行 swatch,每次至少指定不同的 tailing-target(-t 值),并且可能还需要为每个文件使用不同的配置文件。

微调 swatch(双向微调!)

一旦 swatch 配置并运行,我们必须将注意力转向“刚刚好”的目标:我们希望 swatch 的运行既不太热(就例行事件或琐碎事件向我们发出警报),也不太冷(从不就任何事情向我们发出警报)。但什么是“刚刚好”呢?对于这个问题,有多少种 UNIX 用途,就有多少种不同的答案。

无论如何,您不需要我告诉您什么是令人讨厌的报告级别:如果它发生,您就会知道。您甚至可能会在响应最初发出警报但最终证明是无害的事件时经历一两次惊吓。阅读手册,调整 .swatch.rc 并坚持下去。

另一种情况,即监视的内容太少,更难解决,尤其是对于初级系统管理员而言。根据定义,异常事件不会太频繁地发生,那么您如何预测它们将在日志中如何体现出来呢?我的第一个建议是养成经常浏览系统日志的习惯,以便了解系统的日常运行情况。

更好的是,tail 实时日志。如果您输入命令

tail -f /var/log/messages

将打印系统日志的最后 50 行,以及所有后续行,直到您使用 Ctrl-C 终止 tail。这适用于任何文件,甚至是一个快速变化的日志文件。

您可以做的另一件好事是在一个虚拟控制台或 xterm 中“攻击”您的系统,同时在另一个虚拟控制台或 xterm 中 tailing 各种日志文件。我们上个月和上个月探讨的工具,分别是 Nessusnmap,非常适合此目的。

到现在您可能在想,“嘿,我以为我安装 swatch 的全部原因是为了不必手动查看日志文件!” 不,swatch 只是最大限度地减少,但并未消除我们需要解析日志文件的需求。

您在拥有第一个袖珍计算器后就能够停止使用您的算术技能了吗?没有。就此而言,除非您已经知道如何加法、乘法等,否则您一开始就可以使用计算器吗?绝对不能。日志文件解析也是如此:您无法告诉 swatch 查找您自己无法识别的事物,就像您无法询问到一个您忘记了名字的城镇的路线一样。

为什么您不应该配置一次 swatch 就将其遗忘

同样地,我敦促您不要对 swatch 的沉默感到沾沾自喜。如果 swatch 的操作不经常触发,则可能是您的系统没有经常被探测或滥用,但至少同样有可能的是 swatch 的网撒得不够广。继续不时手动扫描您的日志,看看您是否遗漏了任何内容,并继续调整 .swatchrc。

并且不要忘记定期重新考虑最初生成日志消息的守护程序的审计/日志记录配置。swatch 不会捕获根本未记录的事件。有关管理 syslog 守护程序的常规说明,请参阅 syslogd(8) 手册页,有关更改其记录事件方式的具体说明,请参阅记录到 syslog 的各种事物的手册页。

资源

我们应该让 Perl 下载并安装自己的模块吗?

swatch: Automated Log Monitoring for the Vigilant but Lazy
Mick Bauer (mick@visi.com) 是双子城地区的网络安全顾问。自 1995 年以来,他一直是 Linux 的忠实拥护者,自 1997 年以来,他一直是 OpenBSD 的狂热爱好者,特别喜欢让这些尖端的操作系统在过时的垃圾上运行。Mick 欢迎问题、评论和问候。
加载 Disqus 评论