保證Linux系統安全之分析和排查系統故障

在處理Linux操作系統出現的各種故障時,故障的症狀是最容易發現的,但導致故障的原因纔是最終排除故障的關鍵。熟悉Linux操作系統中常見的日誌文件,瞭解一般故障的分析與解決辦法,將有助於管理員快速定位故障點,“對症下藥”,及時解決各種系統問題。

博文大綱:
一、分析日誌文件;
二、排除系統啓動類故障;
三、排除文件系統類故障;

一、分析日誌文件

日誌文件是用於記錄Linux操作系統中各種運行消息的文件,相當於Linux主機的“日記”。不同的日誌文件記載了不同類型的信息,如Linux內核消息、用戶登錄事件、程序錯誤等。

日誌文件對於診斷和解決系統中的問題很有幫助,因爲在Linux操作系統中運行的程序通常會把系統消息和錯誤消息寫入相應的日誌文件,這樣系統一旦出現問題就會“有據可查”,此外,當主機遭受 破壞時,日誌文件還可以幫助尋找破壞 者留下別的痕跡。

1.主要日誌文件

在Linux操作系統中,日誌數據主要包括以下三種類型:

  • 內核及系統日誌:這種日誌數據由系統服務rsyslog統一管理,根據其主配置文件/etc/rsyslog.conf中的設置決定將內核消息及各種系統程序消息記錄到什麼位置。 系統中有相當一部分程序會把自己的日誌文件交由rsyslog管理,因而這些程序使用的日誌記錄也具有相似的格式;
  • 用戶日誌:這種日誌數據用於記錄Linux操作系統用戶登錄及退出系統的相關信息,包括用戶名、登錄的終端、登錄時間、來源主機、正在使用的進程操作等;
  • 程序日誌:有些應用程序會選擇由自己獨立管理一份日誌文件(而不是交給rsyslog服務管理),用於記錄本程序運行過程中的各種事件信息。由於這些程序只負責管理自己的日誌文件,因此不同程序所使用的日誌記錄格式可能會存在較大的差異;

Linux操作系統本身和大部分的服務器程序的日誌文件都默認放在目錄/var/log/下。一部分程序公用一個日誌文件,一部分程序使用單個日誌文件;而有些大型的服務程序由於日誌文件不止一個,所以會在/var/log/目錄中建立相應的子目錄來存放日誌文件,這樣既保證了日誌文件目錄的結構清晰,又可以快速定位日誌文件。有相當一部分日誌文件只有root用戶纔有權限讀取,這保證了相關信息的安全性。

對於Linux操作系統中的日誌文件,有必要了解其各自的用途,這樣才能在需要的時候更快地找到問題所在、及時地解決各種故障。

常見的一些日誌文件,如圖:
保證Linux系統安全之分析和排查系統故障

2.日誌文件分析

分析日誌文件的目的在於通過瀏覽日誌查找關鍵信息,對系統服務進行調試,以及判斷髮生故障的原因等。

對於大多數文本格式的日誌文件(如內核及系統日誌、大多數的程序日誌),可以使用tail、more、cat、less等命令進行查看,對於一些特殊的二進制的日誌文件(如用戶日誌)則需要使用特定的查詢命令。

(1)內核及系統日誌

rsyslog服務所使用的配置文件爲/etc/rsyslog.conf。

[root@localhost ~]# grep -v "^$" /etc/rsyslog.conf 
//過濾空行
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### MODULES ####
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
                      ……………………                       //省略部分內容

從配置文件中可以看出,受rsyslog服務管理的日誌文件都是Linux操作系統中主要的日誌文件,它們記錄了Linux操作系統中內核、用戶認證、電子郵件、計劃任務等基本的系統消息。在Linux內核中,根據日誌消息的重要程度不同,將其分爲不同的優先級別(數字越小,優先級越高,消息越重要)。如圖:
保證Linux系統安全之分析和排查系統故障
內核及大多數系統消息被記錄到公共日誌文件/var/log/messages中,而其他一些程序消息被記錄到各自獨立的日誌文件中,此外日誌消息還能夠記錄到特定的存儲設備中,或者直接發送給指定用戶。

對於rsyslog服務統一管理的大部分日誌文件,使用的日誌記錄格式基本上是相同的。以公共日誌/var/log/messages文件的記錄格式爲例,其中每一行表示一條日誌消息,每一條消息均包括以下四個字段:

  • 時間標籤:消息發出的日期和時間;
  • 主機名:生成消息的計算機名稱;
  • 子系統名稱:發出消息的應用程序的名稱;
  • 消息:消息的具體內容;

