[資安筆記] Windows企業資安稽核應用系列 (5) - 紀錄解析的方法與實做

[資安筆記] Windows企業資安稽核應用系列 (5) - 紀錄解析的方法與實做

本文刊登於 RUN!PC 月刊 2009/09 188 期 

 

為什麼紀錄要分析?

  • 紀錄分析的目的
    在數量旁大的紀錄中,要能夠在短時間內精確分析應該如何作?使用事件檢視器的篩選功能雖然可以達到短區間的過濾,紀錄還是需要用該介面瀏覽,臨時性的比對或查看意外還過得去,當紀錄一多可就難以閱讀了。這種使用人工閱讀紀錄的方式進度很慢,可能在尋找線索的過程中導致手邊的工作停擺,嚴重影響效率。而紀錄分析的目的在於「短時間內快速找出重點事件,以利稽核與足跡追蹤的進行」。

     
  • 專用紀錄分析工具
    「工欲善其事,必先利其器」,稽核紀錄分析當然也不例外,市面上雖然有許多優良的稽核軟體與紀錄分析工具,功能強大設定簡單,但都是商業軟體。在有限預算的考量下免費工具成了不二首選,而筆者最愛用的分析工具則是微軟官方出品的 Log Parser。Log Parser是一個麻雀雖小但五臟俱全的紀錄分析工具,支援多種輸入與輸出格式外,還可自訂分析結果範本,搭配 VB Script或Powershell 更可達到進階的每日遞送報告與紀錄備份。Log Parser 目前版本為 2.2,且可支援的格式非常多,除了可輸出XML外,還可將分析後的紀錄轉送至Linux的Syslog Server,功能之強不在話下。

    表1    LogParser支援格式一覽

    輸入格式

    IIS 紀錄

    IISW3C,IIS,BIN,IISODBC,HTTPERR,URLSCAN
     

    通用文字檔案

    CSV,TSV,XML,W3C,NCSA,TEXTLINE,TEXTWORD
     

    系統紀錄

    EVT,FS,REG,ADS
     

    特殊來源

    NETMON,ETW,COM

    輸出格式

    通用文字檔案

    NAT,CSV,TSV,XML,W3C,TPL,IIS
     

    特殊用途格式

    SQL,SYSLOG,DATAGRID,CHART


LogParser的基礎應用
LogPaser是個在Command Mode下運作的應用程式,雖然有視覺化工具Visual Log Parser可在撰寫查詢語法中輕鬆不少,但筆者還是建議先從工具本身開始打底,除了可清楚知道 LogParser的運作方法外,也可在沒有視覺化的環境下快速解析紀錄。

  • 基本語法說明
    LogParser 有許多的參數可以使用,基本常用的參數只要記起來,則可以更快的上手,以下是筆者整理的語法與常用參數表:
    表2    LogParser常用參數說明

    查詢語法:

    Logparser.exe –i:<format> –o:<format> <SQL查詢語法 | File:SQL File> [-stats[:ON|OFF]] [-queryInfo]

    參數

    說明

    -i:<format>

    指定紀錄的輸入格式,例如 -i:evt 是指定系統事件紀錄

    -o:<format>

    指定紀錄的輸出格式,例如 -o:xml 是指定輸出為XML

    File:

    使用指定的SQL檔案進行查詢,複雜查詢必備的參數

    -stats[:ON|OFF]

    查詢結尾的狀態統計顯示與否,預設不指定時為 On

    -queryInfo

    將查詢的資訊輸出,但不執行查詢。類似 Powershell 的 –whatif 參數

    -saveDefaults

    將全域設定變更為預設值



    而查詢語法中有一個參數比較特別,是使用SQL語法的部份。LogParser使用與T-SQL語法選取與過濾資料,對於常使用T-SQL語法的人很快就可以上手。下面簡單的示範一段「將稽核紀錄中十筆資料取出」的語法當範例,仔細看來源與一般T-SQL 選取資料表不太一樣:

    LogParser.exe –i:evt –o:DATAGRID “SELECT TOP 10 * From SECURITY”


    這裡將輸入格式(參數 -i)設定為Event Log,並將輸出格式(-o)指定一個 Data Grid視窗,而這個查詢語法會產生以下的結果:


    image

    圖1    DATAGRID模式可即時瀏覽查詢的正確性

     

    DATAGRID模式很適合預覽查詢語法的正確性,確定資料無誤後在將查詢資料匯出以確保分析的正確性。讀者們看到這邊也許有個疑問:「要怎麼設定查詢欄位與來源?」。要知道此紀錄中有哪些欄位可以被選取或條件過濾時,在 SELECT語法之後直接下「*」就可以將欄位一次選取。搭配 TOP 1指令選取一筆資料列,即可快速且不費時的得知欄位。資料來源的選取法筆者整理下表說明之:

     

    表3    LogParser選取來源語法

    方法

    說明

    單一紀錄解析

    分析單一檔案用,例如:C:\LogFiles\Log001.xml

    萬用字元指定檔案

    例如:C:\LogFiles\Log2008*.log

    以此方式指定則所有2008年的紀錄均會被一次解析

    事件紀錄

    此為單一用法,只要指定 Event Log類型即可:

    Application - 應用程式紀錄

    Security - 安全性紀錄

    System - 系統紀錄

    遠端主機指定

    可分析遠端伺服器的紀錄,使用 UNC路徑方式指定,例如:\\xxx.xxx.xxx.xxx\Security 或 \\ComputerName\Log\2008*.log

    多重來源指定

    一次選取數個來源,以逗號分隔,例如:C:\LogFiles\Log001.xml, C:\LogFiles\Log002.xml



 

  • 將查詢結果儲存
    查詢結果的保存相當於「保留證據」,當下查出線索或證據時沒有保存,後面怎麼講都不會有「強力立場」。LogParser可將紀錄輸出並匯出成文字檔案,且這些文字檔案還可以使用LogParser再次進行查詢,一般而言筆者常用的保存格式為CSV或XML,現在讓我們來看看如何將紀錄保存至文字檔案:

    LogParser.exe –i:evt –o:XML “SELECT TOP 10 * From SECURITY”> C:\Security.xml



    這裡必須注意的是,除了指定輸出的類型外,後面也要指定輸出的檔名與位置才可將查詢的結果完整保存,輸出的XML如下:

    image

    圖2    使用 Log Parser輸出的XML格式


    CSV的方法與XML一樣,差別只在於輸出格式指定以及輸出檔名為.CSV



