1. 程式人生 > >學習筆記(一):使用K近鄰演算法檢測web異常操作

學習筆記(一):使用K近鄰演算法檢測web異常操作

黑客入侵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安全