如何使用Keras框架來構建LSTM RNN來對網絡請求進行區分
向量機(SVM)、神經網絡和無監督模型。
學術界和實際應用領域目前正時刻關注著深度學習和神經網絡的最新進展。事實證明,深度學習和神經網絡在圖像識別和自然語言處理(NLP)方面表現出眾。我們是否可以利用神經網絡的NLP能力來處理這個分類問題呢?這就是我們想要測試的。
我們通過模擬API給出JSON形式的訪問請求日志,如下所示:
{ “ timestamp”: 1502135820943, “ method”: “get”, “ query”: { “query”: “Lawn & Garden Buying Guides”}, “ path”: “/search”, “ statusCode”: 200, “ source”: { “remoteAddress”:“22.73.58.187”, “userAgent”: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36”}, “route”: “/search”, “ headers”: { “host”: “localhost:8002”, “connection”: “keep-alive”, “cache-control”: “no-cache”, “user-agent”: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36”, “accept”: “*/*”, “accept-encoding”: “gzip, deflate, br”, “accept-language”: “en-US,en;q=0.8,es;q=0.6”}, “ requestPayload”: null, “ responsePayload”: “SEARCH”}
JSON格式的數據是不能用作神經網絡模型的輸入的。模型的輸入必須是數字,因此,需要對文本進行預處理。由于請求日志的內容包含各種字符串、符號和數字,因此,我們選擇將每個日志條目預處理為字符序列。
將日志條目作為字符序列進行處理,就是將請求日志文本中的每個字符映射到字典中的數字。相關聯的數字表示該字符出現的頻率。這個字典最初是用訓練數據來創建和擬合的,這樣,后續的字符就可以映射到以前曾經出現過的字符上去。例如,在字典中,“,”字符是訓練數據集中第七個出現頻率最高的字符:
{ “ ”: 39, “(”: 77, “,”: 7, “0”: 8, “4”: 26, “8”: 28, “《”: 64, “D”: 71, “H”: 59, “L”: 61, 。。.
字符序列學習的一個不錯的選擇是使用遞歸神經網絡(RNN)。更具體點說,就是選擇使用RNNs的長短期記憶網絡(LSTM)變體,因為它在學習序列的應用中被廣泛使用并取得了成功。 LSTM有點復雜,但這并不是這篇文章的重點,不過如果在高層次上對此有一點了解的話,在修改模型時會有一些幫助。更多有關序列學習和LSTM的實踐可以在Andrej Karpathy編寫的RNNs的不合理有效性一文中找到。
為了快速開發神經網絡模型,我們選擇使用運行在Tensorflow之上的高級Keras API,而不是直接使用Tensorflow。通過使用Keras為Tensorflow提供的樣板設置,我們能夠節約很多時間,并快速地構建起模型原型。
Keras的神經網絡模型使用起來非常容易,只需實例化一個模型對象,然后就可以添加層了!初始的嵌入層指定了矢量輸入的預期維度,LSTM隱藏層則由64個神經元以及單獨的壓差層來定義以減少方差,最后則是密集輸出層以產生分類置信度。
model = Sequential() model.add(Embedding(num_words, 32, input_length=max_log_length)) # Prevent overfitting using dropout method of regularizationmodel.add(Dropout( 0.5)) model.add(LSTM( 64, recurrent_dropout= 0.5)) model.add(Dropout( 0.5)) # Condense to single binary output valuemodel.add(Dense( 1, activation= ‘sigmoid’)) model.compile(loss= ‘binary_crossentropy’, optimizer= ‘adam’, metrics=[ ‘accuracy’]) # Training set automatically split 75/25 to check validation loss/accuracy at each epochmodel.fit(X_train, Y_train, validation_split= 0.25, epochs= 3, batch_size= 128, callbacks=[tb_callback]) # Evaluation of separate test dataset performed after trainingscore, acc = model.evaluate(X_test, Y_test, verbose= 1, batch_size= 128)訓練
使用LSTM RNN二元分類法則意味著是在模型上應用監督學習算法。因此,訓練數據集中的每個日志條目都需要有一個附帶的標簽來描述該記錄的請求是正常的還是嘗試注入攻擊的。
0= Normal requestlogentry 1= Requestlogindicates attempted injection attack
對于生成數據來訓練模型,則可以使用模擬API來模擬一個非常簡單的電子商務應用程序。例如,模擬出/login、 /search、/checkout等URL。由于我們并沒有真實用戶去訪問模擬API,因此我們需要引入一些運行時選項來運行服務器并自動執行請求。我們將這些自動化的請求流量調整為每分鐘100次,這樣訓練數據集的日志就能快速積累起來。
通過將自定義的日志記錄器添加到服務器框架中,可以輸出指定格式的數據集。為了區分正常和惡意請求,需要在所有的惡意請求前添加一個“attack”頭。通過檢查是否存在“attack”頭來確定每個請求日志條目的標簽。如果“attack”頭存在,則使用“1”來標記日志,并在寫入日志之前刪除“attack”頭,否則將日志標記為“0”。
由于使用模擬API來生成訓練數據集存在一些限制,并且為了確保得到一個更廣義的分類器,我們在預處理期間僅提取幾個必要的日志字段。這些屬性包括:“method”、“query”、“statusCode”、“path”、“requestPayload”。可以使用額外的數據、預處理和可能的單獨分類器來分析請求的內容。
自動化客戶會放那連續運行了幾個小時,以積累一定數量的訓練數據。為了快速訓練模型,我們將使用AWS p2.xlarge深度學習EC2實例。 AWS的深度學習AMI預先安裝了大多數的流行AI庫和API,你可以使用GPU進行大量的訓練。這個EC2實例每小時90美分的成本不僅節省了在大量數據集上訓練模型的時間,還節省了安裝和配置Tensorflow使之能夠在GPU上正常運行的時間。我們發現在新機器上安裝和配置Tensorflow相當地耗時。
為了減少偏差,生成的數據集中包含了大約50/50個正常和惡意的請求日志。該數據集分為75%的訓練子集和25%的驗證子集。經過幾次迭代之后,該模型能夠獲得相當高的精度。
從大約23000個請求日志樣本得到的訓練結果
上圖中的準確度和損失指標也會通過Keras訓練腳本中附帶的Tensorboard回調記錄在日志中。這些日志是訓練期間檢查點的積累,這對于在訓練期間和之后將模型的性能可視化非常有用。
實現
有了訓練過的模型,現在是時候來實現SecuritAI用戶界面程序了,該應用程序用于托管模型以進行實時的預測。與模擬API一樣,我們堅持使用自己最熟悉的Java語言。我們構建了一個React UI,作為監視來自請求日志流活動的儀表板。該請求日志流使用AWS Kinesis來管理,用于橋接模擬API和SecuritAI UI之間的通信。
有一個小問題…… Keras是一個python庫,那么模型是如何在Java中進行預測的呢?幸運的是,有一個npm包可以用來實現這個需求,那就是keras-js! Keras-js允許Java應用程序運行在Tensorflow引擎上訓練Keras模型。這個庫使得我們能夠在Node.js應用服務器上運行所有的東西。
有關keras-js的更多信息,請參閱: https://github.com/transcranial/keras-js
演示
SecuritAI演示
經驗教訓與后期改進
總體而言,這是一個非常有趣的應用程序,從開發過程中你可以學到有關在Keras中使用Tensorflow建模的知識。也許已經有其他更加簡單的機器學習模型或平臺可以被用來代替LSTM RNN,但是如果沒有一點黑客精神的話,樂趣何在?在理想情況下,無監控異常檢測模型可能更適合于本應用。
作為后期的改進,該模型可以轉換為僅依賴Tensorflow API來運行、針對內容更豐富的請求頭進行訓練,以及執行多元分類以實現對可疑請求的分類。
GitHub上的代碼:
adamkusey/securitai-ui
adamkusey/securitai-lstm-model
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
如何使用Keras框架來構建LSTM RNN來對網絡請求進行區分下載
相關電子資料下載
- 【風火輪YY3568開發板免費體驗】第六章:在Solus上運行自定義模型并遷移到YY3 411
- 深度學習框架tensorflow介紹 480
- 深度學習框架pytorch介紹 454
- 【米爾MYC-JX8MPQ評測】+ 運行 TensorFlow Lite(CPU和NPU對比) 524
- 手把手帶你玩轉—i.MX8MP開發板移植官方NPU TensorFlow例程 444
- 在樹莓派64位上安裝TensorFlow 505
- TensorFlow Lite for MCUs - 網絡邊緣的人工智能 339
- 2023年使用樹莓派和替代品進行深度學習 1506
- 用TensorFlow2.0框架實現BP網絡 1849
- 那些年在pytorch上踩過的坑 571