陳鑫龍 ,陳志翔 ,2,周小方
(1.閩南師范大學(xué) 計(jì)算機(jī)學(xué)院,福建 漳州 363000;2.數(shù)據(jù)科學(xué)與智能應(yīng)用福建省高校重點(diǎn)實(shí)驗(yàn)室,福建 漳州363000;3.閩南師范大學(xué) 物理與信息工程學(xué)院,福建 漳州363000)
隨著兩化融合進(jìn)程的不斷加速,工業(yè)控制系統(tǒng)逐漸接入互聯(lián)網(wǎng),使得原本的“工業(yè)信息孤島”變得不再封閉,但同時(shí)也不再安全。 近幾年,全球工控安全事件頻發(fā),不僅帶來了巨大的經(jīng)濟(jì)損失,同時(shí)也給人們的生活環(huán)境及人身安全帶來了巨大的影響。 Modbus 協(xié)議是工業(yè)控制系統(tǒng)(Industrial Control System,ICS)中的一種常用的通信協(xié)議,其具有實(shí)現(xiàn)簡單、部署方式多樣、標(biāo)準(zhǔn)公開等諸多優(yōu)勢,但同時(shí)也存在缺乏認(rèn)證機(jī)制、授權(quán)機(jī)制、加密機(jī)制和功能碼濫用等諸多缺陷,給系統(tǒng)帶來了一定的安全威脅。
國內(nèi)外許多專家學(xué)者對這一領(lǐng)域進(jìn)行了研究,EREZ N 等人提出了基于有限自動(dòng)機(jī)(Deterministic Finite Automaton,DFA)算法的異常檢測模型[1],該方法將數(shù)據(jù)包的每個(gè)字段都作為樣本特征,進(jìn)行深度檢測,雖然可以有效地識(shí)別出異常數(shù)據(jù),但是消耗了大量的時(shí)間資源。 詹靜等人設(shè)計(jì)了一種新的可信Modbus/TCP 通信協(xié)議[2],提高了使用專用通信協(xié)議的ICS 網(wǎng)絡(luò)安全性,但是該協(xié)議的實(shí)現(xiàn)需要提供可信硬件模塊,而且對協(xié)議進(jìn)行認(rèn)證也會(huì)影響通信的時(shí)間性能。GOLDENBERG N 等人提出了以寄存器值作為特征的異常檢測模型[3],以寄存器值是否處于正常值域范圍來判斷數(shù)據(jù)是否正常,但此模型的檢測方法過于片面,忽略了Modbus_TCP 協(xié)議通信過程中功能碼字段的重要性。 尚文利等人設(shè)計(jì)了一種粒子群優(yōu)化算法(Partical Swarm Optimization,PSO)進(jìn)行參數(shù)尋優(yōu)的 PSO-SVM 算法[4],通過功能碼的頻率識(shí)別Modbus_TCP 的異常流量,但該方法只考慮功能碼的作用,忽略了寄存器地址與功能碼之間的對應(yīng)關(guān)系。 李超等人提出了單類支持向量機(jī)的算法[5],該研究提取功能碼和寄存器地址的組合對序列作為特征進(jìn)行異常檢測,分類效果顯著,但是該方法數(shù)據(jù)預(yù)處理過程復(fù)雜,需要對數(shù)據(jù)集進(jìn)行歸一化處理才能進(jìn)行模型訓(xùn)練,易造成時(shí)間資源的浪費(fèi)。
綜合前人研究成果的優(yōu)點(diǎn)與不足,為了滿足ICS的安全性需求,能夠快速有效地發(fā)現(xiàn)ICS 通信數(shù)據(jù)的異常狀態(tài)以及系統(tǒng)潛在的威脅,本文對基于機(jī)器學(xué)習(xí)中的幾種Modbus_TCP 通信異常檢測方法進(jìn)行了對比研究,其中決策樹算法相比于其他的機(jī)器學(xué)習(xí)方法有一定的優(yōu)勢:
(1)該算法對數(shù)據(jù)的要求程度不高,一般只需經(jīng)過簡單的預(yù)處理便可供模型使用,而不用像支持向量機(jī)和邏輯回歸分類模型那樣需要對數(shù)據(jù)進(jìn)行歸一化處理,才能獲得較好的模型。
(2)該算法可以使用小樣本進(jìn)行模型訓(xùn)練,況且,即使是大樣本,決策樹分類模型也能在取得較好的分類效果的同時(shí)僅消耗較短的時(shí)間。 而此優(yōu)勢又十分符合工業(yè)控制系統(tǒng)高實(shí)時(shí)性的要求。
本文通過實(shí)驗(yàn)仿真模擬工控系統(tǒng)中主、從站間的數(shù)據(jù)通信,并通過Python 中的 Scapy 庫設(shè)計(jì)異常數(shù)據(jù)對模擬的通信系統(tǒng)進(jìn)行發(fā)包攻擊,從而在異常檢測終端獲取正常行為和異常行為兩種類型的原始數(shù)據(jù),再將原始數(shù)據(jù)經(jīng)過預(yù)處理后輸入到?jīng)Q策樹分類模型的算法中訓(xùn)練,通過實(shí)驗(yàn)測試能夠有效地識(shí)別出Modbus_TCP 流量中的正常數(shù)據(jù)和異常數(shù)據(jù)。
Modbus 是一種位于應(yīng)用層的通用傳輸協(xié)議[6],常應(yīng)用于工業(yè)控制系統(tǒng)之中。 Modbus 協(xié)議報(bào)文由4部分構(gòu)成:地址域、功能碼、數(shù)據(jù)域和 CRC 校驗(yàn)域。其中,數(shù)據(jù)域包含的信息有:寄存器地址、需要操作的項(xiàng)目和域中數(shù)據(jù)的實(shí)際大小。
Modbus_TCP 協(xié)議是 Modbus 協(xié)議在 TCP/IP 協(xié)議上的擴(kuò)展,由 3 個(gè)部分組成:Modbus 應(yīng)用程序協(xié)議報(bào) 頭 (Modbus Application Protocol,MBAP)、 功 能 碼 和數(shù)據(jù)域。 其中 MBAP 報(bào)頭是 TCP/IP 協(xié)議用來識(shí)別Modbus 應(yīng)用數(shù)據(jù)的單元,包含事務(wù)單元標(biāo)識(shí)符、協(xié)議標(biāo)識(shí)符、長度和單元標(biāo)識(shí)符四部分。 兩種模式的協(xié)議報(bào)文格式如圖1 所示。
圖1 Modbus 協(xié)議和 Modbus_TCP 協(xié)議報(bào)文格式
由圖1 可見,Modbus 協(xié)議只定義了功能實(shí)現(xiàn)字段、循環(huán)冗余字段,Modbus_TCP 協(xié)議在 Modbus 協(xié)議的基礎(chǔ)上增添了簡單的識(shí)別字段,并沒有設(shè)置任何可靠的防護(hù)機(jī)制,尤其是當(dāng)系統(tǒng)接入到以TCP/IP 協(xié)議為主的開放性網(wǎng)絡(luò)中時(shí),整個(gè)工業(yè)內(nèi)網(wǎng)便完全暴露在外網(wǎng)環(huán)境里,這給了黑客可乘之機(jī),他們可以輕而易舉地獲取工業(yè)內(nèi)網(wǎng)的信息,甚至攔截、偽造數(shù)據(jù)重傳,造成信息泄露或系統(tǒng)崩潰等惡劣影響。不過,Modbus_TCP 協(xié)議存在的缺陷在給工業(yè)控制系統(tǒng)帶來巨大風(fēng)險(xiǎn)的同時(shí),也提供了研究防護(hù)的契機(jī)。 本文便是針對Modbus_TCP 協(xié)議簡捷性、開放性的特點(diǎn)來構(gòu)造異常數(shù)據(jù)報(bào)文,模擬攻擊環(huán)境,以實(shí)現(xiàn)異常檢測。
決策樹算法的核心思想是將測試數(shù)據(jù)集輸入到訓(xùn)練好的決策樹分類模型中,從根節(jié)點(diǎn)開始,匹配數(shù)據(jù)集各列特征的相應(yīng)屬性,根據(jù)特征中不同的值尋找相應(yīng)的分支,最終遍歷到葉子節(jié)點(diǎn),將葉子節(jié)點(diǎn)中存放的分類樣本標(biāo)簽的值作為決策結(jié)果。 本節(jié)中,通過信息增益[7]來選出最優(yōu)特征以確定決策樹的根節(jié)點(diǎn)及各子樹的根節(jié)點(diǎn)。
信息熵作為衡量一個(gè)事物特征的無序程度的度量標(biāo)準(zhǔn),能在數(shù)據(jù)集中選擇出無序程度最大的那列特征作為決策樹的劃分節(jié)點(diǎn)。 信息熵定義如下:
其中pi表示選擇該分類的概率,m 為樣本特征的列數(shù)。 由式(1)可見,樣本特征的不確定性越大(pi值越小),信息熵 H 越就大。 若將訓(xùn)練數(shù)據(jù)集定義為 X,且信息熵中的概率是由最大似然估計(jì)得到,則稱信息熵為經(jīng)驗(yàn)熵,用 H(X)表示。 若用|X|表示訓(xùn)練數(shù)據(jù)集 X 的樣本個(gè)數(shù),設(shè)訓(xùn)練集 X 有 n 個(gè)類 Ai,i=1,2,…,n,|Ai|是 Ai的樣本個(gè)數(shù)。 則:
選取最優(yōu)特征需要計(jì)算各個(gè)特征的信息增益,而計(jì)算信息增益需引進(jìn)條件熵的概念。 條件熵表示在已知隨機(jī)變量Y 的情況下隨機(jī)變量X 的不確定性,用 H(X|Y)表示。
其中,H(X|Y=yi)表示已知 Y=yi的情況下 X 的條件分布概率的熵。
信息增益與條件熵密切相關(guān),特征Y 對訓(xùn)練集X的信息增益Gain(X,Y)定義為集合 X 的經(jīng)驗(yàn)熵 H(X)與特征Y 給定條件下X 的條件熵H(X|Y)之差,即:
(1)特征選取。 在 Modbus_TCP 協(xié)議中,功能碼是主站向從站發(fā)送控制信息的重要字段,倘若數(shù)據(jù)報(bào)文中的功能碼出現(xiàn)異常,將導(dǎo)致執(zhí)行器出現(xiàn)錯(cuò)誤的操作。 此外,寄存器地址與功能碼有著很強(qiáng)的對應(yīng)關(guān)系,它們之間的可靠性與系統(tǒng)的安全性同樣息息相關(guān),常用寄存器地址與功能碼的對應(yīng)關(guān)系如表1所示。Modbus_TCP 協(xié)議中其他報(bào)文字段的缺失或遭到非法篡改不會(huì)對系統(tǒng)造成惡劣影響,而且檢測這些冗余的字段會(huì)占用很多存儲(chǔ)資源和計(jì)算資源。 因此,本文只選擇功能碼和寄存器地址作為決策樹分類模型的輸入特征,以滿足異常檢測的有效性和工業(yè)控制系統(tǒng)的實(shí)時(shí)性要求。
表1 功能碼與寄存器地址映射表
(2)數(shù)據(jù)的捕獲與交叉驗(yàn)證。用抓包工具捕獲主站與從站之間的通信流量,提取每條數(shù)據(jù)中的功能碼和寄存器地址字段作為樣本特征,并且對每一個(gè)樣本標(biāo)記好標(biāo)簽,構(gòu)成原始數(shù)據(jù)集,將原始數(shù)據(jù)集按照9:1 的比例進(jìn)行交叉驗(yàn)證,生成訓(xùn)練集與測試集。
(3)決策樹分類模型訓(xùn)練。 該模型可由 Sklearn 框架進(jìn)行訓(xùn)練,Sklearn 是機(jī)器學(xué)習(xí)中常用的Python 第三方模塊,里面封裝了許多機(jī)器學(xué)習(xí)的方法,只需簡單調(diào)用便可實(shí)現(xiàn)機(jī)器學(xué)習(xí)任務(wù)。 訓(xùn)練步驟如下:
①提取訓(xùn)練數(shù)據(jù)集中的分類樣本標(biāo)簽,用式(2)計(jì)算其信息熵。
②分割功能碼和寄存器地址這兩列特征,提取訓(xùn)練數(shù)據(jù)集中的功能碼,統(tǒng)計(jì)功能碼值相同的樣本數(shù)量并計(jì)算出其在總樣本數(shù)量中的概率,然后再用式(2)計(jì)算不同功能碼值的信息熵,最后用式(3)計(jì)算出整列功能碼的條件熵;同理計(jì)算出寄存器地址的條件熵。
③由式(4)可見,信息增益的值是由信息熵和條件熵確定的,條件熵越大信息增益就越小。 用式(4)可計(jì)算出功能碼和寄存器地址這兩列特征的信息增益,比較兩者信息增益的大小。
④取信息增益較大的特征作為最優(yōu)特征并成為決策樹根節(jié)點(diǎn),次優(yōu)特征則成為決策樹的中間節(jié)點(diǎn),將最后的二分類決策結(jié)果作為決策樹的葉子節(jié)點(diǎn)。 由此,得出一棵高度為3 的決策樹訓(xùn)練模型。
(4)測試模型結(jié)果。 調(diào)節(jié) Sklearn 模塊中相應(yīng)的參數(shù),將測試數(shù)據(jù)集中的功能碼和寄存器地址這兩列特征輸入到?jīng)Q策樹訓(xùn)練模型,從決策樹的根節(jié)點(diǎn)開始,匹配數(shù)據(jù)集中最優(yōu)特征的屬性,并根據(jù)其值尋找相應(yīng)分支進(jìn)入下一節(jié)點(diǎn),繼而匹配數(shù)據(jù)集中次優(yōu)特征的屬性,再根據(jù)其值尋找相應(yīng)的分支得到葉子節(jié)點(diǎn)的值,正常數(shù)據(jù)的葉子節(jié)點(diǎn)的值為1,反之,葉子節(jié)點(diǎn)的值為0。
決策樹模型構(gòu)建流程圖如圖2 所示。
圖2 決策樹算法分類模型構(gòu)建流程圖
本次實(shí)驗(yàn)通過Windows 7 系統(tǒng)進(jìn)行仿真,使用Modbus Poll 工具與 Modbus Slave 工具分別模擬工業(yè)控制系統(tǒng)中操作主站與操作從站。 Modbus Poll 是一個(gè)非常強(qiáng)大的Modbus 開發(fā)調(diào)試工具,支持進(jìn)行主站設(shè)備仿真,并支持多文檔接口,可以同時(shí)監(jiān)控和調(diào)試多個(gè)從站設(shè)備。 Modbus Slave 是從站設(shè)備仿真軟件,主要功能是接收主站設(shè)備的命令并發(fā)出響應(yīng),可用于測試主站設(shè)備,觀察Modbus 通信中的各種報(bào)文。 Modbus Poll 和 Modbus Slave 有著相同的操作界面,它們支持功能碼 01、02、03、04、05、06、15、16、22 和 23,支持 ASCII、TCP/IP 和 ModbusRTU 等協(xié)議。Scapy[8]是Python 中一個(gè)強(qiáng)大的交互式數(shù)據(jù)包操作程序,主要有路由跟蹤、掃描測試、發(fā)包攻擊和網(wǎng)絡(luò)探測與發(fā)現(xiàn)等功能。 本實(shí)驗(yàn)建立起 Modbus Poll 與Modbus Slave 模擬主站與從站之間的正常通信,通過使用Modbus_TCP 協(xié)議產(chǎn)生了正常的數(shù)據(jù)報(bào)文,Scapy 攻擊源接入 Modbus Poll 與 Modbus Slave 的通信鏈路之間,不斷偽造 Modbus_TCP 數(shù)據(jù)報(bào)文,發(fā)往系統(tǒng)。 為有效處理模擬通信中的異常數(shù)據(jù)報(bào)文,在網(wǎng)關(guān)處接入異常檢測終端,使用Python3.7 集成環(huán)境,安裝與決策樹相關(guān)的機(jī)器學(xué)習(xí)方法和Sklearn 模塊來分析處理數(shù)據(jù)。 具體模擬通信環(huán)境如圖3 所示。
圖3 模擬通信拓?fù)鋱D
異常檢測終端處安裝Wireshark 抓包工具,使用其自帶的命令行工具 Tshark 捕獲數(shù)據(jù)。 Tshark 是Wireshark 的一個(gè)命令行工具,可以通過調(diào)用命令對Modbus_TCP 協(xié)議網(wǎng)絡(luò)數(shù)據(jù)包中功能碼和寄存器地址等重要字段進(jìn)行提取,從而實(shí)現(xiàn)對數(shù)據(jù)的處理。
首先,打開Tshark 抓包工具,設(shè)置相應(yīng)的應(yīng)用參數(shù),使Tshark 只捕獲其中端口號為502 的Modbus_TCP數(shù)據(jù)報(bào)文;然后,調(diào)用相應(yīng)的命令提取每條數(shù)據(jù)中的功能碼字段和寄存器地址字段。
將提取到的功能碼字段和寄存器地址字段分別作為輸入數(shù)據(jù)集的兩列特征,并且對每一個(gè)樣本設(shè)置好標(biāo)簽,預(yù)處理成決策樹算法能夠處理的數(shù)據(jù)集。 本實(shí)驗(yàn)將預(yù)處理好的數(shù)據(jù)集分別隨機(jī)抽取160、320、480 個(gè)樣本的 3 組數(shù)據(jù)作為原始數(shù)據(jù)集。隨后進(jìn)行交叉驗(yàn)證,將原始數(shù)據(jù)集一分為二,隨機(jī)提取原始數(shù)據(jù)集的10%作為測試集,剩下的90%作為訓(xùn)練集,用測試集驗(yàn)證訓(xùn)練模型;3 組不同樣本數(shù)量的數(shù)據(jù)重復(fù)進(jìn)行交叉驗(yàn)證,提取測試集與訓(xùn)練集各 10 對。
調(diào)用Sklearn 模塊進(jìn)行模型訓(xùn)練。將預(yù)處理好的10 對訓(xùn)練集和測試集分別輸入到?jīng)Q策樹分類算法模型之中,通過Sklearn 模塊中的預(yù)測語句,得出決策樹分類模型的準(zhǔn)確率。 3 組樣本不同的數(shù)據(jù)集測試出模型的準(zhǔn)確率如圖4 所示。
由圖4 可見,本實(shí)驗(yàn)的決策樹分類模型的準(zhǔn)確率會(huì)隨樣本數(shù)的增加而逐漸增加,最終達(dá)到接近于100%的穩(wěn)定狀態(tài)。 而且在接近于100%準(zhǔn)確率所使用的樣本數(shù)量并不高。 總而言之,決策樹是一個(gè)具有支持小樣本訓(xùn)練且分類精度高的分類模型。
圖4 不同樣本數(shù)量的決策樹分類模型準(zhǔn)確率柱狀圖
本文設(shè)置了樸素貝葉斯分類模型[9]、邏輯回歸分類模型[10]和傳統(tǒng)支持向量機(jī)分類模型[11]作為對比實(shí)驗(yàn)以驗(yàn)證決策樹分類模型的可行性與優(yōu)越性。在設(shè)置邏輯回歸和傳統(tǒng)支持向量機(jī)的實(shí)驗(yàn)時(shí),需要將所有實(shí)驗(yàn)的數(shù)據(jù)集轉(zhuǎn)成二進(jìn)制模式,進(jìn)行歸一化處理,才能進(jìn)行模型訓(xùn)練。
本實(shí)驗(yàn)重點(diǎn)對4 個(gè)模型分離出正常流量和異常流量的準(zhǔn)確率、誤報(bào)率和漏報(bào)率進(jìn)行評判。此外,工業(yè)控制系統(tǒng)對時(shí)間性能的要求非常高,高準(zhǔn)確率、高延遲的分類模型對于系統(tǒng)而言并沒有實(shí)際的研究意義,因此,本實(shí)驗(yàn)也將4 個(gè)分類模型的算法運(yùn)行時(shí)間作為評判模型優(yōu)劣的一個(gè)重要指標(biāo)。
實(shí)驗(yàn)對 4 個(gè)分類模型分別取 160、320、480 個(gè)樣本的3 組數(shù)據(jù)集分別進(jìn)行10 次分類測試,調(diào)節(jié)Sklearn 模塊參數(shù)進(jìn)行訓(xùn)練與測試,并生成各自對應(yīng)的準(zhǔn)確率、誤報(bào)率和漏報(bào)率,分別對每組10 次測試的結(jié)果取平均值。 決策樹等4 個(gè)分類模型的分類準(zhǔn)確率對比分析圖如圖5 所示。
圖5 決策樹等4 個(gè)分類模型算法準(zhǔn)確率柱狀圖
由圖5 可見,決策樹分類模型的準(zhǔn)確率遠(yuǎn)遠(yuǎn)高于其他3 個(gè)分類模型的準(zhǔn)確率。
此外,誤報(bào)率與漏報(bào)率是在準(zhǔn)確率的基礎(chǔ)上評價(jià)模型優(yōu)劣的指標(biāo),誤報(bào)率太高將導(dǎo)致系統(tǒng)頻頻拉響異常警報(bào)信號,影響正常通信;漏報(bào)率太高則說明模型無法對異常的流量數(shù)據(jù)進(jìn)行識(shí)別,將導(dǎo)致系統(tǒng)無法拉響異常警報(bào)信號而陷入嚴(yán)重的危險(xiǎn)之中。決策樹等4 個(gè)分類模型誤報(bào)率和漏報(bào)率對比分析圖如圖6 所示,圖中決策樹的誤報(bào)率和漏報(bào)率是最低的,模型最優(yōu);樸素貝葉斯的這兩項(xiàng)指標(biāo)在0.5 處保持平衡;邏輯回歸和傳統(tǒng)支持向量機(jī)則呈現(xiàn)高誤報(bào)率、低漏報(bào)率。 功能碼字段和寄存器地址字段所組合成的正常數(shù)據(jù)和異常數(shù)據(jù)的點(diǎn)在直角坐標(biāo)系上分布較混亂,復(fù)雜度較高,因此,樸素貝葉斯分類模型對其分類困難;而邏輯回歸分類模型和傳統(tǒng)支持向量機(jī)分類模型對數(shù)據(jù)正負(fù)樣本的平衡性要求較高??偠灾诿鎸Ψ植蓟靵y復(fù)雜,正負(fù)樣本不平衡的數(shù)據(jù)時(shí),決策樹分類模型通過選擇分支能更容易地實(shí)現(xiàn)分類,從而體現(xiàn)出一定的優(yōu)勢。
圖6 決策樹等4 個(gè)分類模型算法誤報(bào)率和漏報(bào)率柱狀圖
對 4 個(gè)分類模型分別進(jìn)行 10 次測試,計(jì)算 4 個(gè)分類模型算法每次測試運(yùn)行的時(shí)間,對其取平均值,對比分析結(jié)果如圖7 所示。
圖7 決策樹等4 個(gè)分類模型算法運(yùn)行時(shí)間柱狀圖
圖7 中的時(shí)間表示平均每處理一個(gè)樣本,分類模型的算法所耗費(fèi)的時(shí)間。 在4 個(gè)分類模型的算法中,傳統(tǒng)支持向量機(jī)分類模型的算法運(yùn)行時(shí)間相對最短,決策樹算法次之。 但是對于工業(yè)控制系統(tǒng)的高實(shí)時(shí)性特點(diǎn),毫秒級的處理時(shí)間顯然是符合要求的。 而且,決策樹在數(shù)據(jù)預(yù)處理階段無需作歸一化操作,相比于邏輯回歸和傳統(tǒng)支持向量機(jī)節(jié)省了大量的時(shí)間資源,綜上所述,決策樹分類模型在時(shí)間性能方面更優(yōu)。
針對工業(yè)控制系統(tǒng)中的Modbus 協(xié)議存在的諸多安全問題,本文對基于機(jī)器學(xué)習(xí)的幾種Modbus_TCP通信異常檢測方法進(jìn)行對比研究。 對決策樹、樸素貝葉斯、邏輯回歸和支持向量機(jī)4 個(gè)分類模型進(jìn)行實(shí)驗(yàn)評估,結(jié)果表明決策樹分類模型在滿足工業(yè)控制系統(tǒng)的高可用性、高可靠性、高實(shí)時(shí)性需求的基礎(chǔ)上,能夠檢測出Modbus_TCP 協(xié)議中的網(wǎng)絡(luò)通信是否存在異常,分類準(zhǔn)確率較高,消耗時(shí)間較短,體現(xiàn)出了一定的優(yōu)越性。