現在、私はrsyslogとauditdを中心に構築された監視システムの一部を実装しています。私正しいこの事実を確認するリモートrsyslogクライアント機能が実行されています。。この確認は、rsyslogサーバーでより短い間隔で繰り返す必要があります。
最も簡単な方法は、最新のログファイル変更のタイムスタンプを追跡することです。 rsyslog サーバーが受信メッセージのリダイレクトに使用するログファイルが最近変更されていない場合、リモート rsyslog がダウンしてメッセージが送信されなくなると結論付けることができます。しかし、この方法の正確性については疑問があります。
答え1
これは悪い考えではありません。状況を少し改善するために、各クライアントが定期的にメッセージを送信するように設定できます(「ハートビート」または「フラグ」を提供)。 Rsyslogの場合、指示は次のとおりです $ActionWriteAllMarkMessages
[on|off]
。ただし、マニュアルページに注意してください。
このオプションは自動的に「オフ」にリセットされるため、複数の操作に使用する場合は、この機能を提供する必要があるすべてのセレクタ行の前に指定する必要があります。
Syslogサーバーで見つからない構成の問題のためにメッセージが予期しない場所(クライアントのアクティビティを示す監視ファイルなど)に転送されるとどうなりますか?おそらくより厳格なテストは、提供された「ハートビート」または「表示」メッセージをgrep / awkして、$ActionWriteAllMarkMessages
特定のホストから送信されたメッセージの時間を見つけることです。
リモートSyslogサーバーが稼働していることを確認するには、スイッチnc
でnetcat()を使用できます。マニュアルから:-z
-u
-uデフォルトオプションのTCPの代わりにUDPを使用します。
-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サーバーがダウンしていると見なされる可能性があります。)
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は単なる例です。