網站伺服器 日誌分析 logwatch 網路 開源碼

雜亂無章Syslog可讀性低 借力開源解析工具找出資訊

logwatch耙梳服務日誌 產出整合報表一目瞭然

2022-03-22
為了讓管理者輕鬆地查看網路服務日誌,本文將以解析SSH和Apache網站伺服器日誌為例,利用開放原始碼日誌分析軟體logwatch,將各種網路服務日誌如HTTP、FTP、SSH轉換成可讀性高的整合報表,如此就能夠更容易地分析日誌內容。

對系統管理人員而言,每日查看網路服務日誌(Log)是例行且重要的工作。但若未對原始的網路服務日誌進行處理,想要從一堆雜亂無章的日誌資料中分析出有用的資訊,相信是相當困難的。因此這裡將介紹一套開源碼Log分析軟體logwatch,利用此軟體就能夠將各種網路服務日誌(如HTTP、FTP、SSH)轉換成可讀性高的整合報表,幫助管理者更容易掌握日誌內容。在本文中,將以解析SSH(Secure Shell)及Apache網站伺服器日誌為例做示範,所使用的作業系統為CentOS 8 Stream。

Syslog標準簡介

對系統而言,詳實記錄系統的運作情形是不可或缺的系統功能之一,但系統種類繁多,如果各自定義日誌紀錄的格式,對於日後要有效地運用日誌來解析,相信會造成極大的困擾,也因此絶大部分的系統日誌都是會採用共通的日誌紀錄標準(Syslog)來記錄日誌。

