如何防止“kernel.*”系统日志欺骗?

如何防止“kernel.*”系统日志欺骗?

我发现kernel.emerg在我们的某个生产环境中,syslog-ng 会输出垃圾信息,后面跟着一个空行。以下是一个例子:

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欺骗设施kernel?我想说,唯一能够真正阻止这种欺骗的是 syslog 守护进程区分它是从哪里获得消息/proc/kmsg还是从其他来源获得消息。

  • 发行版是 RHEL5.5。内核版本是2.6.18-194.8.1.el5。这些还不是我能控制的因素;我受委屈了。
  • syslog 守护进程是公司构建的syslog-ng3.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 选项来分配不同的工具(如果需要)。

相关内容