在有些情況下,可以設置rsyslog,使其在把日誌信息記錄到文件的同時將日誌信息發送到打印機進行打印,這樣無論網絡 非法進入 者怎麼修改日誌都不能清除***的痕跡。rsyslog日誌服務是一個常被 破壞 的的顯著目標,破壞了它將管理員難以發現 非法進入 及相關信息,因此要特別注意監控其守護進程及配置文件。

(2)用戶日誌

在wtmp、btmp、lastlog等日誌文件中,保存了系統用戶登錄、退出等相關的時間消息。但是這些文件都是二進制的數據文件,不能直接使用tail、less等文本查看工具進行瀏覽,需要使用who、w、users、last和lastb等用戶查詢命令來獲取日誌信息。

1)查詢當前登錄的用戶情況——users、who、w命令

user命令只是簡單地輸出當前登錄的用戶名稱,每個顯示的用戶名對應一個登錄會話。如果一個用戶有不止一個登錄會話,那麼他的用戶名將顯示與其相同的次數。操作如下:

[root@localhost ~]# users
(unknown) root root root

who命令用於報告當前登錄到系統中的每個用戶的信息。使用該命令,系統管理員可以查看當前系統存在哪些不合法的用戶,從而對其進行審計和處理。who的默認輸出包括用戶名、終端類型、登錄日期及遠程主機。操作如下:

[root@localhost ~]# who
(unknown) :0           2019-09-10 00:01 (:0)
root     tty2         2019-09-10 00:10
root     pts/0        2019-09-09 16:25 (192.168.1.253)
root     tty3         2019-09-09 16:42

w命令用於顯示當前系統中的每個用戶及其運行的進程信息,比users、who命令的輸出內容更豐富一些,操作如下:

[root@localhost ~]# w
 16:49:29 up 48 min,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCU WHAT
root     tty2                      00:10     ?     0.84s  0.84s -bash
root     pts/0    192.168.1.253    16:25    1.00s  0.10s  0.06s w
root     tty3                      16:42     ?     0.08s  0.03s -bash

2)查詢用戶登錄的歷史記錄——last、lastb命令

last命令用於查詢成功登錄到系統的用戶記錄,最近的登錄情況將顯示在最前面。

[root@localhost ~]# last
xiaoli   tty3                          Thu Sep 12 04:49   still logged in   
root     pts/0        192.168.1.253    Thu Sep 12 04:47   still logged in   
root     tty2                          Thu Sep 12 04:46   still logged in   

lastb命令用於查詢登錄失敗的用戶記錄,如登錄的用戶名錯誤,密碼不正確等情況都將記錄下來。

[root@localhost ~]# lastb
xiaowang tty3                          Thu Sep 12 04:52 - 04:52  (00:00)    
xiaoli   tty3                          Thu Sep 12 04:52 - 04:52  (00:00)    

除了使用lastb命令以外,還可以查看安全日誌/var/log/secure。查看日誌文件可以使用webalizer、Awstats軟件可以通過圖形化查看日誌,通俗易懂!

3)程序日誌

在Linux操作系統中,還有相當一部分應用程序沒有使用rsyslog服務來管理日誌,而是由程序自己維護日誌記錄。例如:http網站服務等。不同應用程序i的日誌記錄格式差別很大,且沒有嚴格使用統一的格式。

作爲一名合格的系統管理人員,應該提高警惕,隨時注意各種可疑狀況,定期並隨機檢查各種系統日誌文件,包括一般信息日誌、網絡連接日誌、文件傳輸日誌及用戶登錄日誌記錄等。在檢查這些日誌時,要注意是否有不和常理的時間或操作記錄。

出現以下情況之一,就需要多加註意:

  • 用戶在非常規的時間登錄,或者用戶登錄系統的IP地址和往常的不一樣;
  • 用戶登錄失敗的日誌記錄,尤其是那些一再連續嘗試進入系統失敗的日誌記錄;
  • 非法使用或不正當使用超級用戶權限;
  • 無故或者非法重新啓動各項網絡服務的記錄;
  • 不正常的日誌記錄,如日誌殘缺不全,或者比如wtmp這樣的日誌文件無故缺少了中間的記錄文件。

另外,需要管理人員注意的是,日誌並不是完全可靠的,聰明的黑 客在進入系統後經過會打掃現場。所以管理人員需要綜合運用以上的系統命令,全面、綜合地進行審查和檢測。切記不要斷章取義,否則將會做出錯誤的判斷。

二、排除系統啓動類故障

Linux操作系統的啓動過程涉及到MBR、GRUB啓動菜單、系統初始化配置文件等各方面,其中任何一個環節出現故障都可能導致系統啓動失常,因此一定要在注意好相關文件的備份工作。

1.MBR扇區故障