Syslog是一種在TCP/IP網路中所定義的日誌紀錄標準,其架構為主從式的架構(Client-Server),由使用者端(Client)發出符合Syslog標準的日誌資訊至伺服器端(Server)進行儲存。一般而言,Linux系統會預設以rsyslog(官方網址為https://www.rsyslog.com/)軟體來完成此記錄日誌功能。

何謂Facility與Level

Syslog會以Facility(事件種類)與Level(事件嚴重程度)等條件來設定欲儲存的日誌資訊,必須符合這兩種條件的事件才會進行記錄。其中Facility用來表示某種事件種類,對系統而言,通常是指網路服務的種類,常見的Facility種類說明如下:

LOG_AUTH:記錄與系統認證相關的事件,例如SSH登入狀況。

LOG_CRON:記錄例行性程式的執行情況,例如以cron指令設定定時執行的動作,或以at指令設定某一個時間欲執行的動作。

LOG_DAEMON:記錄系統上常駐程式(Daemon)執行的相關資訊,通常為網路服務的運作情形。

LOG_FTP:記錄系統上FTP服務運作的相關資訊。

LOG_KERN:記錄系統核心(Kernel)運作的相關資訊。

LOG_MAIL:記錄系統上電子郵件服務運作的相關資訊。

Level則是表示此日誌紀錄所發生的事件嚴重程度,常見的Level嚴重程度說明如下:

LOG_INFO:此為最輕微的程度,一般來說,都是不影響系統或程式運作的一些基本資訊說明。

LOG_NOTICE:尚不會影響系統或程式運作,但可能有一些管理者需要注意的資訊。

LOG_WARNING:尚不致於影響系統的運作,但有可能會影響常駐程式的運作。

了解Syslog標準的格式

在了解Facility與Level的意義後,接下來繼續說明Syslog標準的格式,其格式很簡單,基本上劃分為四個部分,如圖1所示。

圖1  Syslog標準的格式說明。

(1) 此欄位記錄事件發生的日期與時間。

(2) 此欄位記錄發生事件的主機名稱。

(3) 此欄位記錄發生此事件的常駐程式名稱,如systemd。

(4) 此欄位記錄記錄此事件的詳細資料內容。

在預設的情況下,Linux會將大部分的日誌資訊儲存在「/var/log/messages」檔案內,而認證相關日誌資訊,則儲存在「/var/log/secure」檔案。

認識網站日誌紀錄共通標準(CLF)

就如同前述的Syslog標準一樣,網站伺服器也定義了一個共通的網站日誌標準(Common Log Format,CLF),用來記錄網站伺服器在運作過程中所產生的日誌,其格式如下所述:

Host  ident  authuser  date RequestLine  status  bytes

‧Host:此欄位用來記錄使用者端的IP或主機名稱。

‧Ident:此欄位通常不會使用,如果使用者端有使用辨識用戶身分(例如ident)的功能時,此欄位即會記錄由ident服務所回報的身分資訊。

‧Authuser:此欄位記錄相關認證的使用者名稱,例如網站伺服器有設定基礎的HTTP認證(Basic Access Authentication)就會記錄相關使用者名稱資訊。

‧Date:此欄位用來儲存使用者端對網站伺服器發起請求(Request)的日期與時間,即為使用者端連線時間。

‧RequestLine:此欄位用來儲存使用者端所發出請求的第一行資訊(又稱為Request Line),其格式如「method  Request-URI  HTTP-Version」。其中,method為使用者端連線網站伺服器時所使用的HTTP存取方法,例如POST、GET。Request-URI則表示所要存取的網路資源,例如某個網頁。而HTTP-Version,表示連線網站伺服器時所使用的HTTP通訊協定版本,例如1.1。

‧Status:此欄位儲存網站伺服器在完成使用者端的請求後,回覆給使用者端的的處理狀態碼(例如回覆404狀態碼即表示為無法找到網頁)。

‧Bytes:此欄位儲存網站伺服器在完成使用者端的請求後,回覆給客戶端內容的大小,其單位為位元組。

在預設的情況下,Apache網站伺服器會將相關的網站日誌資訊儲存在檔名為access_log的檔案上。如圖2所示,為網站日誌資訊的實際案例。

圖2  網站日誌資訊實際案例。

如何使用logwatch

一般而言,日誌處理軟體大致可分為兩種功能,其中一種是即時監控與處理系統日誌(例如一旦發現有惡意攻擊行為,就會立即中斷該連線),而另外一種則是將雜亂無章的日誌內容轉換成可讀性高的資訊,便於管理者進行檢視。logwatch則屬於後者,這是一款用Perl語言編寫的開源日誌解析程式,可將系統日誌轉換成可讀性的文字(Text)或HTML格式的檔案。因此,在實際應用上,管理者會定時(例如每天)產生相關報表資訊並以電子郵件發送,藉此來了解系統的運作狀態。接下來,安裝logwatch,可使用下列指令進行安裝:

yum install logwatch

在安裝完成後,便會提供一個名稱為logwatch的主要執行檔。另外,還會再新建幾個放置組態檔的目錄(以下簡稱「組態檔目錄」):

/etc/logwatch(以下簡稱logwatch目錄) /usr/share/logwatch/dist.conf/(以下 簡稱dist.conf目錄) /usr/share/logwatch/default.conf/(以 下簡稱default.conf目錄)

在剛開始使用logwatch時,這也曾讓筆者感到混淆,到底logwatch在執行時會參考那一個組態檔目錄,在檢視logwatch的程式後,推論logwatch在運作時,會先尋找logwatch目錄,若發現該目錄無相關的組態檔後,將接著尋找dist.conf目錄,最後才會使用default.conf目錄。

上述的組態檔目錄,僅有default.conf目錄下會有相關的預設組態檔,其餘的組態檔目錄下並不會有任何組態檔。因此為了方便起見,在本文中若需要更改組態檔,即會修改default.conf目錄下的組態檔。接著,說明組態檔目錄架構。

主要組態檔(檔名為logwatch.conf)

主要用來設定logwatch執行時所使用的組態設定,常用的組態設定如下所示:

LogDir=目錄名稱

設定欲解析日誌檔案的所在目錄,如「LogDir=/var/log/」,表示欲解析的日誌檔位於該目錄下。

Output = 輸出型式

設定設定轉換後日誌的輸出型式,提供下列輸出型式:stdout為輸出至控制台(Console);email是將轉換後日誌資料以電子郵件寄給管理者使用此輸出型式,需要同時設定MailTo及MailFrom組態;file為將轉換後日誌資料以檔案的方式儲存使用此輸出型式,需要同時設定Filename組態。

Format = 資料格式

設定轉換後日誌的資料輸出格式,提供text(以純文字格式輸出)、html(以HTML格式輸出)的資料格式。

Encode = 是否編碼

設定是否要以Base64演算法來編碼,若不需要便設定none,否則可設定為yes,表示以Base64來編碼輸出的資料。

MailTo = 電子郵件位址

若Output組態設定為email,即表示會將轉換後的日誌資訊寄至此電子郵件位址(通常可在此設定管理者的電子郵件位址)。

MailFrom

設定寄件者的來源資訊。

Filename

若Output設定為file,則會將轉換後的日誌資訊儲存在此組態所設定的檔案上。

Archives

若系統上的單一日誌檔案超過儲存容量(例如5M)時,就會將舊的日誌檔案儲存至另外一個檔案(通常會以「舊日誌檔名.1」的命名規則來命名)。若此組態設為yes,即表示在解析日誌檔案時,也會同步解析相關的舊日誌檔。設定為no,代表僅解析當前的日誌檔名。

Detail

設定要轉換日誌的詳細程度,可利用Low、Med、High或數字(0-10)來設定。

Service=網路名稱

設定要解析的網路服務名稱,logwatch會將可解析的網路服務設定在名稱為「services」的組態檔目錄中。使用者可設定單一網路服務(例如sshd)來解析單一網路服務的日誌,或設定all,表示要解析所有的網路服務的日誌。

Range =時間範圍

設定欲解析日誌檔案的時間範圍,提供下列的選項:All(表示欲解析整個日誌範圍)、Today(表示僅解析當日的日誌)、Yesterday(表示僅解析昨日的日誌)。

可解析網路服務種類(目錄名稱為services)

此目錄下的設定檔,主要用來設定欲解析的網路服務。其檔名會以網路服務的名稱來命名。例如,解析sshd服務的日誌,便會命名為sshd.conf,如圖3所示。

圖3  可解析網路服務種類。

在此以SSH服務(sshd.conf)為例,主要用來解析日誌檔案中關於SSH服務運作的相關日誌。在此組態檔中,主要是利用LogFile組態來設定欲解析的實際日誌檔的相關設定(實際的相關設定檔案位於「logfiles」目錄下的設定檔)。例如,LogFile = secure即表示將使用logfiles/secure.conf中的設定資料來取得SSH服務日誌檔案的資料,可設定多個組態,例如:

LogFile = secure LogFile = messages

這表示要使用logfiles/secure.conf及logfiles/messages.conf的設定資料。

日誌檔案設定資料(目錄名稱為logfiles)

此目錄下的設定檔,主要用來設定網路服務所產生日誌檔案的檔名等相關資訊,如圖4所示,例如sshd.conf若設定LogFile = secure,表示使用如圖4中的secure.conf的設定。

圖4  使用secure.conf的設定。

而secure.conf的內容,如圖5所示。

圖5  secure.conf檔案內容。

在簡單了解組態檔及主要組態檔的相關設定後,接著說明logwatch主程式的用法,其常用的參數說明如下:

--detail:即主要組態檔中(logwatch.conf)的detail組態,設定要轉換日誌的詳細程度。

--logfile:設定要解析的日誌檔名。

--logdir:即主要組態檔中的logdir組態,設定欲解析日誌檔案的所在目錄。

--output :為主要組態檔中的Output組態,設定轉換後日誌的輸出型式。

--format:主要組態檔中的format組態,設定轉換後日誌的資料輸出格式。

--encode:主要組態檔中的Encode組態,設定轉換後日誌的資料是否要以Base64演算法來編碼。

--mailto:主要組態檔中的MailTo組態,轉換後的日誌資料會寄至此電子郵件信箱。

--archives:主要組態檔中的archives組態,設定是否要同時解析舊的日誌檔資訊。

--filename:主要組態檔中的Filename組態,設定轉換後的日誌資料儲存的檔案位置。

--range:主要組態檔中的range組態,設定欲解析日誌檔案的時間範圍。

在使用時,可先設定logwatch.conf的資訊,再執行logwatch程式來解析或直接以logwatch加上相關參數的方式來執行,這裡採用後者的方式進行解析SSH服務及網站伺服器的日誌。

解析SSH日誌

解析SSH日誌時,執行如下的指令(其中#部分為註解):

#解析前一天的ssh服務日誌,並將解析過後的 資料,以文字型式儲存在/tmp/logwatch檔案上 logwatch --logdir /var/log  --range Yesterday  --output file  --format text  --service sshd  --filename /tmp/logwatch

執行後的結果,如圖6所示。

圖6  解析SSH日誌。

另外,更改上述format指令參數,由text更動為HTML,即可儲存成HTML格式的檔案,內容如圖7所示。

圖7  儲存成HTML格式的檔案。

解析網站伺服器日誌

可透過下列指令來解析前一日網站伺服器的日誌,並將轉換後的日誌資料,以文字型式儲存在logwatch:

logwatch --logdir [網站日誌所在目錄]   --range Yesterday --output file --format text --service http  --filename /tmp/ logwatch

同樣地,若更改上述format指令參數,由text更動為HTML,即可儲存成HTML格式的檔案。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>
 


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!