この記事では、AIを作ってみよう:Webセキュリティ(1/4) に続き、AIを実際に作っていきます。
このプログラムは、あなたのaccess_logもそのまま分析できるものです。
まだパソコンの準備ができてない人は、こちらから読んでください。 AIを作ってみよう:環境の準備から
プログラムのコピペ
それでは、AIを作っていきましょう。
下のプログラムをコピーして、自分のPCのデスクトップへファイルとして保存してください。Pythonプログラムは通常 .py という拡張子を付けます。
サンプルログもクリックしてデスクトップへ保存してください。
コピペについてもう少し詳しい手順はこちら。
- 下のプログラム(データ)をマウスでなぞって全部選択します。
- 右クリック→コピーを実行します。
- メモ帳を開いて、右クリック→ペーストを実行します。
- メモ帳のファイル→保存を実行します。
- 場所はデスクトップとし、ファイル名に一番上に書かれた名前(webaccess_grouping.py)を書いて保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import pandas as pd import numpy as np import csv import re import copy from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler CLUSTERS = 8 INPUT_FILE = 'access_log' CSV_FILE = 'access_log.csv' RESULT_FILE = 'access_log_result.csv' PLT_FILE = 'access_log_plot.jpg' fr = open(INPUT_FILE) fw = open(CSV_FILE, 'w') line = fr.readline() while line: line=line.replace(',','') fline = re.sub(r'^(\S+) (\S+) (\S+) \[([^\]]+)\] "([A-Z]+) ([^ "]+)? HTTP/[0-9.]+" ([0-9]{3}) ([0-9]+|-) "([^\"]*)" "([^\"]*)"', r'\1,\2,\3,\4,\5,\6,\7,\8,\9,\10', line) fw.write(fline) line = fr.readline() fr.close() fw.close() # load csv with header all_data = pd.read_csv(CSV_FILE, header=None) all_data.columns = ['s-ip','s-user','auth-user','date','action','resource','status','bytes','s-url','s-agent'] fit_data = copy.copy(all_data) fit_data.drop(['s-user','auth-user','date','action'], axis=1) # charactors to numbers for i in range(len(all_data)): for col in all_data.columns: astr = all_data[col][i] fit_data[col][i] = astr if str(astr).isdecimal() else sum(int(ord(c)) for c in astr) # AI analysis bunrui = KMeans(n_clusters=CLUSTERS).fit_predict(fit_data) all_data['bunrui'] = bunrui[:] cnt = all_data['bunrui'].value_counts() print(cnt) all_data.to_csv(RESULT_FILE,index=False) |
サンプルログ
サンプルログは行数が多いので、下をクリックしてダウンロードしてください。ファイル名は access_log のままとし、プログラムと同じ場所に置いてください。
サンプルログのダウンロード
保存できたでしょうか。
プログラムの詳しい解説は次の記事に書きます。できるだけ簡単な解説にしましたので、後で初心者の人も見てみてください。
実行
プログラムとデータの計2ファイルが保存できたら、下記のように実行します。
- コマンド入力ウィンドウを開きます。
Windowsの場合:スタートボタンを押す → メニューが出たらそのまま「cmd」と打ち「Enter」。
Macintoshの場合:「ターミナル」を実行します。 - 3ファイルを保存した場所に移動します。デスクトップであれば
Win,Macどちらも「cd desktop」と打ち「Enter」です。 - AIの学習を実行します。
「python webaccess_grouping.py」と打ち「Enter」。 - 1分程度待つとAIの処理が終わり、分類結果の集計が表示されます。
- また、同じフォルダに「access_log_result.csv」という結果ファイルができています。
結果の確認
ウィンドウにはこのように表示されましたね。(件数は下と違うと思います。)
左の数字はログをグルーピングしたグループ番号です。今回は8グループに分けたので0~7が出ています。グループ番号に意味はなく、単純に8グループに分けたことを意味しています。
右は各グループに何件のログが分類されたかを表した数字です。
たった1件だけでグルーピングされたログがありますね。特徴が似たもの同士でグルーピングされているので、この1件だけ何か特殊だと言っているのですね。これにちょっと注目しながら、具体的なログを見ていきましょう。
出力された「access_log_result.csv」というログは、access_logの各行がどのグループに分類されたかを表しています。
Excelで開くと分かり易いです(Windowsの場合はダブルクリック)。各行に対して一番右にグループIDが振られています。その行がどのグループに分類されたかを示しています。
その中で、1件だけでグルーピングされた行を見つけます。「7」に分類された行でしたね。
実はこれは、通常のログの中に筆者が潜ませた攻撃ログなんです。(高度な攻撃は見せたくないので古いものにしました。)
これは、AIが他のログとはちょっと違うものを発見しているということなんですね。
今回は1件だけでしたが、本当の攻撃が来る時は連続しているかもしれません。それはそれで1つのグループへ分類してくれると考えられます。
このAIは明示的に「攻撃だ」と警告するようなものではありませんが、グループ単位でざっとチェックすることによって、ログを全て見るより簡単にセキュリティチェックができる、ということを狙っています。
このプログラムは、あなたのaccess_logもそのまま分析することができるので実行してみてください。
いかがでしょうか。
ちょっと物足りないとは思いますが、AIの一端を見ることができたと思います。案外、AIの本体というのはこんなもので、周辺アプリで工夫をして良く見せるというような形も多いです。
AI開発にはAIエンジンとその周辺のアイデアも大事になってくるということですね。
次の記事では、プログラムを簡単に解説します。