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
?我想說,唯一能夠真正阻止這種欺騙的方法是系統日誌守護程序區分它是否從/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 工具傳送。如果需要,請使用來源定義中的預設設施和預設優先選項來指派不同的設施。