Python
Security
DeepLearning
セキュリティ
LSTM

LSTMを用いた不正アクセス検知を考察してみる。

前回はcharacter-level CNNによる悪性URLの検出について考えてみましたが、
今回はLSTMを用いた不正アクセスの検知を考えてみたいと思います。

自分の考えをまとめているだけなので読みづらいとこなどあるかもしれませんがご了承下さい。

LSTMによる異常検知手法

①過去の時系列データを学習させる。
②LSTMによる予測させたデータと実際に観測された実データを比べる
③予測データと実データの差が閾値を以内であれば正常、超えれば異常とみなす。

というのが大まかな流れです。

LSTMを用いた不正アクセス発見の手法の提案

今回はあるIPアドレスから、ログに保存されたGET先のURLとPOST先のURLがあるとして進めていきます。
例として

url_log.txt
①http://google.com/~~~~
②http://google.com/~~~~
③http://google.com/~~~~
④http://giita.com
⑤http://giita.com
⑥http://yahoo.co.jp
.
.
.

があったとします。実際のログは凄まじい量だとおもいます。
ここからLSTMに読ませるための時系列データを作成します。
まずはモデルの学習の入力に用いるデータをX_trainとしております。

X_train1=[[①http://google.com/~~~~],
         [②http://google.com/~~~~],
         [③http://google.com/~~~~],
         ]
X_train2=[[②http://google.com/~~~~],
         [③http://google.com/~~~~],
         [④http://qiita.com/~~~~],
         ]
X_train3=[[③http://google.com/~~~~],
         [④http://qiita.com/~~~~],
         [⑤http://qiita.com/~~~~],
         ]

こんな感じに一つずつズラして行くようなイメージです。
LSTMは文字列を直接文字として入力することができないので文字を数字に変換したりする必要があります。

入力データX_trainに対する出力をY_trainとすると

Y_train1=[④http://qiita.com/~~~~]
Y_train2=[⑤http://qiita.com/~~~~]
Y_train3=[⑥http://yahoo.co.jp]

となります。各X_trainの次に現れるデータを示しています。

これをLSTMに学習させて接続先のパターンを学習させます。
予測値と実データが大きく異なればウイルスによる不正アクセスが行われているのではないか?と考えることができます。
データを1年分ぐらい食わせてみれば面白い結果が出そうです。

問題点

・食わせるデータが正しいという保証が必要になる。
→不正アクセスが行われているデータを学習させたら不正アクセスを検知できない。

・新規の接続先に対して有用なのか?
→LSTMは過去に現れた接続先のパターンを学習して次の予測で接続先を決定します。仮に安全でも過去にないアクセス先が現れたら異常とみなすのでは。

個人的結論

新規のアクセス先が現れるたびに異常検知とみなしていれば、わざわざLSTMを使う必要もない。
新規アクセス先が現れてそれが正常か異常かを判断する仕組みが必要。