目前我正在实现围绕 rsyslog 和auditd 构建的监控系统部分。我想在项目中包含一个正确的核实这一事实远程 rsyslog 客户端设施正在运行。应以较短的时间间隔在 rsyslog 服务器上重复此检查。
最简单的方法是跟踪最新日志文件修改的时间戳。如果日志文件(rsyslog 服务器使用该文件重定向传入消息)最近没有被修改,我们可以得出结论,远程 rsyslog 已关闭并且不再发送消息。但我怀疑这个方法的正确性。
答案1
这不是一个坏主意。为了稍微改进一下,也许每个客户端都可以配置为定期发送消息(提供“心跳”或“标记”)。对于 Rsyslog,指令是 $ActionWriteAllMarkMessages
[on|off]
.但请注意手册页:
请注意,此选项自动重置为“关闭”,因此如果您打算将其用于多个操作,则必须在应提供此功能的所有选择器行前面指定它。
如果 Syslog 服务器上存在未被发现的配置问题,导致消息被定向到意外位置(例如您监视的显示客户端处于活动状态的文件),该怎么办?也许更严格的测试可能是 (grep/awk) 提供的“心跳”或“标记”消息$ActionWriteAllMarkMessages
,查找来自特定主机的消息的时间。
要验证远程 Syslog 服务器是否正在运行,您可以使用nc
带有-z
和-u
开关的 netcat ( )。从手册:
-u 使用 UDP 代替默认选项 TCP。
-z 指定 nc 应该只扫描侦听守护进程,而不向它们发送任何数据。 [...]
例如,五秒超时 ( -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 服务器也可能被视为已关闭。)
考虑到 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 仅用于说明。