如何防止“内核。*”syslog欺骗?

我find了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并欺骗kernel设施吗? 我想说的是唯一能够真正阻止这种欺骗行为的就是syslog守护进程,它可以区分是否从/proc/kmsg获取消息与其他消息来源。

  • 发行版是RHEL5.5。 内核版本是2.6.18-194.8.1.el5 。 这些还不是我控制的因素。 考虑我骂。
  • 系统日志守护进程是一个公司构build的syslog-ng 3.1.4软件包(32位,运行在64位内核上,但是我不会将其解释为相关的)。
  • 有一些邮件列表post是通过Google发现的,表示在内核3.5中对kmsg更改可能会导致这样的输出错误,但是在这里绝对不是这样。

消息不从networking进入。 这是唯一确定的来源:

 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: ")); }; 

根据syslog-ngpipe理员指南( 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 ),内核设施(至less默认情况下定义的)直接从/ proc / kmsg读取,不能从userland写入。

(这是从内存,但我敢肯定RHEL 5.5不需要klogd甚至ksymoops符号到地址输出;检查你的文档,虽然..)

如果您担心(参见上面的注释)关于将消息中的文字string“kernel:”添加到其中的一些stream氓进程,则可以始终添加一个筛选器,以便在接收到的任何消息开始时删除string“kernel:”确定。 或者,将/ proc / kmsg定义为具有单独目标的独立源。

编辑:在看更多的部分:

“注意

如果消息没有正确的系统日志标头,则syslog-ng会处理由kern工具发送的从文件接收到的消息。 如果需要,使用源定义中的default-facility和default-priority选项来分配不同的设施。