運維日記017 – RHEL6之系統日誌的管理
Linux下的日誌記錄了系統每天發生的各種各樣的事情,可以通過它來檢查錯誤發生的原因,或者受到攻擊時攻擊者留下的痕跡。日誌主要的功能有:審計和監測。RHEL6下的日誌文件存放在/var/log目錄下,下面舉幾個常見日誌的例子:
/var/log/dmesg
核心啓動日誌。這個日誌文件記錄了內核啓動時候輸出的信息。/var/log/messages
系統報錯日誌。/var/log/maillog
郵件系統日誌。/var/log/secure
安全信息、認證登錄和與xinetd有關的日誌。/var/log/cron
計劃任務執行成功與否的日誌。/var/log/wtmp
記錄所有的登錄和登出。可以用last
命令查看所有登錄過系統的用戶和IP。/var/log/btmp
記錄錯誤的登錄嘗試。可以用lastb
命令查看。注意,這個文件如何突然快速增大,可能有人試圖暴力破解用戶密碼。/var/log/lastlog
記錄每個用戶的最後登錄信息。
動態跟蹤日誌文件:tailf命令
RHEL6下有一個tailf命令非常適合用於監控日誌文件的變化(follow the growth of a log file)。這條命令類似於tail -f
,嚴格說來應該與`tail –follow=name`更相似些。與tail -f不同的是,如果文件不增長,它不會去訪問磁盤文件(It is similar to tail -f but does not access the file when it is not growing. This has the side effect of not updating the access time for the file, so a filesystem flush does not occur periodically when no log activity is happening.)。所以tailf特別適合那些便攜機上跟蹤日誌文件,因爲它能省電,因爲減少了磁盤訪問(tailf is extremely useful for monitoring log files on a laptop when logging is infrequent and the user desires that the hard disk spin down to conserve battery life.)。
下面舉一個tailf監控日誌的例子。
# tailf /var/log/secure
... ...
Oct 29 08:31:05 wjm sshd[1160]: Accepted password for wjm from 192.168.1.105 port 43841 ssh2
Oct 29 08:31:05 wjm sshd[1160]: pam_unix(sshd:session): session opened for user wjm by (uid=0)
... ...
這時,屏幕顯示的末尾就是系統輸出的最新的日誌信息。此時你可以通過ssh遠程登錄一下該主機,可以看到屏幕上又會輸出一條類似下面這樣的日誌信息:
Oct 29 08:31:05 wjm sshd[1160]: Accepted password for wjm from 192.168.1.105 port 43841 ssh2
Oct 29 08:31:05 wjm sshd[1160]: pam_unix(sshd:session): session opened for user wjm by (uid=0)
RHEL6下有一個logger命令,可以直接向系統日誌中寫入信息。例如:
# logger 'hello, this is a piece of faked log message.'
# tailf /var/log/messge
... ...
Oct 29 08:48:07 root root: hello, this is a piece of faked log message.
日誌的分類和分級
Linux下的日誌採用先分類,然後在每個類別下分級的管理模式。
主要的七種日誌分類:
名稱 | 含義 |
---|---|
authpriv | 安全認證相關 |
cron | at和cron定時任務相關 |
deamon | 定時任務相關 |
kern | 內核產生 |
lpr | 打印系統產生 |
郵件系統產生 | |
syslog | 日誌服務本身 |
除上面列出的七類常見日誌以外,還有news(新聞系統相關)、uucp(unix to unix copy)等日誌類型(目前已經不太常用)。
另外,還有local0~lobal7這八個日誌類型,是系統保留的,可以供其他程序使用或者用戶自定義使用。
八種日誌級別(按照由低到高順序排列):
級別 | 含義 |
---|---|
debug | 排錯信息 |
info | 正常信息 |
notice | 稍微要注意的 |
warn | 警告 |
err(error) | 錯誤 |
crit(critical) | 關鍵的錯誤 |
alert | 警報警惕 |
emerg(emergence) | 緊急突發事件 |
日誌的總管家:rsyslog
在RHEL6中日誌由系統服務rsyslog進行管理和控制。最小化安裝RHEL6後,rsyslog服務默認是開啓的。
# chkconfig --list | grep rsyslog
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
該服務的配置文件位於/etc/rsyslog.conf,下面對該配置文件進行簡單描述。
# vi /etc/rsyslog.conf
... ...
#### MODULES ####
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#$ModLoad immark # provides --MARK-- message capability
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
... ...
這一節設置rsyslog服務加載的模塊。其中#號表示註釋。其中比較重要的是#$ModLoad imudp
和#$UDPServerRun 514
兩行,取消掉該行註釋後,表示允許514端口接收使用UDP協議轉發過來的日誌。這樣可以把本主機配置爲集中式的日誌服務器,它接收並存儲其它主機的日誌,提高了整個系統的安全性。#$ModLoad imtcp
和#$InputTCPServerRun 514
功能相同,只不過採用的是TCP協議。
... ...
#### RULES ####
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
... ...
這一節定義了不同類型和級別的日誌應存放在哪裏。例如,*.info;mail.none;authpriv.none;cron.none /var/log/messages
表示除了mail日誌、authpriv日誌和cron日誌之外,其它的所有類型info級別及以上的日誌都存放在/var/log/messages下。下面簡要給出rsyslog.conf的日誌記錄規則:
- . 代表該類型比後面還要高的等級(包括該等級)的日誌都要被記錄下來,其中.前面爲日誌類型,.後面爲日誌等級。例如:mail.info表示凡是mail類型的且等級大於或等於info級別的日誌都記錄下來。
- .= 代表等於該等級的日誌都要被記錄下來。
- .! 代表不等於該等級的日誌都要被記錄下來。
- .none 該類型的日誌都不做記錄。
- * 表示任意類型或者級別
而日誌記錄的位置有三種類型:
- 本地日誌文件。通常就是/var/log目錄下。
- 遠程日誌服務器。
- 直接彈出在屏幕上。類似與wall命令。
mail.* -/var/log/maillog
rsyslog.conf配置文件中上面這行/var/log/maillog前面的-是什麼意思呢?
這裏的-代表每當有新日誌產生時,rsyslog會先寫入緩存,而不是立即更新日誌文件,只有當緩存寫滿時纔會批量更新日誌文件。這樣可以減少寫文件的次數。通常日誌信息較多而且不是特別重要時,可以採用這種策略。
實戰一:自定義sshd日誌類型及日誌文件
系統將sshd產生的日誌定義爲authpriv類型的,保存在/var/log/secure下。請自定義sshd的日誌類型爲local0,並保存在/var/log/sshdlog文件。
- 修改sshd配置文件
# vi /etc/ssh/sshd_config
... ...
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
#SyslogFacility AUTHPRIV
SyslogFacility local0
... ...
- 重啓sshd服務
# service sshd restart
- 修改rsyslog配置文件
# vi /etc/rsyslog.conf
... ...
local0.* /var/log/sshd.log
... ...
- 重啓rsyslog服務
# service sshd restart
- 測試
# ssh [email protected]
# tailf /var/log/sshd.log
實戰二:配置一個簡單的遠程日誌服務器
1、啓動兩臺RHEL6虛擬機,其中一臺主機ip地址爲192.168.1.111,將其設置爲日誌服務器。另一臺ip地址192.168.1.112,設置爲客戶端用於測試日誌服務器是否正確配置。
2、配置日誌服務器主機的/etc/rsyslog.conf文件,並重啓rsyslog服務。
# vi /etc/rsyslog.conf
... ...
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
... ...
# service rsyslog restart
3、配置客戶端主機的/etc/rsyslog.conf文件,定義其日誌向日志服務器發送,然後重啓rsyslog服務。
# vi /etc/rsyslog.conf
... ...
#### RULES ####
... ...
*.info @192.168.1.111
... ...
# service rsyslog restart
4、配置日誌服務器主機的防火牆,使其可以接收客戶端發來的日誌信息。簡單起見,這裏直接關閉了日誌服務器主機的防火牆。
# iptalbes -F
5、客戶端主機用logger命令產生一條日誌,用tailf觀察一下日誌服務器的日誌變化。
# tailf /var/log/messages
# logger "this message is from 192.168.1.112"