MBR扇區包括三部分:

  • 系統引導程序(GRUB引導菜單佔用446字節);
  • 分區表(最多可以有四個主分區,每個分區佔用16字節);
  • 扇區的結束標誌佔用2字節;

MBR位於物理硬盤的第一個扇區(512字節),該扇區又稱爲主引導扇區(MBR扇區),除了包含系統引導程序的部分數據外部分數據外,還包含整個硬盤的分區表記錄。當主引導扇區發生故障時,將很有可能無法進入引導才散,或者無法找到正確的分區位置而無法加載系統,通過該硬盤引導主機時很可能進入黑屏、死機狀態。

通過下面示例我們開始對MBR扇區進行備份、模擬破壞、修復的過程:

(1)備份MBR扇區數據

由於MBR扇區中包含了整個硬盤的分區表記錄,因此該扇區的備份文件必須存放到其他的存儲設備中,否則在恢復時將無法讀取到備份文件。例如:

[root@localhost ~]# mkdir /backup
[root@localhost ~]# mount /dev/sdb1 /backup
[root@localhost ~]# dd if=/dev/sda of=/backup/sda.mbr.bak bs=512 count=1
//使用dd命令將第一塊硬盤中的MBR扇區數據備份到第二塊硬盤sdb1分區中

關於硬盤分區等詳細情況可以參考博文:Linux磁盤和文件系統管理(一)

(2)模擬MBR扇區故障

