如何在 cron 日志中禁用 crontab 列表条目?

如何在 cron 日志中禁用 crontab 列表条目?

我在服务器上有一个脚本,每隔几分钟运行一次,除其他功能外,它还会检查是否有恶意 crontab 条目被注入。为了做到这一点,我检查了所有用户的 crontab,这很有效,但我的/var/log/cron文件里充满了所有 crontab 列表的条目,因此每次我运行该脚本时,它都会记录所有 crontab 列表,如下所示:

Nov 30 17:16:02 myserv crontab[348610]: (root) LIST (root)
Nov 30 17:16:02 myserv crontab[348611]: (root) LIST (bin)
Nov 30 17:16:02 myserv crontab[348612]: (root) LIST (daemon)
Nov 30 17:16:02 myserv crontab[348613]: (root) LIST (adm)
Nov 30 17:16:02 myserv crontab[348614]: (root) LIST (lp)
Nov 30 17:16:02 myserv crontab[348615]: (root) LIST (sync)
Nov 30 17:16:02 myserv crontab[348616]: (root) LIST (shutdown)
Nov 30 17:16:02 myserv crontab[348617]: (root) LIST (halt)
Nov 30 17:16:02 myserv crontab[348618]: (root) LIST (mail)
Nov 30 17:16:02 myserv crontab[348619]: (root) LIST (operator)
Nov 30 17:16:02 myserv crontab[348620]: (root) LIST (games)
Nov 30 17:16:02 myserv crontab[348621]: (root) LIST (ftp)
Nov 30 17:16:02 myserv crontab[348622]: (root) LIST (smb)
Nov 30 17:16:02 myserv crontab[348623]: (root) LIST (named)
Nov 30 17:16:02 myserv crontab[348624]: (root) LIST (postgres)
Nov 30 17:16:02 myserv crontab[348625]: (root) LIST (mysql)
.....

因此它会不必要地填满日志文件。我尝试了不同的选择器,但似乎选择时cron.info会显示所有信息,而cron.noticecrontab 何时被编辑或执行则不会显示,这一点我再次喜欢在我的日志中显示出来。

# Log cron stuff
cron.*                                                  /var/log/cron

cron.*cron.info 似乎与任何关于如何排除“LIST”条目的想法相同?因此/var/log/cron看起来像:

Nov 30 17:24:02 mysrv CROND[349831]: (root) CMDEND (/etc/cron.b/check nout >/dev/null 2>&1)
Nov 30 17:28:01 mysrv CROND[350781]: (root) CMD (/etc/cron.b/check nout >/dev/null 2>&1)

答案1

尝试使用cron.none。如果使用*星号 ( * ),则匹配零次或多次。

现在您可以修改规则以将日志移动到另一个文件/path/to/another/file

更新

比较操作

目前支持以下比较操作:

包含

检查值中提供的字符串是否包含在属性中。必须完全匹配,不支持通配符。

是平等的

比较提供的“值”字符串和属性内容。这两个值必须完全相等才能匹配。与 contains 的区别在于,contains 会在属性值的任何位置搜索值,而 isequal 的所有字符必须相同。因此,isequal 最适用于 syslogtag 或 FROMHOST 等字段,您可能知道这些字段的确切内容。

以。。开始

检查是否在属性值的开头找到该值。例如,如果您使用以下代码搜索“val”

:msg, startswith, "val"

如果 msg 包含“此消息中有值”,则匹配成功;但如果 msg 包含“此消息中有值”,则不匹配(在后一种情况下,“contains”将匹配)。请注意,“startswith” 比正则表达式快得多。因此,即使它们被实现,使用“startswith” 也是非常有意义的(从性能角度来看)。

正则表达式

将该属性与提供的 POSIX BRE 正则表达式进行比较。

正则表达式

将该属性与提供的 POSIX ERE 正则表达式进行比较。

您可以在比较操作前立即使用感叹号 (!),此操作的结果为否定。例如,如果msg包含“This is an informative message”,则以下示例将不匹配:

:msg, contains, "error"

但这一个匹配:

:msg, !contains, "error"

如果您想进行一些通用处理但排除某些特定事件,使用否定会很有用。您可以结合使用丢弃操作。示例如下:

*.* /var/log/allmsgs-including-informational.log
:msg, contains, "informational"  ~
*.* /var/log/allmsgs-but-informational.log

不要忽略第 2 行中的波浪号!在此示例中,所有消息都写入文件 allmsgs- including-informational.log。然后,所有包含字符串“informational”的消息都将被丢弃。这意味着“丢弃行”(我们示例中的第 2 行)下面的配置文件行将不会应用于此消息。然后,所有剩余行也将写入文件 allmsgs-but-informational.log。

答案2

我找到了一个带过滤器的解决方案,供感兴趣的人参考。我在 cron.info 上方插入了一个语句,以删除不需要的消息。所以我的解决方案如下:

:msg, contains, "(root) LIST"                           ~
cron.*                                                  /var/log/cron

现在所有带有“(root) LIST”条目的行都将被丢弃。

相关内容