
我在伺服器上有一個腳本,每隔幾分鐘運行一次,除此之外還檢查是否注入了一些惡意 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.notice
它不顯示 crontab 何時被編輯或執行,這再次是我喜歡在我的日誌中。
# 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"
如果訊息包含“此訊息中有值”,則它將匹配,但如果訊息包含“此訊息中有值”,則它將不匹配(在後一種情況下,「包含」將匹配)。請注意,“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-include-informational.log。然後,所有包含字串“informational”的訊息都將被丟棄。這表示「丟棄行」(我們的範例中的編號 2)下方的設定檔行將不會套用於此訊息。然後,所有剩餘行也將寫入檔案 allmsgs-but-informational.log。
答案2
我為任何有興趣的人找到了帶有過濾器的解決方案。我在 cron.info 上方插入了一條語句,以刪除不需要的訊息。所以我的解決方案如下所示:
:msg, contains, "(root) LIST" ~
cron.* /var/log/cron
現在,所有帶有「(root) LIST」條目的行都將被丟棄。