加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 经验 > 正文

Web攻击检测机器学习深度实践

发布时间:2019-06-26 09:34:39 所属栏目:经验 来源:月亮与六便士
导读:副标题#e# 一、概述 1. 传统WAF的痛点 传统的WAF,依赖规则和黑白名单的方式来进行Web攻击检测。该方式过分依赖安全人员的知识广度,针对未知攻击类型无可奈何;另一方面即使是已知的攻击类型,由于正则表达式天生的局限性,以及shell、php等语言极其灵活的

基于上述三种特征提取思路,选择效果最佳的分词方式训练MLP模型,可以训练得到一个函数和参数组合,能满足对已知攻击类型的完全识别。但由于该MLP模型的特征提取发哪个是,部分依赖规则,造成理论上永远存在漏拦和误判。因为对识别目标来说样本永远是不充分的,需要人工不断的Review,发现新的攻击方式,调整特征提取方式,调整参数,重训练…这条路貌似永远没有尽头。

1. 为什么选择LSTM

回顾下上述的Web攻击请求,安全专家一眼便能识别攻击,而机器学习模型需要我们人工来告诉它一系列有区分度的特征,并使用样本数据结合特征,让ML模型模拟出一个函数得到一个是与非的输出。

安全专家看到一个url请求,会根据自身脑海中的“经验记忆”来对url请求进行理解,url请求结构是否正常,是否包含Web攻击关键词,每个片段有什么含义…这些都基于对url请求每个字符上下文的理解。传统的神经网络做不到这一点,然而循环神经网络可以做到这一点,它允许信息持续存在。

下载.gif

刚好利用LSTM对前后文理解优势,利用url请求的前后字符判断是否为Web攻击。这个好处是可以省去特征工程这一繁杂的过程。

正是这种对url请求特征的理解方式,让它具备了一定对未知攻击的识别能力。针对未知攻击变形来说,分词的MLP模型能理解cat,但对变形的 c’a’t则无法理解,因为分词会把它分割开来。而LSTM模型把每个字符当作一个特征,且字符间有上下文联系,无论cat 、c’a't 或 c”’a”’t 、””c’a’t””,在经过嵌入层的转换后,拥有近似的特征向量表达,对模型来说都是近似一回事。

2.  特征向量化和模型训练

这里仅对参数值请求的参数值进行训练。

  1. def arg2vec(arg): 
  2.   arglis = [c for c in arg] 
  3.   x = [wordindex[c] if c in I else 1 for c in arglis] 
  4.   vec = sequence.pad_sequences([x], maxlenmaxlen=maxlen) 
  5.   return np.array(vec).reshape(-1 ,maxlen) 
  6.  
  7. def build_model(max_features, maxlen): 
  8.   """Build LSTM model""" 
  9.   model = Sequential() 
  10.   model.add(Embedding(max_features, 32, input_length=maxlen)) 
  11.   model.add(LSTM(16)) 
  12.   model.add(Dropout(0.5)) 
  13.   model.add(Dense(1)) 
  14.   model.add(Activation('sigmoid')) 
  15.   # model.compile(loss='binary_crossentropy,mean_squared_error', 
  16.   # optimizer='Adam,rmsprop') 
  17.   model.compile(loss='binary_crossentropy', 
  18.   optimizer='rmsprop', metrics= ['acc']) 
  19.   return model 
  20.  
  21. def run(): 
  22.   model = build_model(max_features, maxlen) 
  23.   reduce_lr = ReduceLROnPlateau(monitor='val_loss' , factor=0.2, patience= 4 , mode='auto', epsilon = 0.0001 ) 
  24.   model.fit(X, y, batch_size=512, epochs= 20, validation_split=0.1, callbacks = [reduce_lr]) 
  25.   return model 
  26.  
  27. if __name__=="__main__": 
  28.   startTime = time.time() 
  29.   filename = sys.argv[1] 
  30.   data = pd.read_csv(filename) 
  31.   I = ['v', 'i', '%', '}' , 'r', '^', 'a' , 'c', 'y', '.' , '_', '|', 'h' , 'w', 'd', 'g' , '{', '!', '$' , '[', ' ', '"' , ';', 't ' , '>', '<', ' ', 'l' , 'n', ' r', '(', '=', ':', 'n' , '~', '`', '&', 'x', "'" , '+', 'k', ']', ')', 'f' , 'u', '', '0', 'q', '#' , 'm', '@', '*', 'e', 'z' , '?', 't' , 's', 'b' , 'p' , 'o' , '-', 'j' , '/',',' ] 
  32.   wordindex = {k:v+2 for v, k in enumerate (I)} 
  33.   max_features = len(wordindex) + 2 # 增加未知态(包含中文)和填充态 
  34.   maxlen = 128 
  35.   X = np.array([arg2vec(x) for x in data['args']]).reshape(- 1 ,128) 
  36.   y = data['lable'] 
  37.   model = run() 
  38.   logger.info("模型存储!") 
  39.   modelname = 'model/lstm' + time.strftime('%y_%m_%d' ) + '.h5' 
  40.   model.save(modelname) 

Web攻击检测机器学习深度实践

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读