本文將以Linux系統為例,說明在systemd管理架構下的journald系統日誌管理機制管理者可利用此機制來完整的掌握相關的系統日誌。此外,也將說明如何建置一套具備網頁介面的管理系統軟體Cockpit,讓管理者能夠更加便利地管理相關系統日誌。
相信每一個系統管理人員都不會否認系統日誌(System Log)的重要性。管理人員可藉由分析系統日誌來獲得系統運作的相關歷程資訊,進而排除系統運作的相關問題。另一方面,從資安監控的角度來看,也可經由分析系統日誌的方式來挖掘出潛在的資安威脅,例如大量不正常的登入失敗紀錄,就可能代表系統曾被以猜測密碼的方式進行暴力攻擊,因此一般作業系統均會提供完整的系統日誌管理功能。
在本文中,將以Linux系統為例,說明在systemd管理架構下的journald系統日誌管理機制,管理者可利用此機制來完整掌握相關的系統日誌。除此之外,也將說明如何建置一套具備網頁介面的管理系統軟體Cockpit(https://cockpit-project.org/),讓管理者能夠更便利地管理相關系統日誌,而此次使用的作業系統是RockyOS 10。
什麼是systemd.journald
早期Linux系統通常使用init(又稱為SysVinit)架構來進行開機後初始化系統及管理系統服務等工作,但因其執行速度過慢及缺乏統一的管理方式等缺點,而逐漸被systemd架構所取代。
相較於傳統的init架構,systemd改良了其開機初始化緩慢的缺點,利用系統上各個服務的依賴關係來同時啟動多個系統服務,也因此可顯著地提高開機速度。除此之外,更提供單一的命令管理工具(名稱為systemctl),讓管理者能夠使用一致性的指令來管理系統服務運作(例如啟動或停止系統服務),並且提供journald系統服務來整合管理系統日誌,其主要的功能如下所述:
集中式日誌管理
在Syslog架構中通常會將不同系統服務種類(例如HTTP、FTP等網路服務)的日誌分別儲存至個別的檔案上,而造成關聯分析上的困難,為避免此類缺點,journald採用類似資料庫的概念來完整儲存所有的系統日誌。
採用結構化的二進位日誌內容
利用類似資料庫結構的方式(欄位名稱=資訊)來儲存日誌資訊,讓管理者可方便地以查詢欄位的方式來取得相關的日誌資訊,而無須藉助繁雜的文字分析,才能取得所需的日誌資訊。其常用欄位資訊如下所示:
‧_REALTIME_TIMESTAMP:此欄位記錄事件發生的時間。
‧_HOSTNAME:此欄位記錄該系統的主機名稱。
‧_PID:記錄執行程式的程序編號(Process Identifier,PID)。
‧_UID:記錄執行程式所使用的使用者權限編號(User ID)。
‧_GID:記錄執行該程式所使用的群組權限編號(Group ID)。
‧_COMM:此欄位記錄所執行程式的名稱。
‧_EXE執行檔路徑:記錄所執行程式的路徑位置。
‧PRIORITY:嚴重等級,用於表示事件所代表的嚴重程度,以數字0~7來表示不同的嚴重等級,數值越小代表事件越嚴重,相關資訊如表1所示。
‧MESSAGE:此欄位記錄主要的系統日誌內容資訊。
提供多樣化的輸出格式
可提供如json、short(簡短資訊格式,此為預設格式)、verbose(最詳細的格式,使用者可利用此輸出格式來查看所有的欄位資訊)等多樣化的輸出格式。
相關組態檔說明
在簡單了解journald的架構後,接著說明相關組態檔(預設使用sconf),常用的組態設定說明如下:
Storage
此組態為設定系統日誌儲存的形式,提供如下列選項: ‧auto:此為預設選項,在一般情況下,journald會以記憶體來儲存系統日誌。其缺點為系統關機或重新開機,相關的系統日誌資訊就會遺失。當設定此選項,除了將系統日誌儲存在記憶體外,另外會檢查系統是否有「/var/log/journal」實體目錄,若有此目錄即會將相關系統日誌儲存在此目錄中。
‧persistent:設定將系統日誌儲存在實體磁碟目錄(/var/log/journal)之中,管理者必須自行建立此磁碟目錄。
‧volatile:設定僅將系統日誌儲存在系統記憶體之中(/run/log/journal)。
‧none:設定不儲存任何的系統日誌。
Compress
能夠設定是否要對系統日誌的資訊進行壓縮,以降低儲存空間,預設為yes。
Seal
設定是否要對系統日誌進行完整性的保護,預設為yes。
RuntimeMaxUse
當使用記憶體來儲存系統日誌,此組態將設定使用的最大記憶體容量,例如RuntimeMaxUse=200M表示最大能使用200M記憶體。
MaxRetentionSec
設定系統日誌的保存期限,例如設定「MaxRetentionSec=1month」表示為保留1個月,可使用的時間單位包括day(天數)、week(週數)、month(月)、year(年)。
ForwardToSyslog
設定是否要將取到的系統日誌轉發至其他的日誌軟體,例如rsyslog程式。
SystemMaxUse
限制系統日誌能夠使用的最大磁碟容量,例如設定「SystemMaxUse=1G」表示最多能使用1G的磁碟空間來儲存系統日誌。若超過所設定的容量,便會清除舊的系統日誌。
SystemMaxFileSize
限制單一系統日誌檔能夠使用的最大磁碟容量,例如設定「SystemMaxFileSize=100M」表示單一個系統日誌檔最大為100M。若超過設定的容量,就另存至其他檔案。
SystemKeepFree
設定必須保留的最小可用磁碟空間,一旦系統日誌占用太多的磁碟空間而導致剩餘磁碟空間容量低於此設定值時,就會自動刪除舊有的系統日誌檔案,以保持可使用的磁碟空間容量。例如設定「SystemKeepFree=500M」表示最少須保留500M的系統磁碟空間。
SystemMaxFiles
設定可保留的系統日誌檔案數量,例如「SystemMaxFiles=20」表示最多保留20個系統日誌檔案。
除此之外,為了預防惡意使用者在短時間內產生大量的系統日誌,藉此癱瘓系統日誌機制,提供下列防護設定來避免遭受此類攻撃:
RateLimitIntervalSec 30
設定寫入系統日誌的時間區間,單位為秒。
RateLimitBurst
在RateLimitIntervalSec所設定的時間區間內,最多能夠儲存的系統日誌筆數,如下例即表示在30秒內最多可儲存100筆的系統日誌筆數:
RateLimitIntervalSec 30 RateLimitBurst 1000
使用管理工具journalctl
介紹過相關組態檔後,接下來說明如何使用Journald的管理工具journalctl進行相關系統日誌的查詢。在此將利用其結構化的特性,以時間、系統服務名稱、嚴重等級及關鍵字查詢日誌內容(MESSAGE)等屬性來查詢相關日誌資訊:
依時間屬性查詢
管理者可利用since(起始時間)與until(結束時間)等參數來查詢某個時間區間中的系統日誌,如下例為使用since參數來查詢1小時之內的所有系統日誌,輸出如圖1所示:
圖1 使用since參數來查詢1小時內的所有系統日誌。
journalctl --since "1 hour ago"
若要查詢某個時間區間的系統日誌,即可使用since(設定起始時間)及until(設定結束時間)參數,如下例所示:
journalctl --since "2026-03-01 01:00:00" --until "2026-03-30 12:00:00"
依系統服務名稱查詢
可使用-u參數來查詢某個系統服務所產生的系統日誌,如下例即為查詢ssh伺服器的相關系統日誌:
journalctl -u sshd
或者與since參數搭配,查詢某個時間區間內的特定系統服務日誌,如下例為查詢找出1小時內的ssh日誌:
journalctl -u sshd --since "1 hour ago"
依關鍵字查詢
可使用-g參數來查詢搜尋系統日誌中的訊息(message)欄位。以查詢ssh登入成功為例,因為在登入成功後,其相關日誌訊息中會有如「Accepted password」的資訊,因此可用下例之指令,查詢1小時內登入ssh成功的日誌:
journalctl -u sshd -g "Accept" --since "1 hour ago"
依嚴重等級查詢
可使用-p參數來查詢符合嚴重程度等級的系統日誌,如下例將查詢嚴重程度為警告等級以上的系統日誌:
journalctl -p warning
輸出
journald支援多樣化的輸出,可使用-o參數將所查詢到的系統日誌以特定格式輸出(支援verbose、json等多種輸出格式)。如下例為將ssh服務的系統日誌,以json格式輸出:
journalctl -u sshd -o json
其他
可使用--disk-usage參數來顯示磁碟的系統日誌使用空間,如下例所示:
Journalctl --disk-usage
或使用-k查詢系統核心(Kernel)的系統日誌。此外,可利用--list-boots來列出開機的相關歷程,如圖2所示。
圖2 列出開機的相關歷程。
管理者除了使用指令方式查詢相關系統日誌外,也可安裝Cockpit軟體更加便利地查詢相關資訊。
安裝並使用Cockpit
Cockpit是一套網頁介面的系統管理工具,官方網站為「https://cockpit-project.org/」,主要的目的在於讓管理者透過瀏覽器即可輕鬆管理Linux系統主機,而其中即包含系統日誌管理功能(systemd-journald),在本文中將使用此功能來查詢系統日誌。
首先,用如下指令安裝Cockpit:
dnf install cockpit
在安裝成功後,就能夠執行以下的指令來啟動Cockpit服務:
systemctl start cockpit.socket
接著,使用下列指令來查看Cockpit服務是否已經啟動成功:
systemctl status cockpit.socket
在確認啟動成功後,即可透過「https://[IP]:9090/」連線至Cockpit服務。首先會要求帳號及密碼,如圖3所示。
圖3 登入時要求輸入帳號及密碼。
在輸入系統上的使用者帳號及密碼後,即可進入主功能管理頁面,如圖4所示。
圖4 進入主功能管理頁面。
而後,選取「系統日誌」功能,如圖5所示。
圖5 選取「系統日誌」功能,查詢所需要的系統日誌。
至此,就能夠利用Cockpit提供的圖形化查詢介面來查詢所需要的系統日誌了。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>