[root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1
//使用/dev/zero(無限寫零)文件覆蓋原本的MBR扇區數據

系統重啓,將會出現“Operating system not found”的提示信息,表示無法找到可用的操作系統,因此無法啓動主機。

(3)從備份文件中恢復MBR扇區數據

由於MBR扇區被破壞以後,就無法再從硬盤啓動系統化,所以需要使用其他硬盤中的操作系統進行引導,或者使用Centos系統的安裝光盤進行引導,不管使用什麼方式,目的都是相同的——獲得一個可以執行命令的Shell環境,以便從備份文件中恢復MBR扇區中的數據。

我們使用系統盤引導爲例,操作如圖:
保證Linux系統安全之分析和排查系統故障
保證Linux系統安全之分析和排查系統故障
保證Linux系統安全之分析和排查系統故障
完成以上操作後,就會出現一個帶“sh-4.2#”提示符的bash環境,如圖:
保證Linux系統安全之分析和排查系統故障
完成恢復操作以後,執行“exit”命令退出當前臨時shell環境,系統將會自動重啓!

2.GRUB引導菜單故障

GRUB是大多數Linux操作系統默認使用的引導程序,可以通過啓動菜單的方式選擇進入不同的操作系統(如果有別的系統),當配置文件/boot/grub2/grub.cfg 丟失,或者關鍵配置出現錯誤,或者MBR中的引導程序遭到破壞時,
提前備份grub配置文件:

[root@localhost ~]# vim /boot/grub2/grub.cfg 
[root@localhost ~]# mv /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
//將原本的grub配置文件改名

重啓之後,Linux主機啓動後可能會出現“grub>”的提示符,無法完成進一步的系統啓動過程。如圖:
保證Linux系統安全之分析和排查系統故障
解決方案:
進入急救模式,如圖:
保證Linux系統安全之分析和排查系統故障
保證Linux系統安全之分析和排查系統故障
保證Linux系統安全之分析和排查系統故障
完成以上操作後,就會出現一個帶“sh-4.2#”提示符的bash環境,具體操作命令如圖:
保證Linux系統安全之分析和排查系統故障

當選擇啓動方式爲光盤啓動時,建議修改完成之後依然選擇硬盤啓動,也可以根據光盤啓動的提示信息手工選擇本地硬盤啓動,如圖:
保證Linux系統安全之分析和排查系統故障
保證Linux系統安全之分析和排查系統故障

完成以後操作後,系統就可正常啓動!

注意:CentOS7因爲使用的是grub2,配置文件同grub有不少變化,一定要切記備份grub.cfg以便恢復。

遺忘root密碼可以參考博文:遺忘Linux系統root密碼所採取的必要措施

無論是MBR扇區故障、GRUB引導菜單還是遺忘root密碼相關操作,都可進入急救模式進行修復。

三、排除文件系統類故障

文件系統及磁盤中所存儲的數據的價值是無法估量的,管理員的工作職責之一就是必須確保數據的安全。由於磁盤屬於易損耗品,無法預估它什麼時候會損壞,所以最好的辦法就是建立完整的備份機制。當系統出現文件系統或磁盤故障時沒一定要慎重處理。

1.修復文件系統

在Linux主機中,可能會因爲非正常關機、突然斷電、設備數據讀寫異常等原因導致文件系統破壞。比較常見的是超級快損壞。超級快是文件系統的核心“檔案”,它記錄了該文件系統的類型、大小、空閒磁盤塊等信息。

當文件系統的超級塊數據損壞是,Linux將無法識別該文件系統,掛載時會出現錯誤提示以致不能正常使用。執行下列操作可以破壞文件的超級塊數據庫。命令如下:

[root@localhost ~]# dd if=/dev/zero of=/dev/sdb1 bs=512 count=4
記錄了4+0 的讀入
記錄了4+0 的寫出
2048字節(2.0 kB)已複製,0.000868901 秒,2.4 MB/秒
[root@localhost ~]# mkdir /a
[root@localhost ~]# mount /dev/sdb1 /a
mount: /dev/sdb1 寫保護,將以只讀方式掛載
mount: 未知的文件系統類型“(null)”
[root@localhost ~]# vim /etc/fstab
                      ……………………                //省略部分內容
/dev/sdb1               /a                      xfs     defaults        0 1
//實現自動掛載

重啓系統後,會出現以下錯誤,如圖:
保證Linux系統安全之分析和排查系統故障
保證Linux系統安全之分析和排查系統故障
修復完畢!!!

2.磁盤資源耗盡故障

顯而易見,當一個文件系統的磁盤空間耗盡以後,將無法繼續在該分區中創建新的文件數據,從而導致故障的出現。

當因爲根分區磁盤空間不足,而無法啓動進入Linux操作系統時,可以進入急救模式,清理佔用大量空間的文件。可以使用命令“dd if=/dev/zer0 of=/a bs=1M count=999999”模擬故障。

除此之外,在每一個文件系統中,能夠使用的文件數量(對應i結點的數量)也是有限的,當一個文件系統被格式化後,其i結點數也就固定了,如果用戶故意消耗i結點數量,那麼,及時該分區有大量的空間,也不可以創建文件。

通過示例瞭解一下:

(1)模擬i結點耗盡故障

[root@localhost ~]# mkdir /a
[root@localhost ~]# mount /dev/sdb1 /a
[root@localhost ~]# df -i /a
文件系統          Inode 已用(I)  可用(I) 已用(I)% 掛載點
/dev/sdb1      10485248       3 10485245       1% /a

編寫一個小腳本,消耗i結點數量,腳本內容如下:

[root@localhost ~]# vim a.sh
#!/bin/bash
i=1
while [ $i -le 310485245 ]
do
touch /a/file$i
let i++
done
[root@localhost ~]# sh a.sh &
[root@localhost ~]# df -i /a
文件系統          Inode 已用(I)  可用(I) 已用(I)% 掛載點
/dev/sdb1      10485248    0   3 10485245       100% /a
[root@localhost ~]# touch /a/newfile
touch: 無法創建“/a/newfile” :設備上沒有空間
[root@localhost ~]# df -hT /a
文件系統            類型  容量  已用  可用 已用% 掛載點
/dev/mapper/cl-root xfs    17G  4.5G   13G   26% /

(2)修復i結點故障

[root@localhost ~]# rm -rf /a/file*

3.檢測硬盤壞道

磁盤壞道分爲邏輯壞道和物理壞道來哪種,前者是由於軟件操作不當造成,可以使用軟件修復工具進行修復,而後者是物理性損壞,只能通過更改磁盤分區或扇區的佔用位置進行進行改善,從而排除包含壞塊的磁盤空間,若磁盤出現以下現象,則有可能是磁盤出現壞道,需要檢測和修復。

  • 讀取磁盤中的數據時,磁盤設備發出異響;
  • 訪問磁盤中的某個文件時,反覆讀取且出錯,提示文件損壞;
  • 對於新建立的分區無法格式化;
  • 系統使用該磁盤時,頻繁死機;
  • 此案出現壞道後,如果不及時更換或進行技術處理,壞道則會越來越多,且可能造成頻繁死機和數據丟失的後果,因此必要時應該對磁盤進行定期檢測,檢測是否存在壞道。

在Linux系統中,檢測磁盤的壞道情況可以使用badblocks命令進行,結合“-s”用於顯示進度信息;“-v”選項用於顯示詳情。

[root@localhost ~]# badblocks -sv /sdb/sdb

在長期使用計算機的過程中,文件系統和磁盤類的故障現象很難完全避免,對於此類故障的修復需要十分謹慎,如果操作不當可能會加重數據破壞的程度。當發現磁盤中存在壞道時,應儘快停止系統中的應用服務、備份相關數據,必要時立即關閉系統一方磁盤壞道進一步擴散,避免導致更大的損失。對於存在壞道的硬盤設備,應使用其他完好的硬盤進行替換。

———————— 本文至此結束,感謝閱讀 ————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章