在現代系統管理中,日誌記錄和系統監控至關重要,特別是在資安事件調查和系統穩定性維護方面。本文將介紹如何在 Windows 和 Linux 系統中有效地寫入系統日誌,並引導讀者開發實用的系統監控和軟體清單工具,以提升系統管理效率和安全性。這些工具將幫助管理員快速診斷系統問題、追蹤安全事件,並確保系統組態符合預期。
系統日誌寫入與監控工具開發
在資訊安全與系統管理領域,日誌記錄與系統監控是至關重要的環節。本文將探討如何在 Windows 與 Linux 系統中寫入日誌,並開發一個用於監控系統可用性的工具。
寫入 Windows 日誌
Windows 系統中使用 eventcreate 命令來寫入事件日誌。該命令需要提供多個引數,包括事件 ID、事件型別、日誌名稱、事件來源和事件描述。
eventcreate 命令引數
- 事件 ID (
/id): 用於識別事件的數字,範圍在 1 至 1,000 之間。 - 事件型別 (
/t): 描述事件的類別,有效選項包括ERROR、WARNING、INFORMATION、SUCCESSAUDIT和FAILUREAUDIT。 - 日誌名稱 (
/l): 寫入事件的日誌名稱,有效選項包括APPLICATION和SYSTEM。 - 事件來源 (
/so): 產生事件的應用程式名稱,可以是任意字串。 - 事件描述 (
/d): 事件的描述,可以是任意字串。
eventcreate 命令範例
$ eventcreate //ID 200 //L APPLICATION //T INFORMATION //SO "Cybersecurity Ops" //D "This is an event"
SUCCESS: An event of type 'INFORMATION' was created in the 'APPLICATION' log with 'Cybersecurity Ops' as the source.
執行上述命令後,可以使用 wevtutil 命令查詢剛寫入的日誌記錄:
$ wevtutil qe APPLICATION //c:1 //rd:true
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
<Provider Name='Cybersecurity Ops'/>
<EventID Qualifiers='0'>200</EventID>
<Level>4</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime='2018-11-30T15:32:25.000000000Z'/>
<EventRecordID>120114</EventRecordID>
<Channel>Application</Channel>
<Computer>localhost</Computer>
<Security UserID='S-1-5-21-7325229459-428594289-642442149-1001'/>
</System>
<EventData>
<Data>This is an event</Data>
</EventData>
</Event>
內容解密:
eventcreate命令用於在 Windows 事件日誌中建立一個新的事件記錄。/ID 200指定了事件的 ID 為 200,這是一個用於識別事件的唯一數字。/L APPLICATION指定了將事件寫入到應用程式日誌中。/T INFORMATION定義了事件的型別為資訊類別,表示這是一個資訊性的事件。/SO "Cybersecurity Ops"指定了事件的來源為 “Cybersecurity Ops”,這通常是產生事件的應用程式或服務名稱。/D "This is an event"提供了事件的詳細描述。wevtutil qe APPLICATION //c:1 //rd:true命令用於查詢應用程式日誌中最新的事件記錄。
寫入 Linux 日誌
Linux 系統中使用 logger 命令來寫入系統日誌。這些日誌通常儲存在 /var/log/messages 中,但也可能因 Linux 發行版而異。
logger 命令範例
logger 'This is an event'
可以使用 tail 命令檢視剛寫入的日誌記錄:
$ tail -n 1 /var/log/messages
Nov 30 12:07:55 kali root: This is an event
內容解密:
logger命令用於向系統日誌寫入一條訊息。'This is an event'是被寫入日誌的訊息內容。tail -n 1 /var/log/messages用於檢視/var/log/messages檔案的最後一行,即剛剛寫入的日誌記錄。
系統可用性監控工具開發
為了監控系統的可用性,我們可以開發一個使用 ping 命令的指令碼。該指令碼將讀取包含 IP 地址或主機名的檔案,並對每個裝置進行 ping 測試。如果裝置未回應,將通知使用者。
ping 命令引數
-c(Linux): 指定傳送的 ping 請求次數。-n(Windows): 指定傳送的 ping 請求次數。-W(Linux): 指定等待回應的超時時間(秒)。-w(Windows): 指定等待回應的超時時間(毫秒)。
pingmonitor.sh 指令碼範例
#!/bin/bash -
# Cybersecurity Ops with bash
# pingmonitor.sh
# Description:
# Use ping to monitor host availability
# Usage:
# pingmonitor.sh <file> <seconds>
# <file> File containing a list of hosts
# <seconds> Number of seconds between pings
while true
do
clear
echo 'Cybersecurity Ops System Monitor'
echo 'Status: Scanning ...'
echo '
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
--'
while read -r ipadd
do
ipadd=$(echo "$ipadd" | sed 's/\r//')
ping -n 1 "$ipadd" | egrep '(Destination host unreachable|100%)' &> /dev/null
if (( "$?" == 0 ))
then
tput setaf 1
echo "Host $ipadd not found - $(date)" | tee -a monitorlog.txt
tput setaf 7
fi
done < "$1"
echo ""
echo "Done."
for ((i="$2"; i > 0; i--))
do
tput cup 1 0
echo "Status: Next scan in $i seconds"
sleep 1
done
done
內容解密:
- 指令碼使用
while true無限迴圈來持續監控主機狀態。 clear命令用於清除終端螢幕,準備顯示新的掃描結果。- 指令碼讀取第一個引數指定的檔案,該檔案包含需要監控的主機 IP 地址或主機名列表。
- 對每個主機執行
ping -n 1命令,傳送一個 ICMP 請求包以測試主機是否可達。 - 使用
egrep命令檢查ping命令的輸出,如果主機不可達或丟包率為100%,則輸出匹配。 - 如果主機不可達,指令碼會將錯誤訊息輸出到螢幕並追加到
monitorlog.txt日誌檔案中,使用tput setaf 1將文字顏色設為紅色以突出顯示錯誤訊息。 - 指令碼使用第二個引數指定的秒數作為每次掃描之間的間隔時間,倒數計時直到下一次掃描。
練習題
- 編寫一個命令,在 Windows 應用程式日誌中新增一個事件 ID 為 450、型別為資訊、描述為“Chapter 18 exercise”的事件。
- 編寫一個命令,將“Chapter 18 exercise”事件新增到 Linux 日誌中。
- 編寫一個指令碼,接受一個日誌條目作為引數,並根據所使用的作業系統自動執行
logger或eventcreate命令。可以使用第2章中的 Example 2-3 osdetect.sh 指令碼來確定作業系統。
軟體清單工具:softinv.sh 開發
在網路安全維護中,瞭解企業內部系統所安裝的軟體是至關重要的第一步。這些資訊不僅能提升安全態勢感知,還能用於實施更進階的安全控制措施,例如應用程式白名單(application whitelisting)。一旦識別出企業內部執行的軟體,就可以決定哪些軟體是被允許的,並將其加入白名單。任何不在白名單上的軟體,如惡意軟體,將無法執行。
本章節將開發一個名為 softinv.sh 的指令碼,用於取得特定系統上已安裝軟體的清單,以便後續的匯總和分析。
需求分析
- 偵測作業系統:根據不同的作業系統執行相應的命令來列出已安裝的軟體。
- 執行軟體清單命令:使用適當的命令列出已安裝的軟體。
- 儲存軟體清單:將已安裝軟體的清單儲存到一個文字檔案中,檔案名稱格式為
主機名稱_softinv.txt。
使用的命令
本章節介紹了 apt、dpkg、wmic 和 yum 等命令,用於查詢系統上已安裝的軟體。選擇哪個工具取決於所使用的作業系統(Linux 或 Windows),甚至是所使用的 Linux 發行版(例如 Ubuntu 或 RedHat)。
apt
Advanced Packaging Tool(APT)允許您在許多 Linux 發行版上安裝和管理軟體套件。
常用命令選項:
install:安裝指定的軟體套件。update:同步套件列表到最新版本。list:列出軟體套件。remove:移除指定的軟體套件。
命令範例:列出系統上所有已安裝的軟體套件。
apt list --installed
dpkg
與 apt 相似,dpkg 用於在根據 Debian 的 Linux 發行版上安裝和管理軟體套件。
常用命令選項:
-i:安裝套件。-l:列出套件。-r:移除套件。
命令範例:列出系統上所有已安裝的軟體套件。
dpkg -l
wmic
Windows Management Instrumentation Command-line(WMIC)用於管理 Windows 作業系統的幾乎所有方面。本章節重點介紹 wmic 的套件管理功能。
常用命令選項:
process:操作目前執行的程式。product:安裝套件管理。
命令範例:列出系統上已安裝的軟體。
wmic product get name,version //format:csv
yum
Yellowdog Updater Modified(YUM)是一個用於安裝和管理軟體套件的命令,使用 RedHat Package Manager(RPM)。僅使用 RPM 可以透過 rpm -qa 取得資訊,但 YUM 是 RPM 的更高層級封裝。
常用命令選項:
install:安裝指定的軟體套件。list:列出軟體套件。remove:移除指定的軟體套件。
命令範例:列出系統上所有已安裝的軟體套件。
yum list installed
實作細節
為了判斷作業系統型別,我們採用了一個簡單的方法:檢查系統上是否存在特定的可執行檔,並根據該結果推斷作業系統型別。
程式碼實作:softinv.sh
#!/bin/bash -
# 網路安全營運與 bash
# softinv.sh
# 描述:
# 列出系統上已安裝的軟體,以便後續的匯總和分析;
# 用法:./softinv.sh [檔名]
# 輸出寫入到 $1 或 <主機名稱>_softinv.txt
# 設定輸出檔名
OUTFN="${1:-${HOSTNAME}_softinv.txt}"
# 根據作業系統決定要執行的命令
OSbase=win
type -t rpm &> /dev/null
(( $? == 0 )) && OSbase=rpm
type -t dpkg &> /dev/null
(( $? == 0 )) && OSbase=deb
type -t apt &> /dev/null
(( $? == 0 )) && OSbase=apt
case ${OSbase} in
win)
INVCMD="wmic product get name,version //format:csv"
;;
rpm)
INVCMD="rpm -qa"
;;
deb)
INVCMD="dpkg -l"
;;
apt)
INVCMD="apt list --installed"
;;
*)
echo "錯誤:OSbase=${OSbase}"
exit -1
;;
esac
# #### 內容解密:
# 這段程式碼首先根據引數或預設值設定輸出檔名。然後,它檢查系統上是否存在特定的套件管理工具(rpm、dpkg、apt),以此來判斷作業系統型別。根據作業系統型別,選擇相應的命令來列出已安裝的軟體。
#### 工作坊
1. **持續記錄最後一次成功聯絡每個系統的日期和時間**。
2. **新增一個引數,允許指定要監控的 IP 位址範圍**。
3. **當系統變得不可用時,向指定的電子郵件地址傳送通知**。
請存取網路安全營運網站以取得更多資源和這些問題的答案。
## 軟體清單工具的開發與組態驗證工具介紹
在進行系統安全管理時,瞭解系統中已安裝的軟體及其組態狀況至關重要。本篇文章將探討如何開發一個軟體清單工具以及一個用於驗證系統組態的工具。
### 軟體清單工具的實作
為了識別系統中安裝的軟體,我們需要開發一個名為 `softinv.sh` 的指令碼。該指令碼根據不同的作業系統,使用相應的套件管理工具來列出已安裝的軟體。
#### 指令碼實作細節
```bash
# 決定輸出檔案名稱
OUTFN=${1:-${HOSTNAME}_softinv.txt}
# 檢查並設定作業系統型別
# 檢查套件管理工具是否存在,如 apt、dpkg、wmic、yum 等
# 設定 OSbase 變數以記錄作業系統型別
# 根據不同的作業系統執行對應的命令來收集軟體資訊
case $OSbase in
# 不同作業系統的處理邏輯
esac
# 執行收集軟體資訊的命令並將結果輸出到檔案
$INVCMD 2>/dev/null > $OUTFN
內容解密:
- 輸出檔案名稱的決定:指令碼首先檢查是否有提供輸出檔案名稱作為引數,若無,則預設使用主機名稱加上
_softinv.txt作為輸出檔案名稱。 - 作業系統型別的檢查:透過檢查不同套件管理工具的存在與否,來判斷目前的作業系統型別,並將結果儲存在
OSbase變數中。 - 軟體資訊的收集:根據
OSbase的值,使用case陳述式選擇適合目前作業系統的命令來收集軟體資訊。 - 輸出結果:最後,執行收集軟體資訊的命令,並將結果輸出到指定的檔案中。
識別其他軟體
除了使用套件管理工具列出已安裝的軟體外,還需要識別那些未經套件管理器安裝的可執行檔。
方法與步驟
- Linux 系統:檢查
/bin和/usr/bin目錄,並列出$PATH環境變數中所包含的目錄中的可執行檔。 - Windows 系統:使用
find命令搜尋副檔名為.exe的檔案,或使用typesearch.sh指令碼搜尋包含 “executable” 關鍵字的檔案。
使用 typesearch.sh 搜尋可執行檔
$ ./typesearch.sh -i executable .
組態驗證工具的開發
接下來,我們將開發一個名為 validateconfig.sh 的工具,用於驗證系統的組態是否符合預期。
組態驗證工具的功能
- 檢查檔案是否存在或不存在
- 驗證檔案的 SHA-1 雜湊值
- 檢查 Windows 登入檔的值
- 驗證使用者或群組是否存在或不存在
組態檔案的格式
| 功能 | 格式 |
|---|---|
| 檢查檔案存在 | file <檔案路徑> |
| 檢查檔案不存在 | !file <檔案路徑> |
| 驗證檔案雜湊值 | hash <sha1 雜湊值> <檔案路徑> |
| 檢查登入檔值 | reg "<鍵值路徑>" "<值>" "<預期值>" |
| 檢查使用者存在 | user <使用者 ID> |
| 檢查使用者不存在 | !user <使用者 ID> |
| 檢查群組存在 | group <群組 ID> |
| 檢查群組不存在 | !group <群組 ID> |
示例組態檔案
user jsmith
file "c:\windows\system32\calc.exe"
!file "c:\windows\system32\bad.exe"