本文介紹一套區塊鏈於日誌資料之數位證據保全系統,可改善以往日誌資料的儲存方式,利用區塊鏈不可竄改之特性達到日誌資料之數位證據保全,也可作為追蹤事件的管道及證明人員的行為軌跡,因此在數位證據中佔有相當的地位。
日誌資料在資安事件發生時,可作為追蹤事件的管道與證明行為之軌跡,若採證程序得宜甚至可做法律上的證據。但是日誌資料能輕易地被修改,不易確定資料完整性及原始來源,因此要讓法官相信日誌資料的證據力及證據能力時更顯得困難。針對企業欲保全數位證據之需求,可利用區塊鏈的不可竄改性將日誌資料儲存在區塊鏈分散式帳本中,並設計一條包含伺服器節點及各企業節點之區塊鏈,由伺服器控管節點權限,企業可將日誌資料儲存至區塊鏈上,以此達到資料的不可竄改性及一致性。
數位化時代下潛藏的資安危機
在這數位化的時代中,日常生活中的事物都可以透過數位科技完成,不論是社交、購物、轉帳、搜尋資料等等,企業也積極導入數位化系統來協助公司營運,而這些資料以數位化的方式被蒐集、處理、傳輸或儲存,但資料被竄改、變造、重演或冒名傳送等不法案件也時有耳聞。近來資安事件更嚴重危害金融秩序及國家安全,因此各國除了加速資安技術產業的升級外,更積極制定資通安全管理法規。
我國在相關法規的制定上,已在2012年實施個人資料保護法來加強企業對客戶資料的保護,除了要求國內各個持有客戶資料的單位必須善盡良善保護原則,當個資外洩時,也必須證明企業無故意或過失導致個資外洩,才可免於責罰。在個資法實行後,大眾對個人資料保護的概念普遍提升,更懂得如何爭取自身權益,企業在面對個資外洩帶來的高額賠償金額,也願意投入更多的資源來管理個資。企業除了須遵守個資的蒐集、處理、利用、傳輸及刪除過程,對個資的保護及舉證時的數位證據保全也極為重要。證據保全的用意主要是為了避免將來訴訟無從或難以舉證之困難,事先進行保全動作。
資料外洩的案例屢見不鮮,公務機關中台北市政府及外交部領事事務局皆發生過資料外洩,非公務機關中包括華信航空及多家旅行社,最讓人熟知的即是雄獅旅行社客戶資料外洩。而在公司機密資料外洩部分,則有知名鞋子代工龍頭寶成在2016年3月發生設計圖外洩事件。
數位證據的鑑識與保全,已是資安部門重點工作項目。日誌資料如可合法提出於法院,雖具備證據能力,但因日誌資料本身得以輕易修改並複製、不易確定資料完整性且不易確定原始作者等特性,因此要使法官採信此日誌資料做為證據及證據力的高低,往往是訴訟上攻防的重點。現今日誌資料的保存須使用專門伺服器儲存,但該設備仍有被竄改的風險,再加上伺服器價格昂貴,使得許多公司不願意導入。因此,本文針對企業欲保存日誌資料的需求,介紹電腦日誌資料之數位證據保全系統,利用區塊鏈來提高資料儲存的安全性及降低儲存的成本。
結合區塊鏈保存日誌資料
本系統利用區塊鏈分散式系統之架構,結合加密技術及共識機制,運用在日誌資料的保存上。而系統可以分為寫入日誌資料、區塊產生、資料同步傳輸及驗證日誌資料四個功能,以下簡述此四個功能之相關運作:
‧寫入日誌資料:此功能會把個別的日誌資料轉成DIGEST,再將全部的DIGEST透過默克爾樹(Merkle Tree)濃縮成一個DIGEST,對於資料儲存方面,若日誌資料過於龐大也可用一個DIGEST來表示,節省了許多儲存空間。
‧區塊產生:在透過默克爾樹濃縮成一個DIGEST後,此功能將由某個節點來將該DIGEST寫入區塊並進行驗證動作。
‧資料同步傳輸:此功能將負責所有節點之間的資料傳輸,包含節點傳輸日誌資料、挖礦節點傳輸區塊資料以及日誌檔驗證後的查詢結果傳輸等等。
‧驗證日誌資料:此功能主要是讓使用者可以撈出區塊鏈上的DIGEST,並且驗證某日誌檔的內容是否有被竄改過。
分散式系統架構
圖1為此分散式系統的架構圖,本系統使用區塊鏈中聯盟鏈的概念,而系統中將會由一個伺服器(Server)及數個節點(Peer)組成,其中伺服器主要是負責控管聯盟的節點,如有新的組織想參與此聯盟鏈,將會由伺服器來將新的節點加入到聯盟鏈網路中,並同步現有之區塊資料給新的節點,其負責了身分認證的功能,也能視為此聯盟鏈的註冊中心。而系統中的所有節點除了會擁有同一份區塊鏈帳本,也會負責幫助系統伺服器將資料打包於區塊內,以及幫助伺服器進行事後的驗證動作。
此系統流程如圖2所示,將大致分為七步驟,各步驟如下列所示:
①日誌檔轉為Merkle Root值:節點將定時對日誌檔做雜湊函式,累積多個DIGEST後,利用默克爾樹(Merkle Tree)儲存這些DIGEST,並生成一個固定格式長度的默克爾樹根值(Merkle Root)。
②將資料傳至伺服器(Server):生成一筆資料後,節點將資料傳送到伺服器,伺服器將收集所有節點產生的資料。
③將所有資料傳至指定節點:伺服器決定由某節點接收這些資料,節點會接收所有節點傳來的資料。
④產生區塊:此節點接收資料後會利用默克爾樹儲存全部的資料,並生成一個默克爾樹根值,將此值連同其他資訊打包產生區塊。
⑤傳回區塊:節點完成區塊產生動作後,會將區塊傳回給伺服器。
⑥廣播區塊給各節點:伺服器接收區塊,在將區塊廣播出去給各個節點。
⑦將區塊加至鏈上:各個節點接收區塊後會將區塊加入自己的帳本中,並在各自的區塊鏈上加入最新的區塊。
系統設計
系統將包括四大部分:寫入日誌資料、區塊產生、資料同步傳輸以及驗證日誌資料,如圖3所示,後續將詳細介紹此四個功能之運作流程。
寫入日誌資料
在寫入日誌資料時,由於每個系統所產生之日誌資料規則有所不同,有些系統會先產生空的日誌檔,再依序將資料寫入;有些系統則一次產生一份完整的日誌檔,後續不會再進行檔案的修改,因此在將資料進行打包處理時,必須要事先決定檔案的處理範圍。對於此設定,本系統將自動判斷並選出已完成之日誌檔,會將該範圍內之日誌檔進行打包處理並寫入區塊中,而未完成之日誌檔將被排除,等待下次的打包處理,圖4為寫入日誌資料之流程。
首先,系統對日誌檔案所在資料夾內的所有日誌檔做排序,排序方式為依創建時間由舊到新依序,排序過後系統讀取上次打包過最新的日誌檔案名稱,利用此檔案名稱在已排序好的日誌檔中進行判斷動作,此判斷動作會將已被打包過的日誌檔排除,以避免重複打包的問題發生,之後再讀取那些未被打包的日誌檔,對每個檔案的內容做雜湊函式運算成DIGEST,並將資料寫入日誌檔字典(Dictionary)中。
字典內容如表1所示,字典內容包括日誌檔名稱、日誌檔案產生時間及檔案內容之DIGEST;系統將定時把現有的字典資料彙整執行默克爾樹函式,建構默克爾樹並生成默克爾樹根值,之後會將資料寫入交易資料字典,字典內容如表2所示,字典包括此節點名稱、此結果值包含之日誌檔列表、日誌檔數量及最後的DIGEST,最後系統會將此字典內容傳送至伺服器端保存。
多筆日誌檔資料轉為默克爾樹(Merkle Tree)根值流程如圖5所示,首先輸入值為日誌檔的字典資料,內容包括日誌檔名稱、日誌檔產生時間及檔案DIGEST;再將字典形式資料轉為JavaScript Object Notation(JSON)字串並做雜湊運算轉為256位元的DIGEST,運算完的結果會加至列表1(list1)之中,接著計算有多少個DIGEST。
若無任何DIGEST,則加入一個256位元皆為0的資料進列表1,回傳此值後結束程式。若列表1只有一個DIGEST,則對此值做雜湊運算後回傳此值結束程式。而若DIGEST個數大於1,首先必須判斷個數為奇數或偶數。若為奇數則須先將第一個值取出,對第一個值單獨做雜湊運算,後續的資料將會兩兩串聯並進行雜湊運算直到最後一筆資料。若DIGEST個數為偶數,則會直接將所有的資料進行兩兩串聯,並進行雜湊運算直到最後一筆資料。
串聯完成後會將DIGEST依序放至空的列表2(list2)中,列表1的值皆做完雜湊運算後即可清空,再將列表2的值複製進列表1內,並清空所有的值,即完成默克爾樹的第一層。此時新的列表1數量會減半,並重複上述之資料串聯步驟,直到列表1個數為1(即為Root值)則完成默克爾樹,最後程式回傳結果為Root值。
區塊產生
圖6為區塊產生流程,在尚未開始之前會先建立一個「區塊」的物件,存放需要的資料,區塊結構圖如圖7所示,區塊產生分為三大步驟:處理交易資料、讀取區塊鏈及產生新區塊。
第一步處理交易資料,節點會收到伺服器端傳來之交易內容並讀取之後放入區塊之「Transaction」欄位,再對所有交易資料建構默克爾樹來取得默克爾樹根值,並放入區塊之「Root」欄位。
第二步讀取區塊鏈,讀取區塊鏈中最尾端區塊,取得該區塊之DIGEST及編號,區塊之編號遞增即為新區塊的「Index」欄位,前區塊的DIGEST即為新區塊之「Previous Hash」欄位。
第三步產生新區塊,則是遵循共識機制的規則,將區塊編號、前區塊DIGEST、時間戳、資料根值、自己的節點名稱及欲猜測的值(Nonce值)串聯後做DIGEST的運算,判斷產生結果之DIGEST有無符合共識機制規定的難度(即DIGEST須小於0x00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff),如不符合則將Nonce值遞增並進行雜湊運算。重複上述步驟直到某Nonce值之DIGEST小於規定之難度,即完成共識機制,最後區塊即可加至帳本上正式接上區塊鏈。
資料同步傳輸
在資料同步傳輸上,資料會有下列幾種傳輸過程,第一種為節點傳送日誌資料,第二種為節點傳送區塊資料,第三種為Server端發送區塊資料,第四種為Server端發送日誌資料,如圖8所示。
‧節點傳送日誌資料:節點傳送日誌資料給Server端會發生在節點寫入日誌資料之後,會自動將節點資料發送至Server端,Server端隨時開啟監聽模式以利接收資料,並在接收資料後判斷接收的資料為日誌資料或區塊,若Server端接收到日誌資料時,則將日誌資料儲存至本地端檔案,若Server端接收區塊,則把區塊加入帳本中,如下段節點傳送區塊資料所述。
‧節點傳送區塊資料:Server端接收節點傳來之區塊資料會跟上述Server端接收日誌資料同時進行,挖礦節點在接收Server端日誌資料後會產生區塊,並自動將區塊傳送至Server端,Server端將接收資料後判斷接收之資料為區塊或日誌資料。若判斷後為區塊,則把區塊資料儲存至本地端帳本檔案,並自動將此區塊發送給各個節點,若判斷為日誌資料,則將日誌資料儲存在本地端檔案中,如上一種情形所述。
‧Server端發送區塊資料:節點接收區塊資料會在上述節點傳送區塊資料後進行,Server端接收區塊即可廣播此區塊給各節點,各節點接收資料後將判斷接收之資料為區塊或是日誌資料,如判斷為區塊就把區塊儲存至本地端帳本檔案,若判斷為日誌資料則進行下段Server端發送日誌資料。
‧Server端發送日誌資料:Server端發送日誌資料給挖礦節點流程中,Server端會記錄所有節點擔任之順序,以定時發送日誌資料給某一節點,節點接收資料後將判斷接收的資料為日誌資料或是區塊,如判斷為日誌資料將進行區塊產生,若判斷為區塊將進行上一種情形所述。
驗證日誌資料
在企業發生資安事件需要證據佐證相關事實時,可透過日誌資料驗證來證明日誌檔的證據力。驗證流程如圖9所示,節點可至驗證系統中輸入日誌檔案名稱,接著系統開始搜尋每個區塊,確認區塊內是否存在此日誌檔,如無相對應資料則結束搜尋程序;若日誌檔存在於區塊內,則擷取此區塊資料,將資料寫入區塊資料字典中,字典資料如表3所示,再擷取區塊的交易內容,找出所搜尋日誌檔案列表所在之DIGEST。
接著,利用日誌檔案列表讀取日誌檔案資料,並計算出各檔案之DIGEST,再利用這些DIGEST建構莫克爾樹,得到之結果即可與區塊交易內的DIGEST比對。後續再發送要求給各個節點,請求協助驗證此區塊資料是否正確,等待一半以上之節點回傳值,即可結束驗證程序。
共識機制
共識機制解決了各節點如何在分散式系統中達成一致性的問題,在分散式系統中,沒有一個中心化的記帳機構,導致各個節點所收到的交易不可能完全一致,因此需要設計一套機制讓各節點達成共識,此機制規範了必須由誰來建構區塊,也就是記帳權的給予,以及如何維護區塊鏈的一致性。以下將介紹此系統如何設計適用於日誌資料之數位證據保全的區塊鏈共識機制。
在此系統中,利用Server端作為整個系統的中界點,除了擔任註冊中心外,也可透過Server端統整各節點資料傳送給單一節點,以加速資料傳輸效率及減低資料錯誤機率,使交易資料達成一致性,Server端也會定時檢查各節點之資料正確性及完整性。
在記帳權給予部分,此系統使用類似股份授權證明機制(DPOS)之概念,DPOS為節點共同選出代表輪流記帳,但DPOS的記帳人是選舉而產生,本系統為所有節點輪流擔任記帳人,全節點皆須付出算力去計算出區塊結果,並非由某群人或特定人士記帳,輪流擔任的另一個好處為保障其他節點的公平性,由於此鏈為聯盟鏈,並非商業用途,故不發行虛擬貨幣,也就沒有所謂的獎勵機制,少了獎勵節點可能會蓄意降低自身電腦算力,這將導致無人產生區塊問題,故Server端為了維持此平衡,將直接指派節點產生區塊,而每個節點獲得記帳權的機率皆為平等,並非由Server端直接決定。
產生區塊的方式如同工作量證明中的方法,節點會產生一隨機數(Nonce)連同區塊資料做雜湊運算,最後計算出來的結果符合系統所需,即DIGEST須小於0x00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff。
此方法比起工作量證明只需要單一節點付出算力,資源消耗量極低,且因Server端作為中界點,達成共識的所需時間低,效能也較高。
情境與系統應用
接著,以情境建置此系統並討論相關應用,本系統建置所使用的程式語言為Python,版本為2.7.15,系統分為前端與後端,前端利用網頁輸出須檢視的資料,利用的是Python寫成的Django框架來建置網頁,後端則處理寫入日誌資料、區塊產生、資料同步及驗證日誌資料過程,利用Python語言及其中的套件幫助程式的撰寫,後端套件包括json、datetime、hashlib、os、csv以及socket,圖10為各套件之運用關係圖,表4則是各套件之簡短用途介紹。
此架構可透過節點將日誌資料上鏈做資料保全,當有需要驗證日誌資料的完整性,使用者可至系統輸入欲搜尋日誌資料檔案名稱。系統會找出日誌資料所在區塊,並重新計算日誌資料之莫克爾樹,再比對此區塊之交易內的DIGEST,如圖11所示。
節點傳送此區塊及DIGEST請求其他節點幫忙驗證是否一致,若結果一致,在網頁畫面中間之「PEER比對結果」會顯示「peer結果 correct」,如圖12所示。
進到系統中,也可看到已完成的區塊內容及正在打包之日誌資料,如圖13所示呈現了區塊及交易資料。
圖14為驗證頁面,使用者可在畫面左側之對話方塊輸入日誌檔案名稱及公司名稱,在左下的「SERVER驗證結果」會輸出比對結果,在中間的「PEER比對結果」則輸出各節點回傳之比對結果,而在畫面右側會顯示日誌檔案所在之區塊詳細資料。
結語
本文所介紹之系統可讓日誌資料具備證據能力,在法庭上訴訟也可利用此技術讓日誌資料的證據力更強,使得企業在個資法上可達到無過失免責,也可透過日誌資料追蹤事件發生之緣由。
<本文作者:社團法人台灣E化資安分析管理協會(ESAM, https://www.esam.io/)資訊安全暨區塊鏈應用實驗室(https://iclin.nchu.edu.tw/)主持人林詠章教授致力於資訊安全技術及區塊鏈應用之研究,在資安領域目前主要的研究方向包含:物聯網安全、AI惡意軟體偵測、智慧工廠即時系統的攻擊與防禦等。區塊鏈應用的研究方向包含:智慧合約應用、區塊鏈金融科技、物聯網區塊鏈技術等。>