日志文件對於診斷和解決系統中的問題很有幫助,因為在Linux系統中運行的程序通常會把系統消息和錯誤消息寫入相應的日志文件,這樣系統一旦出現問題就會“有據可查”。此外,當主機遭受攻擊時,日志文件還可以幫助尋找攻擊者留下的痕跡.
一、主要日志文件
在Linux系統中,日志數據主要包括以下三種類型:
【內核及系統日志】
【用戶日志】
【程序日志】
Linux系統本身和大部分服務器程序的日志文件默認情況下都放置在目錄“/var/log”中。一部分程序公用一個日志文件,一部分程序使用單個日志文件,而有些大型服務器程序由於日志文件不止一個,所以會在“/var/log”目錄中建立相應的子目錄來存放日志文件,這樣既保證了日志文件目錄的結構清晰,又可以快速地定位日志文件。有相當一部分日志文件只有root用戶才有權限讀取,這保證了相關日志信息的安全性。
例1:列表查看“/var/log”目錄中的各種日志文件及子目錄。
對於Linux系統中的一些常見日志文件,有必要熟悉其相應的用途,這樣才能在需要的時候更快地找到問題所在,及時解決各種故障。常見的日志文件如下:
/var/log/messages:記錄Linux內核消息及各種應用程序的公共日志信息,包括啟動、IO錯誤、網絡錯誤、程序錯誤等。對於未使用獨立日志文件的應用程序或服務,一般都可以從該日志文件中獲得相關的事件記錄信息。
/var/log/cron:記錄crond計划任務產生的事件信息。
/var/log/dmesg:記錄Linux系統在引導過程中的各種事件信息。
/var/log/maillog:記錄進入或發出系統的電子郵件活動。
/var/log/lastlog:最近幾次成功登錄事件和最后一次不成功登錄事件。
/var/log/rpmpkgs:記錄系統中安裝的各rpm包列表信息。
/var/log/secure:記錄用戶登錄認證過程中的事件信息。
/var/log/wtmp:記錄每個用戶登錄、注銷及系統啟動和停機事件。
/var/run/utmp:記錄當前登錄的每個用戶的詳細信息。
二、日志文件分析
分析日志文件的目的在於通過瀏覽日志查找關鍵信息,對系統服務進行調試,判斷發生故障的原因等。
對於大多數文本格式的日志文件,只要使用tail、more、less、cat等文本處理工具就可以查看日志內容。而對於一些二進制格式的日志文件,則需要使用相應的查詢命令。
1、內核及系統日志
內核及系統日志功能主要由
默認安裝的sysklogd-1.4.1-39.2軟件包提供,該軟件包安裝了klogd、syslogd兩個程序,並通過syslog服務進行控制,
分別用於記錄系統內核的消息和各種應用程序的消息。syslog服務所使用的配置文件為“/etc/syslog.conf”。
例2:查看日志配置文件“/etc/syslog.conf”中的內容。
從配置文件“/etc/syslog.conf”中可以看到,受syslogd服務管理的日志文件都是Linux系統中最主要的日志文件,他們記錄了Linux系統中內核、用戶認證、郵件、計划任務等最基本的系統消息。在Linux內核中,根據日志消息的重要程度不同,將其分為不同的優先級別(數字等級越小,優先級越高,消息越重要)。
0 EMERG(緊急):會導致主機系統不可用的情況。
1 ALERT(警告):必須馬上采取措施解決的問題。
2 CRIT(嚴重):比較嚴重的情況。
3 ERR(錯誤):運行出現錯誤。
4 WARNING(提醒):可能影響系統功能,需要提醒用戶的重要事件。
5 NOTICE(注意):不會影響正常功能,但是需要注意的事件。
6 INFO(信息):一般信息。
對於syslog服務統一管理的大部分日志文件,使用的日志記錄格式基本上都是相同的。以下以公共日志文件“/var/log/messages”為例來簡單介紹內核及系統日志記錄的基本格式。
例3:查看公共日志文件“/var/log/messages”的最后3行記錄。
日志文件中的每一行表示一條消息,每個消息均由四個字段的固定格式組成。
【時間標簽】:消息發出的日期和時間。
【主機名】:生成消息的計算機的名稱。
【子系統名稱】:發出消息的應用程序的名稱。
【消息】:消息的具體內容。
在有些情況下,可以設置syslog,使其在把日志信息記錄到文件的同時將日志信息發送到打印機進行打印,這樣無論網絡入侵者怎么修改日志都不能清除入侵的痕跡。syslog日志服務是一個常會被攻擊的顯著目標,破壞了它將會使管理員難以發現入侵以及入侵的痕跡,因此要特別注意監控其守護進程以及配置文件。
2、用戶日志
在wtmp、utmp、lastlog等日志文件中,保存了系統用戶登錄、退出等相關事件的事件消息。但是這些文件都是二進制的數據文件,不能直接使用tail、less等文本查看工具進行瀏覽,
需要使用who、w、users、last和ac等用戶查詢命令來獲取日志信息。
【who命令】
who命令用於查詢utmp文件並報告當前登錄的每個用戶信息。使用該命令,系統管理員可以查看當前系統存在哪些不合法用戶,從而對其進行審計和處理。who的默認輸出包括用戶名、終端類型、登錄日期及遠程主機。
例4:使用who命令查看當前登錄的各用戶的所在終端、登錄日期/時間/地點等信息。
【w命令】
用於查詢utmp文件並顯示當前系統中的每個用戶及其所運行的進程信息。
例5:使用w命令查看當前登錄的各用戶信息及所運行的進程。
【users命令】
users命令用單獨的一行打印出當前登錄的用戶,每個顯示的用戶名對應一個登錄會話。如果一個用戶有不止一個登錄會話,那他的用戶名將顯示與其相同的次數。
例6:使用users命令查看當前的用戶登錄會話情況。
【last命令】
last命令用於查詢wtmp文件,顯示出自從該文件被創建以來登錄過的所有用戶記錄,最近登錄的用戶記錄將顯示在最前面。
例7:使用last命令查看系統中最近的五次用戶登錄記錄。
【ac命令】
ac命令將查詢wtmp文件中的用戶登錄和退出情況,報告用戶連接的總時間(小時)。使用用戶名作為參數,在結合“-d”選項可以按每天進行統計。未指定用戶名時,可以使用“-p”選項進行分別統計。
例8:統計gzj用戶在每天的連接時間。
例9:分別統計各用戶的總連接時間。
3、程序日志
在Linux系統中,還有相當一部分應用程序並沒有使用syslog服務來管理日志,而是由程序自己維護日志記錄。例如,
http網站服務程序使用兩個日志文件access_log和error_log,一般存放在“/var/log/httpd/”目錄中,分別記錄客戶訪問事件、錯誤事件;
而FTP服務程序可以將與文件上傳、下載事件相關的消息記錄在xferlog文件中。由於不同應用程序的日志記錄格式 差別較大,並沒有嚴格使用統一的格式,這里不再詳細進行介紹。
總的來說,作為一名合格的系統管理人員,應該提高警惕,隨時注意各種可疑狀況,定期並隨機的檢查各種系統日志文件,包括一般信息日志、網絡連接日志、文件傳輸日志以及用戶登錄日志記錄等。在檢查這些日志時,要注意是否有不合常理的時間或操作記錄。例如以下一些不合理的現象。
a、用戶在非常規的時間登錄,或者用戶登錄系統的IP地址和以往的不一樣。
b、用戶登錄失敗的日志記錄,尤其是那些一再連續嘗試進入失敗的日志記錄。
c、非法使用或不正當使用超級用戶權限。
d、無故或者非法重新啟動各項網絡服務的記錄。
e、不正常的日志記錄,比如日志的殘缺不全,或者是諸如wtmp這樣的日志文件無故地缺少了中間的記錄文件。
另外,尤其提醒管理人員注意的是:日志並不是完全可靠的,高明的黑客在入侵系統后,經常會打掃現場。所以需要綜合運用以上的系統命令,全面、綜合地進行審查和檢測,切忌斷章取義,否則將可能做出錯誤的判斷。
三、日志管理策略
鑒於日志數據資料的重要性,對於系統運行過程中產生的各種日志文件,必須采取有針對性的管理策略,以確保日志數據的准確性、安全性和真實性。一般來說,可以從以下幾個方面進行考慮。
1、日志備份和歸檔
2、延長日志保存期限
3、控制日志訪問權限
4、集中管理日志
一、查看系統的運行級別
不同的運行級別代表了系統不同的運行狀態所能運行的服務或程序會有所區別,明確當前所處的運行級別將有助於管理員對一些應用故障的排除。若未能確知當前所處的運行級別,
可以使用runlevel命令進行查詢,輸出結果中分別包含切換前的級別和目前的級別。
【例1】:查看系統的運行級別狀態,若之前未切換過運行級別,第一列將顯示“N”。
二、切換系統運行級別
當用戶需要將系統轉換為其他的運行級別時,可以使用init程序命令進行,只要使用與運行級別相對應的數字(0-6)作為命令參數即可。
若要設置系統開機后默認進入的運行級別,則編輯“/etc/inittab”配置文件。
【例2】:關閉當前系統。
【例3】:重啟當前系統。
三、設置系統服務在不同運行級別中的狀態
在Linux系統中包含了大量的服務程序,這些服務程序在切換運行級別時由rc腳本根據預設的狀態進行啟動或終止。當然,對於某個系統服務在特定的運行級別中是否運行,這完全可以由管理員自行決定。
需要調整各種系統服務在不同運行級別中的自啟動狀態時,可以使用chkconfig或者ntsysv命令進行操作。
1、使用ntsysv配置工具
ntsysv工具可以在字符模式中運行,為用戶提供了交互式操作的界面,專門用於集中配置各種系統服務的啟動狀態。單獨執行“ntsysv”命令時僅用於管理當前運行級別中的服務,若使用“--level”選項,則可以對指定運行級別中的服務進行管理。例如,執行“ntsysv --level 35”命令后,將打開一個交互式的程序界面,可以同時設置在運行級別3、5中各服務的啟動狀態。
操作時使用上下箭頭鍵選擇不同的服務項,按空格鍵切換啟動狀態,“[*]”表示自動啟動,“[ ]”表示不要自動啟動。按F1鍵可以獲取關於某項服務的詳細說明,以便決定是否應加載。
當需要同時設置大量服務的啟動狀態時,選擇使用ntsysv配置工具要更加合適。
2、使用chkconfig配置工具
chkconfig配置工具與ntsysv的功能類似,但是並不提供交互式的操作界面,當需要設置個別服務在不同運行級別的啟動狀態時,選擇使用chkconfig命令要更有效率。
將chkconfig命令與“--list”選項配合使用,可以查看特定服務在不同運行級別中的啟動狀態,若未指定服務名稱,則將顯示所有服務的啟動狀態。
【例4】:查看network服務在各運行級別中的啟動狀態。
【例5】:查看系統中所有服務在各運行級別中的啟動狀態。
將chkconfig命令與“--level”選項配合使用,可以設置指定服務在指定運行級別中的啟動狀態。較常用的命令格式如下:
chkconfig --level 運行級別列表 服務名稱 on|off
【例6】:將network服務在運行級別2、4中的啟動狀態設置為off
【例7】:將network服務在運行級別2-5中的啟動狀態均設置為on
當缺少“--level”選項時,有時候也可以設置指定服務在不同運行級別的狀態,但是這種方式的設置結果會受到該服務腳本文件中狀態參數的影響,存在不確定性,因此不建議使用。
【例8】:使用不帶“--level”選項的chkconfig命令將vncserver服務的啟動狀態設置為關閉。
1、init進程
Linux系統中的進程使用數字進行標記,每個進程的身份標記號稱為PID。
在引導Linux系統的過程中,“/sbin/init”是內核第一個加載的程序,因此init進程對應的PID號永遠為“1”。
init進程運行以后將陸續執行系統中的其他程序,不斷生成新的進程,這些進程稱為init進程的子進程,反過來說init進程是這些進程的父進程。當然,這些子進程也可以進一步生成各自對的子進程,依次不斷繁衍下去,最終構成一棵枝繁葉茂的進程樹,共同為用戶提供服務。
init進程正是維持整個Linux系統運行的所有進程的“始祖”,因此init進程是不允許被輕易終止的。需要切換不同的系統運行狀態時,可以分配給init程序正確的執行參數,由init自身來完成。
2、inittab配置文件
inittab文件位於“/etc”目錄中,是init程序的配置文件,init進程運行后將按照該文件中的配置內容依次啟動系統中需要運行的腳本和程序。
查看“/etc/inittab”文件中的有效配置行:
在“/etc/inittab”文件中,除了以“#”號開頭的注釋信息和空行以外,每一行都視為一條有效配置記錄。每條配置記錄中的四個字段之間使用半角的冒號“:”進行分割,基本格式如下:
id:runlevels:action:process
意思如下:
標記:運行級別:動作類型:程序或腳本
各個字段的作用如下:
【id---標記字段】
標記字段可以由1-4個字符組成,用以區別於其他行的配置。在inittab文件中每條配置記錄的id標記字段應是唯一的。
【runlevels---運行級別字段】
在Linux系統中,將各種系統服務程序相互組合構成不同的搭配關系,分別滿足不同的系統需求,系統在運行時,采用的每一種服務搭配稱之為“運行級別”。默認的系統運行級別包括七種,其功能和服務各部相同。
0:關機狀態,使用該級別時將會關閉主機。
1:單用戶模式,不需要密碼驗證即可登錄系統,多用於系統維護。
2:字符界面的多用戶模式(不支持網絡)。
3:字符界面的完整多用戶模式,大多數服務器主機的運行在此級別。
4:未分配使用。
5:圖形界面的多用戶模式,提供了圖形桌面操作環境。
6:重新啟動,使用該級別時將會重啟主機。
【action---動作類型字段】
動作類型字段描述了該行配置所對應的操作類別,一般為固定值,較常用的類型如下:
initdefault:設置初始化系統后默認進入的運行級別。
sysinit:設置系統初始化的操作腳本。
wait:init進程將等待該行配置所對應的腳本操作完成后,再繼續執行其他操作。
ctrlaltdel:設置當用戶按下Ctrl+Alt+Delete組合鍵后的操作。
powerokwait:設置當系統收到恢復供電信號時采取何種動作。
respawn:一旦該行配置所對應的進程被終止,則重新啟動該進程。
【process---程序或腳本字段】
此字段用於指定該行配置所對應的實際操作,可以是具體的命令、腳本程序等。
3、rc.sysinit腳本文件
rc.sysinit是init進程所調用的系統初始化腳本,位於“/etc/rc.d/rc.sysinit”,這也是在inittab配置文件中設置好的。
rc.sysinit腳本主要完成包括設置網絡、主機名、加載文件系統、設置時鍾等一系列初始化工作。
4、rc腳本文件
rc腳本同樣由init進程進行調用,文件位於“/etc/rc.d/rc”。
rc腳本通過指定不同的級別參數分別加載及終止不同的系統服務,進入到相應的系統運行級別。
在“/etc/rc.d/rc0.d”---“/etc/rc.d/rc6.d”目錄中,保存了一些特殊的符號鏈接文件。
rc腳本根據這些目錄中的鏈接文件名及其所鏈接到的系統服務腳本,進行啟動或終止相關服務程序的操作。
“/etc/rc.d/rcX.d”目錄中的鏈接文件具有共同的規律:文件名以K或S開頭,中間是數字序號,最后是系統中的服務腳本名;所鏈接的原始服務腳本文件位於“/etc/rc.d/init.d”目錄中,
其中以S開頭的文件表示啟動對應的服務,以K開頭的文件表示終止對應的服務,中間的數字表示在啟動或終止服務時的執行順序。
位於“/etc/rc.d/init.d”目錄中的各種系統服務腳本,基本上都可以直接執行腳本文件或通過“service’服務控制工具進行管理,例如,添加“start”、“stop”、“restart”、“status”等參數完成對應服務的啟動、終止、重啟、查詢狀態等操作。對於系統服務程序,一般建議使用這種方式啟動或終止,而不是使用殺死進程的命令。對處於實際工作環境中的服務器程序,建議改用“reload”參數重新加載配置,而不是生硬地使用“restart” 重啟服務,以免造成客戶端訪問中斷,帶來不必要的損失。
5、rc.local腳本文件
rc.local腳本是一個額外的啟動控制文件,位於“/etc/rc.d/rc.local”。rc.local腳本通常由rc腳本在最后進行加載,其作用主要是為管理員自行設置啟動命令提供一種途徑。需在再開機后自動執行的一些命令操作,都可以添加到該文件中。