進階應用Log Parser
這個章節會示範如何使用外部參數以及每日將事件紀錄備份以供備查。使用Log Parser之前 Windows事件要備份通常都是複製整份EVT檔案,進階一點則是使用Windows Vista以上的事件轉送功能。事件轉送功能筆者本身也是愛用者,但機房中有Windows 2008的筆者較不多見,此時就可以使用Log Parser進行處理了。

  • 使用外部參數
    外部參數的用法與網頁間使用GET方法傳遞變數的方式一樣,且這種方法可讓撰寫批次程式的方法更具彈性化。筆者以一個簡單的查詢實例來展示,首先先建立一個T-SQL檔案,並將其命名為app.sql,並放至於D:\AuditReport\ 下。此程式是一隻分析應用程式紀錄的簡單T-SQL程式,日期的部份則以參數的方式輸入。

    --T-SQL程式 app.sql

    select *

    from System

    where

    --將指定日期當天之紀錄全部列出

    TimeGenerated>='%dtToday% 00:00:00' and

    TimeGenerated<='%dtToday% 23:59:59'

    order by TimeGenerated DESC



    日期變數為 %dtToday%,而我們的Log Parser語法可以這樣撰寫(注意後面帶的參數):

    LogParser.exe -i:evt -o:DATAGRID file:D:\AuditReport\app.sql?dtToday=2009-08-01



    而查詢結果會如下圖所列:


    image 

    圖3    使用外部參數後,只列出指定日期的紀錄
     

  • 每日備份事件紀錄
    安全性政策中大多都少不了「每日備份系統紀錄」的工作,在數百台Server的機房中事件紀錄檔案加起來也是十分龐大,將EVT壓縮後可以節省不少空間,相對的要查閱紀錄時增加了不少麻煩與時間。使用Log Parser輸出XML的功能可以將當日的系統紀錄備份成XML,而XML又是Log Parser支援的檔案,屆時要複查也很迅速方便。筆者測試過檔案大小前後的差異,每日備份一個EVT約為300KB,輸出XML約要5KB即可,檔案大小差了 60倍,以ISO 27001規範中「重要資訊至少需保存五年」的日期來看,差異立見高下。備份的語法不限任何語言,只要能執行批次即可,筆者這裡以Powershell進行示範,由於批次執行時間通常於隔天的凌晨,因此語法中的日期是今日減去一天的日期:

    #EventBackup.ps1

    #Global Varible
    $dtYestoday = [Datetime]::Now.AddDays(-1).ToString("yyyy-MM-dd")
    $strBackupDis = "D:\EventBackup";

    &LogParser "-i:evt" "-o:xml" "-stats:OFF" "file:D:\AuditReport\app.sql?dtToday=$dtYestoday" > "$strBackupDis\AppEvt_$dtYestoday.xml"

    &LogParser "-i:evt" "-o:xml" "-stats:OFF" "file:D:\AuditReport\sys.sql?dtToday=$dtYestoday" > "$strBackupDis\SysEvt_$dtYestoday.xml"

    &LogParser "-i:evt" "-o:xml" "-stats:OFF" "file:D:\AuditReport\sec.sql?dtToday=$dtYestoday" > "$strBackupDis\SecEvt_$dtYestoday.xml"



    執行之後如下圖所示:

    image 

    圖4    每日將前一天的事件備份至XML檔案

     

    接下來只要搭配FTP排程或其他傳輸方法即可將事件紀錄異地備援起來,當事件發生後可以往前追朔進行足跡追蹤。

 

後記
「紀錄」是系統中所有足跡的所在地,但資訊太龐大也導致分析的困難,新手更是無法分析紀錄,只能一筆一筆的瀏覽(筆者真的有初階MIS朋友被攻擊之後以「人肉」瀏覽了25 GB 的 IIS Log)。現在微軟提供了強大的分析工具,讓足跡追蹤變得很輕鬆,而紀錄分析只要多實做幾次就會熟悉。如果對於系統稽核與WEB稽核有些忘記了,快快找一下前幾期的介紹唷,希望Windows稽核應用專欄可以帶給讀者們一些實質上的幫助。

如果覺得這篇文章對你有所幫助,可以透過 Paypal 支持作者唷~