學習筆記(一):使用K近鄰演算法檢測web異常操作
阿新 • • 發佈:2018-11-10
黑客入侵Web伺服器後,通常會通過系統漏洞進一步提權,獲得ROOT許可權。我們可以通過蒐集LINUX伺服器的bash操作日誌,通過訓練識別出特定使用者的操作習慣,然後進一步識別出異常操作的行為。
1.資料蒐集
訓練集包括50個使用者的操作日誌,每個日誌包括15000個操作命令,其中5000條都是正常操作,後面的10000條日誌中隨機包含有異常操作,每100條操作作為一個操作序列,儲存在列表裡面,同時進行標註,每個操作序列只要有1條操作異常就認為這個操作序列異常。
with open(filename) as f: i=0 x=[] for line in f: line = line.strip('\n') x.append(line) dist.append(line) i+=1 if i==100: cmd_list.append(x) x=[] i=0
統計最頻繁使用的前50個命令和最不頻繁的前50個命令:
fdist = FreqDist(dist).key()
dist_max = set(fdist[0:50])
dist_min = set(fdist[-50:])
2.特徵化
(1)去重操作命令個數。以100個命令為統計單元,作為一個操作序列,去重後的操作命令個數作為特徵。
(2)最頻繁使用的前10個命令,以及最不頻繁使用的後10個命令。
(3)和統計的最頻繁與最不頻繁的50個命令計算重合度。
f1=len(set(cmd_block))
fdist = FreqDist(cmd_block).keys()
f2 = fdist[0:10]
f3 = fdist[-10:]
f2 = len(set(f2) & set(dist_max))
f3 = len(set(f3) & set(dist_min))
3.訓練模型
標識檔案的內容:每行50列,分別代表每個使用者的當前操作序列,正常操作標識為0,異常操作標識為1。
將某使用者的操作資料,並將前120個操作序列作為訓練序列,後30個操作序列作為測試序列。
用KNN函式進行訓練。
def get_label(filename,index=0)
x = []
with open(filename) as f:
for line in f:
line = line.strip('\n')
x.append(int(line.split()[index]))
return x
user_cmd_list,user_cmd_dist_max,user_cmd_dist_min = load_user_cmd("...")
user_cmd_feature = get_user_cmd_feature(user_smd_list,user_cmd_dist_max,user_cmd_dist_min)
labels=get_label("...",2)
y = [0]*50+labels
x_train = user_cmd_feature[0:N]
y_train = y[0:N]
x_test = user_cmd_feature[N:150]
y_train = y[N:150]
neight = KNeightborsClassifier(n_neightbors=3)
neight.fit(x_train,y_train)
y_predict = neight.predict(x_test)
4.效果檢測
檢測結果表示準確率為80%,不是很理想。
score = np.mean(y_test==y_predict)*100
web安全