如何檢查遠端 rsyslog 客戶端是否正在執行
目前,我正在實施圍繞 rsyslog 和 auditd 建構的監控系統部分。我想在項目中包含對遠端 rsyslog 客戶端工具正在執行這一事實的正確驗證。應在短時間內在 rsyslog 伺服器上重複此檢查。
最簡單的方法是跟踪最新日誌文件修改的時間戳。如果最近沒有修改日誌文件(rsyslog 伺服器用來重定向傳入消息的日誌文件),我們可以斷定遠端 rsyslog 已關閉並且不再發送消息。但我懷疑這種方法的正確性。
這不是一個壞主意。為了稍微改進一下,也許每個客戶端都可以配置為定期發送消息(提供“心跳”或“標記”)。使用 Rsyslog,指令是
$ActionWriteAllMarkMessages
[on|off]
. 但請注意手冊頁:請注意,此選項自動重置為“關閉”,因此如果您打算將其用於多個操作,則必須在所有應提供此功能的選擇器行前面指定它。
如果 Syslog 伺服器上存在未發現的配置問題,導致消息被定向到意外位置,例如您監視的文件以顯示客戶端處於活動狀態,該怎麼辦?或許更嚴格的測試可能是對 (grep/awk) 提供的“心跳”或“標記”消息
$ActionWriteAllMarkMessages
,查找來自特定主機的消息的時間。要驗證遠端 Syslog 伺服器是否正在執行,您可以使用帶有和開關
nc
的 netcat ( ) 。從手冊:-z``-u
-u 使用 UDP 而不是 TCP 的預設選項。
-z 指定 nc 應該只掃描監聽守護程序,而不向它們發送任何數據。
$$ … $$
例如,使用 5 秒超時 (
-w5
):#!/usr/bin/env bash hostname="<FQDN or IP Address>" port="514" if (nc -z -u -w5 "$hostname" "$port" > /dev/null 2>&1); then echo "Syslog is up." else echo "Syslog could not be reached." fi unset hostname unset port
或者,如果 Syslog 伺服器也使用 TCP,那麼您可以省略
-u
開關以利用 TCP 的可靠性,如果只是為了這個目的。這將檢查 Syslog 伺服器是否正在偵聽並且可以從執行連接檢查的伺服器的位置獲得。還有一個同樣重要的方面:磁碟空間。(如果 Syslog 伺服器沒有足夠的空間來寫消息,那麼 Syslog 伺服器也可能被認為是 down。)考慮到 UDP 在設計上可能是“不可靠的”,依靠“標記”或“心跳”消息可能並不總是在擁塞的網路或 Syslog 伺服器中起作用。另一種方法可能是在每個客戶端上安裝一個腳本。該腳本(BASH、Python 或其他任何工作)可以返回您設計的任何錯誤程式碼(例如:Syslog 程序未執行?返回 1 或嘗試首先啟動 Syslog 程序,或設計其他測試,如連接測試等)。用於
xinetd
從/etc/xinetd.d/script_name
(在 RHEL/CentOS 上)啟動腳本:service check_syslog { type = UNLISTED port = 6777 socket_type = stream protocol = tcp wait = no user = root server = /usr/local/sbin/script_name only_from = 127.0.0.1 10.0.0.110 disable = no }
在 RHEL 上,重啟命令是
service xinetd restart
. 編輯/etc/services
為埠 6777 命名。我喜歡用它iptables
來增加only_from
節。順便說一句,埠 6777 僅用於說明。