弊社の実稼働環境の 1 つで、 syslog-ng がゴミを書き出して、その後に空白行が続く例を見つけましたkernel.emerg
。例:
Dec 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <Q▒b
+\c 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <;E0
Dec 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <▒"▒l
Dec 21 00:14:57 someserver [syslog-ng.err] Error processing log message: <▒▒▒▒e▒F
Dec 21 00:14:57 someserver [syslog-ng.err] Error processing log message: <▒▒
Dec 21 00:14:58 someserver [kernel.emerg]
このkernel.emerg
行は私にとって特に懸念事項です。 によるとman 3 syslog
:
LOG_KERN
kernel messages (these can’t be generated from user processes)
これはカーネル機能が偽装できないことを示唆しているようです。システムコール自体がそのような偽装を防ぐ可能性があることはわかりますが、プロセスが書き込みを阻止するものは何もないと考えるのは正しいでしょうか。直接に、/dev/log
そしての機能を偽装していますか? このような偽装を本当に阻止できる唯一のものは、syslog デーモンがメッセージを他のソースkernel
から取得したかどうかを区別することだということを言いたいと思います。/proc/kmsg
- ディストリビューションは RHEL5.5 です。カーネル バージョンは です
2.6.18-194.8.1.el5
。これらは私がまだ制御できる要素ではありません。叱られたと思ってください。 - syslog デーモンは、社内で構築された
syslog-ng
3.1.4 パッケージです (32 ビットで 64 ビット カーネルで実行されますが、関連性があるとは考えられません)。 - Google で見つけたメーリング リストの投稿には、
kmsg
カーネル 3.5 の変更によってこのような出力エラーが発生する可能性があることを示唆するものがいくつかありましたが、ここでは間違いなくそうではありません。
メッセージはネットワークから入ってきません。定義されているソースはこれだけです:
source s_syslog {
# message generated by Syslog-NG
internal();
# standard Linux log source (this is the default place for the syslog()
# function to send logs to)
unix-stream("/dev/log");
# messages from the kernel
file("/proc/kmsg" program_override("kernel: "));
};
答え1
syslog-ng管理者ガイド(http://www.balabit.com/sites/default/files/documents/syslog-ng-ose-3.3-guides/en/syslog-ng-ose-v3.3-guide-admin-en/html-single/index.html#kernel-messages)、カーネル機能は (少なくともデフォルトで定義されているように) /proc/kmsg から直接読み取りますが、ユーザーランドからは書き込むことができません。
(これは記憶によるものですが、RHEL 5.5 では、シンボルからアドレスへの出力に klogd や ksymoops は必要ないはずです。ただし、その点についてはドキュメントを確認してください。)
不正なプロセスがメッセージの先頭にリテラル文字列「kernel:」を付加するのではないかと心配な場合は (上記のコメントを参照)、受信したメッセージの先頭にある文字列「kernel:」を削除するフィルターを追加して確実に対処できます。または、/proc/kmsg を別の送信先を持つ別の送信元として定義します。
編集: そのセクションを詳しく見てみると:
"注記
メッセージに適切な syslog ヘッダーがない場合、syslog-ng はファイルから受信したメッセージを kern 機能によって送信されたものとして扱います。必要に応じて、ソース定義の default-facility および default-priority オプションを使用して、別の機能を割り当てます。"