Linux作業系統日志分析-詳解
文檔說明
本文檔針對CentOS Linux release 7.2.1511 (Core)來進行作業系統日志的配置和分析,如使用的是其他版本,可能會存在一些差異。
系統日志說明
系統日志是記錄系統活動資訊的檔案, 記錄了:時間、地點 (IP)、使用者(或服務名稱)、做了哪些操作 等。 簡單的說,就是記錄系統在什麼時候由哪個程式做了什麼樣的行為時,發生了哪些事件。
可以依據作業系統的記錄解決系統方面的錯誤、解決網絡服務的問題,了解系統中曆史發生事件等。
日志在排查檔案的時候至關重要,在Linux上一般跟系統相關的日志預設都會放到/var/log下面。
1.主要系統日志及其作用
1.1/var/log/boot.log
一般包含系統啟動時的日志,包括自啟動的服務。這個檔案隻會存儲本次開機啟動的資訊,前次開機的資訊并不會被保留下來。
可以看到此檔案中存儲的是系統引導的相關資訊,就是Linux開機自檢過程顯示的資訊。
1.2/var/log/cron
記錄crontab自動任務相關資訊。包括自動任務有沒有實際被執行,執行過程是否發生錯誤等。
1.3/var/log/dmesg
記錄系統在開機的時候核心偵測過程所産生的各項資訊。由于 CentOS 預設将開機時核心的硬體偵測過程取消顯示, 是以額外将資料記錄一份在這個檔案中。
1.4/var/log/lastlog
可以記錄系統上面所有的賬号最近一次登入系統時的相關資訊。 該日志檔案記錄最近成功登入的事件和最後一次不成功的登入事件,由login生成。 在每次使用者登入時被查詢,該檔案是二進制檔案,需要使用 lastlog指令檢視,根據UID排序顯示登入名、端口号和上次登入時間。如果某使用者從來沒有登入過,就顯示為"**Never logged in**"。該指令隻能以root權限執行。簡單地輸入lastlog指令後就會看到類似如下的資訊:
系統賬戶諸如bin、daemon、adm、uucp、mail等決不應該登入,如果發現這些賬戶已經登入,就說明系統可能已經被入侵了。若發現記錄的時間不是使用者上次登入的時間,則說明該使用者的賬戶已經洩密了。
1.5/var/log/maillog
該日志檔案記錄了每一個發送到系統或從系統發出的電子郵件的活動。它可以用來檢視使用者使用哪個系統發送工具或把資料發送到哪個系統。下面是該日志檔案的片段。
其實主要是記錄 postfix (SMTP 協定提供者) 與 dovecot (POP3 協定提供者) 所産生的訊息。 SMTP 是發信所使用的通訊協定, POP3 則是收信使用的通訊協定。 postfix 與 dovecot 則分别是兩套達成通訊協定的軟體。
1.6/var/log/messages
包括整體系統資訊,其中也包含系統啟動期間的日志。此外,mail,cron,daemon,kern和auth等内容也記錄在var/log/messages日志中。
IO 錯誤、網絡錯誤和其他系統錯誤都會記錄到這個檔案中。其他資訊,比如某個人的身份切換為 root,也在這裡列出。如果服務正在運作,比如 DHCP 伺服器,您可以在 messages 檔案中觀察它的活動。通常,/var/log/messages 是您在做故障診斷時首先要檢視的檔案。
該 檔案的格式是每一行包含日期、主機名、程式名,後面是包含PID或核心辨別的方括 号、一個冒号和一個空格,最後是消息。該檔案有一個不足,就是被記錄的入侵企圖和成功的入侵事件,被淹沒在大量的正常程序的記錄中。但該檔案可以由 /etc/syslog檔案進行定制。由 /etc/syslog.conf配置檔案決定系統如何寫入/var/messages。有關如何配置/etc/syslog.conf檔案決定系統日志 記錄的行為,将在後面詳細叙述。
1.7/var/log/secure
基本上,隻要牽涉到『需要輸入賬号密碼』的軟體,那麼當登入時 (不管登入正确或錯誤) 都會被記錄在此檔案中。 包括系統的 login 程式、圖形接口登入所使用的 gdm 程式、 su, sudo 等程式、還有網絡聯機的ssh, telnet 等程式, 登入資訊都會被記載在這裡。
1.8/var/log/wtmp
該 日志檔案永久記錄每個使用者登入、登出及系統的啟動、停機的事件。是以随着系統正常 運作時間的增加,該檔案的大小也會越來越大,增加的速度取決于系統使用者登入的次數。該日志檔案可以用來檢視使用者的登入記錄,last指令就通過通路這個文 件獲得這些資訊,并以反序從後向前顯示使用者的登入記錄,last也能根據使用者、終端 tty或時間顯示相應的記錄。
指令last有兩個可選參數:
last -u 使用者名 顯示使用者上次登入的情況。
last -t 天數 顯示指定天數之前的使用者登入情況。
1.9/var/run/utmp
該 日志檔案記錄有關目前登入的每個使用者的資訊。是以這個檔案會随着使用者登入和登出系 統而不斷變化,它隻保留當時聯機的使用者記錄,不會為使用者保留永久的記錄。系統中需要查詢目前使用者狀态的程式,如 who、w、users、finger等就需要通路這個檔案。該日志檔案并不能包括所有精确的資訊,因為某些突發錯誤會終止使用者登入會話,而系統沒有及時 更新 utmp記錄,是以該日志檔案的記錄不是百分之百值得信賴的。
以 上提及的3個檔案(/var/log/wtmp、/var/run/utmp、 /var/log/lastlog)是日志子系統的關鍵檔案,都記錄了使用者登入的情況。這些檔案的所有記錄都包含了時間戳。這些檔案是按二進制儲存的,故 不能用less、cat之類的指令直接檢視這些檔案,而是需要使用相關指令通過這些檔案而檢視。其中,utmp和wtmp檔案的資料結構是一樣的,而 lastlog檔案則使用另外的資料結構,關于它們的具體的資料結構可以使用man指令查詢。
每 次有一個使用者登入時,login程式在檔案lastlog中檢視使用者的UID。如果存在,則把使用者上次登入、登出時間和主機名寫到标準輸出中,然後 login程式在lastlog中記錄新的登入時間,打開utmp檔案并插入使用者的utmp記錄。該記錄一直用到使用者登入退出時删除。utmp檔案被各種 指令使用,包括who、w、users和finger。
下一步,login程式打開檔案wtmp附加使用者的utmp記錄。當使用者登入退出時,具有更新時間戳的同一utmp記錄附加到檔案中。wtmp檔案被程式last使用。
1.10其他檔案或者目錄
例如安裝系統自帶的一些軟體的時候,預設的日志輸出都是輸出到這個路徑下的,例如apache預設日志路徑/var/log/httpd/,這個是為了遵循系統設計的一些規範。
2.記錄日志檔案的服務rsyslog.service
日志檔案由rsyslog服務維護,是以需要保證已經啟動rsyslog,而且已經設定開機時啟動。
檢查rsyslog服務程序是否存在:
ps -elf | grep rsyslog
rsyslog程序存在。
檢查rsyslog服務是否已經開啟并設定為開機啟動:
systemctl status rsyslog
服務為啟動狀态,并且也已經預設為開機自動啟動。
2.1配置日志檔案:/etc/rsyslog.conf
rsyslogd針對各種服務的哪些等級的資訊記錄在哪些檔案,是在/etc/rsyslog.conf中配置的。
下圖為/etc/rsyslog.conf配置檔案的内容:
可以看到該檔案内容的設定文法是這樣的:
服務名稱[.=!]資訊等級 資訊記錄的檔案名或裝置或主機
例:上圖示紅的記錄可以解釋為cron服務的任何等級的資訊記錄到/var/log/cron檔案中。
服務名稱:
相對序号 | 服務類别 | 說明 |
kern(kernel) | 核心 (kernel) 産生的訊息,大部分都是硬體偵測以及核心功能的啟用; | |
1 | user | 在使用者層級所産生的資訊,例如使用者使用 logger 指令來記錄登入檔案的功能; |
2 | 隻要與郵件收發有關的訊息記錄都屬于這個; | |
3 | daemon | 主要是系統的服務所産生的資訊,例如 systemd 就是這個有關的訊息; |
4 | auth | 主要與認證/授權有關的機制,例如 login, ssh, su 等需要賬号/密碼的操作; |
5 | syslog | 由 syslog 相關協定産生的資訊,其實就是 rsyslogd 這支程式本身産生的資訊; |
6 | lpr | 列印相關的訊息啊; |
7 | news | 與新聞討論區伺服器有關的資訊; |
8 | uucp | 全名為 Unix to Unix Copy Protocol,早期用于 unix 系統間的程式資料交換; |
9 | cron | 例行性工作排程 cron/at 等産生的訊息記錄; |
10 | authpriv | 與 auth 類似,但記錄較多賬号私人的資訊,包括 pam 子產品的運作等; |
11 | ftp | 與 FTP 通訊協定有關的訊息輸出; |
16-23 | local0 ~ local7 | 保留給本機使用者使用的一些登入檔案訊息,較常與終端機互動。 |
資訊等級:
等級數值 | 等級名稱 | 說明 |
7 | debug | 用來 debug (除錯) 時産生的訊息資料; |
6 | info | 僅是一些基本的訊息說明而已; |
5 | notice | 雖然是正常資訊,但比 info 還需要被注意到的一些資訊内容; |
4 | warning | (warn)警示的訊息,可能有問題,但是還不至于影響到某個 daemon 運作的資訊;基本上, info,notice, warn 這三個訊息都是在告知一些基本資訊而已,應該還不至于造成一些系統運作困擾; |
3 | err | (error)一些重大的錯誤訊息,例如配置檔案的某些設定值造成該服務無法啟動的資訊說明, 通常藉由 err 的錯誤告知,應該可以了解到該服務無法啟動的問題; |
2 | crit | 比 error 還要嚴重的錯誤資訊,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔; |
1 | alert | 警告警告,已經很有問題的等級,比 crit 還要嚴重; |
emerg | (panic)等級,意指系統已經幾乎要當機的狀态。 很嚴重的錯誤資訊了。通常大概隻有硬體出問題,導緻整個核心無法順利運作,就會出現這樣的等級的訊息。 |
注意服務名稱和資訊等級之間還有[.=!]的連接配接符号,具體含義如下:
. :代表比後面還要嚴重的等級 (含該等級) 都被記錄下來的意思,例如: mail.info 代表隻要是 mail的資訊,而且該資訊等級嚴重于 info (含 info 本身)時,就會被記錄下來的意思。
.=:代表所需要的等級就是後面接的等級而已, 其他的不要;
.!:代表不等于, 即除了該等級外的其他等級都記錄。
一般來說,我們比較常使用的是『.』這個連結符号。
資訊記錄的檔案名或裝置或主機
資訊要放置在哪。通常我們使用的都是記錄的檔案。但是也可以輸出到裝置。也可以記錄到不同的主機上頭。具體有如下幾類:
檔案的絕對路徑:通常就是放在 /var/log 裡頭的檔案;
列印機或其他:例如 /dev/lp0 這個列印機裝置;
使用者名稱:顯示給指定使用者;
遠端主機:例如 @study.vbird.tsai 當然,要對方主機也能支援才可以;
*:代表『目前線上的所有人』,類似 wall 這個指令的意義。
示例1:
我要将新聞討論區資料 (news) 及例行性工作排程 (cron) 的訊息都寫入到 /var/log/cronnews 的檔案中,但是這兩個程式的警告訊息則額外的記錄在 /var/log/cronnews.warn 中, 那該如何設定我的 rsyslog.conf呢?
vim /etc/rsyslog.conf
添加如下内容即可
示例2:
messages 這個檔案需要記錄所有的資訊,但是就是不想要記錄 cron, mail 及 news 的資訊,那麼應該怎麼寫?
vim /etc/rsyslog.conf
添加如下内容即可
使用『,』分隔時,那麼等級隻要接在最後一個即可,如果是以『;』來分的話, 那麼就需要将服務與等級都寫上去。
2.2添加自定義記錄日志
例如想在/etc/rsyslog.conf檔案中添加一行日志定義,将所有服務的info等級的日志記錄到/var/log/log_test.log檔案
vi /etc/rsyslog.conf
添加如下内容:
*.info /var/log/log_test.log
儲存該檔案,然後重新開機rsyslog服務的指令使修改生效。
systemctl restart rsyslog.service
使用logger工具測試配置是否成功。(logger是一個Shell指令接口,可以模拟産生各類rsyslog資訊)
logger -p user.info "test info"
檢視/var/log/log_test.log日志檔案内容看是否有"test info"日志記錄,确認日志設定是否修改成功。
cat /var/log/log_test.log
可見已經配置成功。
3.日志檔案輪轉
用日志輪轉服務logrotate來自動實作日志檔案的定期清理。
CentOS7系統預設安裝有logrotate,logrotate的執行由crond服務實作。
檢查系統中是否安裝有logrotate
rpm -qa | grep logrotate
在/etc/cron.daily目錄中有一個名為logrotate的腳本檔案用來啟動logrotate程式,以檢視是否有任何日志需要輪轉。
輪轉配置檔案為/etc/logrotate.conf的預設配置
logrotate的主要功能就是将舊的登入檔案移動成舊檔,并且重建立立一個新的空檔案來記錄,它的執行結果有點類似底下的圖示:
由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之後,原本的 messages 會變成messages.1 而且會制造一個空的 messages 給系統來儲存日志檔案。而第二次執行之後,則messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存日志資訊!那麼如果我們僅設定保留三個登入檔而已的話,那麼執行第四次時,則 messages.3 這個檔案就會被删除,并由後面的較新的儲存登入檔所取代。
4.檢視和分析系統日志條目
4.1日志條目示例
以我們自己添加的/var/log/log_test.log 為例:
日志檔案記錄順序按時間順序排列,開頭顯示最早的消息,末尾顯示最新的消息。
4.2使用tail工具實時監控日志檔案
通常使用tail工具來監控日志檔案。它輸出指定檔案的最後10行,并實時滾動顯示最新的日志記錄。
tail -f 日志檔案
以/var/log/log_test.log 為例:
日志會實時滾動,按ctrl+c結束監控。
系統日志注意事項
注意:rsyslogd的日志檔案隻要被編輯過就無法繼續記錄。假如發現系統日志不能記錄資訊了,那麼很可能是因為使用“:wq”來離開vim的環境,是以才會導緻不能記錄的問題。
解決方式為:重新啟動rsyslog.service讓它繼續提供服務。