NIDS利用偵測網路流量的方式來判別流量中是否有攻擊行為並加以記錄或阻擋,但無法全面掌握網路流量資訊,為此本文將介紹開源程式Zeek,它能夠完整解析網路協定並記錄網路連線的相關細節,並用於後續資安事件的鑑識與分析。
隨著網路環境日漸嚴峻,相關的網路攻擊事件層出不窮且有日益增加的趨勢,因此大部分的企業都會安裝網路型入侵檢測系統(Network Intrusion-detection System,NIDS),利用偵測網路流量的方式(一般會採用樣式比對的方式)來判別流量中是否有攻擊行為,並加以記錄或阻擋。
但是,這種方式無法全面性掌握相關的網路流量資訊,因此本文將介紹一個開源碼社群有名的網路流量監控與分析平台Zeek(原先名稱為Bro,官方網址為https://zeek.org/),它能夠完整地解析網路協定並且記錄網路連線的相關細節,可用於後續資安事件的鑑識與分析。
Zeek主要功能說明
首先,說明Zeek的幾項主要功能。
多樣化的通訊協定解析
Zeek可完整地解析多種不同的通訊協定,例如HTTP、SSH、SMTP、FTP等,並可根據通訊協定的標準,正確地解析出相關的欄位。以HTTP為例,可自動根據HTTP通訊協定的標準,正確地解析出HTTP方法(Method)、HTTP狀態碼(Status Code)等等相關欄位資訊。
記錄完整的連線紀錄
Zeek記錄網路流量中的來源IP∕通訊埠、目的IP∕通訊埠、通訊協定、連線時間、傳輸數量等重要資訊,可幫助管理者建立整體網路連線的時間軸。
提供完善多樣化的日誌系統
Zeek會將網路封包資訊,以結構化(支援tsv和json)格式轉換成易於閱讀分析的紀錄。除了用於自行分析之外,還能夠與其他的資安設備進行整合,其所提供的日誌類型包括「一般日誌(Common Log)」以及「通訊協定的日誌」。
「一般日誌」主要是記錄不屬於特定的網路通訊協定(例如HTTP)及相關網路安全事件的資訊,大致可分為notice.log、weird.log、conn.log等類型。notice.log日誌主要是儲存判別為攻擊事件的資訊。當Zeek分析模組分析出可能為網路攻擊事件時(例如SSH暴力破解攻擊或網路掃描),就會將相關資訊寫入至此檔案;weird.log日誌主要是儲存通訊協定異常或不符合預期的網路行為(例如封包的結構資訊不正確或網路連線順序不正常)等資訊,此類行為雖未符合網路攻擊的行為,但有可能為攻擊工具所產生,可能為後續的攻擊行為預做準備;而conn.log主要是儲存所有網路連線的摘要資訊,可進行網路行為的稽核。
而「通訊協定的日誌」,除了一般日誌外,Zeek會以檔案形式來記錄各種通訊協定的連線資訊,預設會以通訊協定的名稱為檔名來儲存,例如以http.log為檔名來記錄HTTP通訊協定的連線資訊。
多樣化網路惡意行為偵測
除了可全面地記錄網路流量外,Zeek也提供類似網路型入侵偵測系統的功能,提供如SSH暴力破解(detect-bruteforcing)和SOL Injection等多樣化的網路惡意行為偵測模組,在啟用後即可偵測相關的網路惡意行為。
提供第三方腳本(Script)功能
提供高度彈性的腳本功能,管理者可用來撰寫處理網路封包的相關規則與處理方式,可有效提升Zeek的功能。
豐富的第三方軟體(Plugin)功能
提供第三方軟體(https://packages.zeek.org/packages)的機制,使用者可利用載入第三方軟體的方式來新增Zeek的功能。
安裝和使用Zeek
在此使用Rocky 10.1(作業系統)並以原始碼安裝的方式進行安裝,首先必須安裝必要的相依軟體,執行指令內容如下(其中#為註解說明):
yum -y update #更新系統內的軟體 dnf -y install gcc gcc-c++ #安裝相關所需的編譯器 dnf -y install cmake make #cmake版本需3.15以上 dnf -y install flex #Flex (lexical analyzer generator)版本需2.6以上 dnf -y install bison #Bison版本 需要3.3以上 dnf -y --enablerepo=crb install libpcap-devel dnf -y install openssl-devel dnf -y install python3 python3-devel dnf -y --enablerepo=crb install swig dnf -y install zlib-devel dnf -y install -y epel-release dnf makecache dnf install -y zeromq zeromq-devel
安裝好所需的軟體後,就來安裝Zeek。先至Zeek的官方網站下載最新版本的原始碼(本文使用版本為8.0.4),依序執行如下的指令:
wget https://download.zeek.org/zeek- 8.0.4.tar.gz #取得Zeek的原始碼 tar xvzf zeek-8.0.4.tar.gz #解壓縮 cd zeek-8.0.4/ mkdir build cd build #設定將安裝在/usr/local/zeek的目錄 (以下簡稱安裝目錄) cmake .. -DCMAKE_INSTALL_PREFIX=/ usr/local/zeek make #進行編譯 make install #在編譯成功後,即進行 安裝
在編譯安裝成功後,就會將相關程式和組態檔安裝至安裝目錄內。
常用的主要程式
接下來,說明Zeek位於「/usr/local/zeek/bin/」內常用的主要程式。
為主要的核心分析引擎,用於監控網路流量及解析相關通訊協定,並記錄在相關日誌。一般而言,使用者通常不會直接使用Zeek來執行,而是使用zeekctl程式來管理Zeek主程式。
這是Zeek主程式的管理工具,常用命令參數如下:
check:檢查Zeek的組態檔設定是否有錯誤。
deploy:重新進行部署並啟動,在使用者更動組態設定後,即須重新部署,好讓新的設定生效。 status:檢查Zeek的運作狀態。
stop:停止Zeek的運作。
start:啟動Zeek。
restart:重新啟動Zeek,通常用在未更動組態的情況。
解析並擷取Zeek的日誌的工具程式,可用來取得Zeek日誌中的相關欄位資訊。
主要是用來查詢Zeek的安裝與環境設定的工具,例如確認版本資訊或安裝位置等,其常用命令參數包括:
version:顯示Zeek的版本資訊。
prefix:顯示Zeek的安裝根目錄。
lib_dir:顯示Zeek相關的程式庫(Library)所在的目錄。 plugin_dir:顯示第三方軟體所在的目錄。
script_dir:顯示Zeek腳本程式所在的目錄。
site_dir:顯示Zeek運作時所參考的規則檔所在目錄。
組態檔中的組態設定
說明過Zeek相關程式後,接著介紹組態檔中的組態設定。
這是Zeek主要組態檔,主要用來設定管理者信箱、磁碟空間門檻及日誌維護等相關組態設定,常用的組態設定如下:
設定管理者的電子郵件,一旦Zeek偵測到異常即會寄發電子郵件至此信箱。
設定多久進行日誌檔案的備份(單位為秒)。
設定日誌的有效期限,當超過有效期限時即會進行刪除,若設定為0,表示永久保存日誌資訊。
設定日誌檔案的所在目錄位置。
‧SitePolicyScripts=[檔案名稱]
設定Zeek所使用的規則檔案,預設檔名為local.zeek。
設定運作所使用的通訊埠(Port),預設為9991。
設定磁碟空間最低下限保護的門檻,一旦磁碟空間可用容量低於所設定的門檻值時便會暫時停止記錄,並寄發警示電子郵件給管理者,其單位為百分比。例如設定5,代表可用容量低於5%時即停止記錄。
此組態檔為定義每個節點(Node)的運作資訊。Zeek提供單機(Standalone)或叢集(Cluster)的部署架構,本文採用單機運作架構,檔案內容如下:
[zeek] #設定節點的名稱,在叢集架構 下,此名稱需為唯一,不可重複 type=standalone #設定為單機執行模式 host=localhost #設定Zeek主機的位置 interface=ens160 #設定運作所使用 的網路介面名稱
用來載入啟用的分析模組及偵測規則,主要使用@load指令來載入相關要分析的通訊協定,例如@load protocols/ssh/software表示要載入分析SSH通訊協定的分析模組。
Zeek實作測試
本文不討論如何以Zeek腳本功能來撰寫偵測規則等進階的用法,而是利用內建的規則測試及如何使用第三方軟體來增強Zeek的功能,其中「記錄SSH連線紀錄」為內建的功能。首先,使用者確認local.zeek是否已載入SSH的相關分析模組:
#用來識別SSH連線所使用的軟體資訊 (例如軟體名稱及版本資訊) @load protocols/ssh/software #在安裝GEO軟體的情況下,此模組會將 IP轉換地理位置資訊 @load protocols/ssh/geo-data #用來偵測SSH暴力破解攻擊 @load protocols/ssh/detect-brute forcing #偵測是否有疑似惡意主機的SSH連線 @load protocols/ssh/interesting- hostnames
在確認相關設定均正確設定後,即可使用zeekctl deploy重新部署並啟動,接著使用者就能夠從遠端以SSH登入Zeek主機進行測試。此時,會在Zeek主機上產生ssh.log(以通訊協定命名,位於「/usr/local/zeek/logs/current/」目錄下),可先以cat指令查看ssh.log提供的欄位資訊,如圖1所示。
圖1 以cat指令查看ssh.log提供的欄位資訊。
接著,說明ssh.log常用的欄位資訊,請參考表1的說明。
在簡單了解ssh.log欄位後,接著使用zeek-cut來取得所需的欄位,如下指令為取得連線時間、SSH連線來源主機IP、連線目的主機IP、連線嘗試次數以及來源連線使用的軟體資訊,如圖2所示:
圖2 利用zeek-cut取得所需的欄位。
cat ssh.log | zeek-cut ts id.orig_ h id.resp_h auth_attempts client
除了內建的偵測模組外,Zeek更提供強大的第三方軟體機制,可供使用者增添Zeek的功能。這裡將安裝偵測網路掃描的第三方軟體bro-simple-scan,可至第三方軟體官方網站(https://packages.zeek.org/packages)查看相關的第三方軟體。可使用zkg(Zeek Package Manager)程式來管理第三方軟體,其語法為:
zkg [命令參數]
常用命令參數說明
Zeek常用的命令參數,說明如下:
‧autoconfig
重新組態Zeek相關的環境設定,通常在第一次執行時必須先使用此命令。
‧refresh
更新第三方軟體位置的索引。
‧search [關鍵字]
以關鍵字查詢相關的第三方軟體,例如要找偵測掃描的軟體,執行指令「zkg search scan」即可找出相關偵測網路掃描的第三方軟體,如圖3所示。
圖3 找出相關偵測網路掃描的第三方軟體。
‧install
安裝第三方軟體,這裡將安裝bro-simple-scan,所以執行「zkg install ncsa/bro-simple-scan」指令。
‧list
在安裝成功後,即可使用「zkg list」指令列出已安裝的第三方軟體來確認,如圖4所示。
圖4 列出已安裝的第三方軟體進行確認。
‧info [第三方軟體名稱]
可利用此命令來查看該第三方軟體的詳細資訊,例如執行「zkg info ncsa/bro-simple-scan」指令。
‧remove [第三方軟體名稱]
用來移除已安裝的第三方軟體,例如執行「zkg remove ncsa/bro-simple-scan」。
開始測試
在此將利用安裝ncsa/bro-simple-scan的方式來新增Zeek偵測網路掃描的功能。在確認已安裝ncsa/bro-simple-scan後,接著必須在local.zeek檔案中加上載入ncsa/bro-simple-scan的設定:
@load packages/bro-simple-scan
完成設定後,再執行「zeek deploy」重新進行部署並啟動。
一切就緒後,最後在遠端主機使用網路掃描工具(例如nmap)對Zeek主機進行掃描。此時,Zeek主機應可捕捉到網路掃描行為(Scan:Port_Scan)並記錄在notice.log,如圖5所示。
圖5 捕捉網路掃描行為並記錄在notice.log。
至此,一套可全方位監控網路流量之系統即告完成。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>