Remote

如何檢查遠端 rsyslog 客戶端是否正在執行

  • December 13, 2018

目前,我正在實施圍繞 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 僅用於說明。

引用自:https://unix.stackexchange.com/questions/132025