Я нахожу случаи, когда 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
. Это пока не те факторы, которые я могу контролировать; считайте, что меня отругали. - Демон 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 как отдельный источник с отдельным пунктом назначения.
EDIT: Если рассматривать этот раздел подробнее:
"Примечание
Если сообщение не имеет надлежащего заголовка syslog, syslog-ng обрабатывает сообщения, полученные из файлов, как отправленные средством kern. Используйте параметры default-facility и default-priority в определении источника, чтобы назначить другое средство, если необходимо."