我们的 Linux 系统运行logwatch(8)默认情况下,Logwatch 实用程序。在 RedHat/CentOS/SL 系统上,Logwatch 由 cronjob 调用/etc/cron.daily/
,然后发送包含结果的每日电子邮件。这些电子邮件的主题如下:
Subject: Logwatch for $HOSTNAME
问题是,默认情况下,这些每日电子邮件太嘈杂,包含大量多余的信息(HTTP 错误、每日磁盘使用情况等),而这些信息已经被其他服务(Nagios、Cacti、中央系统日志等)监控。对于 100 个系统来说,电子邮件负载是无法承受的。人们忽略了这些电子邮件,这意味着我们可能会错过 logwatch 发现的问题。
如何减少 logwatch 产生的噪音量,但仍使用 logwatch 通知我们重大问题?
我会在下面发布我自己的答案,但我想看看其他人做了什么。
笔记:我有一个关于 FreeBSD 的类似问题,网址为FreeBSD:period(8) 噪音太大。如何控制噪音水平?
答案1
总体而言,Logwatch 的现有文档缺乏足够的解释,而且通常过于模糊。我拼凑了一些有用的例子,并将 Logwatch 噪音减少了 95% 以上。
以下是我发现的。
请记住,您可以在 找到一些 Logwatch 文档/usr/share/doc/logwatch-*/HOWTO-Customize-LogWatch
,其中包含一些有用的示例。
在 RHEL/CentOS/SL 上,默认的 logwatch 配置位于
/usr/share/logwatch/default.conf/logwatch.conf
可以通过将本地配置放在 下来覆盖这些设置
/etc/logwatch/conf/logwatch.conf
。将以下内容放在该文件中以告诉 logwatch 完全忽略“httpd”等服务和每日磁盘使用情况检查:# Don't spam about the following Services Service = "-http" Service = "-zz-disk_space"
有时我不想完全禁用特定服务的 logwatch,我只想微调结果以减少噪音。
/usr/share/logwatch/default.conf/services/*.conf
包含服务的默认配置。可以通过将本地配置放在 下覆盖这些参数/etc/logwatch/conf/services/$SERVICE.conf
。不幸的是,logwatch 在这里的能力有限,而且许多 logwatch 可执行文件都充满了未记录的 Perl。您可以选择用其他东西替换可执行文件,或者尝试使用 覆盖某些设置/etc/logwatch/conf/services
。例如,我有一个安全扫描器,它在整个网络上运行扫描。在测试运行时,安全扫描器会在应用程序日志中生成许多错误消息。我希望 logwatch 忽略来自我的安全扫描器的错误,但仍会通知我来自其他主机的攻击。有关这方面的更多详细信息,请访问Logwatch:忽略 SSH 和 PAM 检查的某些 IP?。为此,我将以下内容放在
/etc/logwatch/conf/services/sshd.conf
:# Ignore these hosts *Remove = 192.168.100.1 *Remove = X.Y.123.123 # Ignore these usernames *Remove = testuser # Ignore other noise. Note that we need to escape the () *Remove = "pam_succeed_if\(sshd:auth\): error retrieving information about user netscan.*
“
logwatch 还允许您通过在 中放置正则表达式来从 logwatch 电子邮件中删除输出
/etc/logwatch/conf/ignore.conf
。HOWTO-Customize-LogWatch 说:ignore.conf:此文件指定正则表达式,当与 logwatch 的输出匹配时,将抑制匹配的行,无论正在执行哪个服务。
然而,我在这方面运气不佳。我的要求需要一个条件语句,类似于“如果我的安全扫描仪发出安全警告,则不要打印输出。但如果我的安全扫描仪发出安全警告和来自一些坏人,然后打印有用的部分 - 标题显示“来自的登录失败:”,坏主机的IP,但不是扫描仪的IP。'
从源头上解决它(如@user48838 所建议的那样)。这些消息是由某个应用程序生成的,然后 Logwatch 会愉快地将结果发送给您。在这些情况下,您可以修改应用程序以减少日志记录。
这并不总是可取的,因为有时您希望将完整的日志发送到某个地方(中央系统日志服务器、中央 IDS 服务器、Splunk、Nagios 等),但您不希望 logwatch 每天从每个服务器向您发送有关此事的电子邮件。
答案2
是的 - logwatch 通常太吵了。您已经提到完全禁用检查。
如果您不想这样做,您必须阻止某些事件的发生。例如 - 如果 nagios 通过 ssh 连接到 DMZ 系统,则没有什么意义。但如果有其他用户通过 ssh 登录,则很有趣。
我们使用 rsyslog 而不是 ksyslogd(首先安装 rsyslog,然后删除 ksyslogd)。使用 rsyslog,您可以微调哪些内容进入日志,哪些不进入日志(例如,构建一个表达式,删除来自 sshd 的消息,其中包含“nagios 已连接”)。这样,logwatch 将只报告有用的信息。
另一种情况可能是 xinetd - 我不想收到有关成功连接的信息 - 这可以在 xinetd 本身中进行配置 - 而无需禁用 xinetd 的 logwatch-check。
答案3
出于兴趣,我按照选项 2 的答案斯蒂芬·拉谢夫斯基但就我的目的而言,我只想包含特定的线条,而不是排除所有我不想要的噪音。
我正在配置 vsftpd,因此我创建了它/etc/logwatch/conf/services/vsftpd.conf
,而不是使用类似*Remove = testuser
删除包含文本的行的东西testuser
,我使用了*OnlyContains = "testuser"
仅返回包含该文本的行的行。
这两个脚本的基本工作原理是使用grep
和grep -v
。
不同之处在于,你可以使用*Remove
任意多次,但*OnlyContains
如果你想要某样东西或其他东西,你必须使用一次。因此,对于多个值,你可以这样做*OnlyContains = "testuser|testuser2|testuser3"
答案4
我最近需要让 sshd 服务的输出安静下来。有些部分相当长,无法通过设置详细程度来控制。
这不是一个理想的解决方案,但我最终覆盖了 sshd脚本从这里复制/usr/share/logwatch/scripts/services/sshd
到这里:/etc/logwatch/scripts/services/sshd
当然,您现在必须随时关注该脚本文件的任何更新,但它确实可以让您非常精细地控制输出内容。或者,我想您可以通过类似或的logwatch
工具将输出传输出去,以删除您不想要的内容,但这对我来说似乎更难。awk
sed