TensorFlow でネットワーク侵入検知
IDS/IPS (侵入検知/侵入防御)
クラスキャットでは IDS/IPS (侵入検知/侵入防御)機能を装備したインターネットサーバ管理ソリューション「ClassCat® Cute Server Manager」を提供しており、ファイル改竄や Rookit を検知し、各種 brute force 攻撃や第三者中継など外部からの攻撃を防御することができます。
ネットワーク型の侵入検知については既に Spark ベースのネットワーク型 IDS ソリューション も提供しておりますが、本記事では軍用ネットワークを想定したパケットログをベースにニューラルネットワークによる可能性を探ってみました。(いずれ製品化するかもしれません。)モデルはシンプルな MLP で TensorFlow のみで実装しています。
題材: KDD Cup 1999 コンピュータ・ネットワーク侵入検知
題材にしたデータは KDD Cup (データマイニングの国際大会) 1999 の Computer network intrusion detection です。かなり古いデータですが軍用ネットワークを想定していて 700 MB 程度あり、ラベリングもされていますので有用です。
おそらく出題者は未知の攻撃への対策としてクラスタリング等によるアプローチを想定していると推測されますが、ここではニューラルネットワークの題材にしてみます。
トレーニングデータは約 500 万行あり、以下はデータの冒頭です :
0,tcp,http,SF,215,45076,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0,0,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,162,4528,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1,1,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,236,1228,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0.00,0.00,0.00,0.00,1.00,0.00,0.00,2,2,1.00,0.00,0.50,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,233,2032,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0.00,0.00,0.00,0.00,1.00,0.00,0.00,3,3,1.00,0.00,0.33,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,239,486,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,3,0.00,0.00,0.00,0.00,1.00,0.00,0.00,4,4,1.00,0.00,0.25,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,238,1282,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,4,4,0.00,0.00,0.00,0.00,1.00,0.00,0.00,5,5,1.00,0.00,0.20,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,235,1337,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,5,5,0.00,0.00,0.00,0.00,1.00,0.00,0.00,6,6,1.00,0.00,0.17,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,234,1364,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,6,6,0.00,0.00,0.00,0.00,1.00,0.00,0.00,7,7,1.00,0.00,0.14,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,239,1295,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,7,7,0.00,0.00,0.00,0.00,1.00,0.00,0.00,8,8,1.00,0.00,0.12,0.00,0.00,0.00,0.00,0.00,normal. 0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,normal.
各フィールドの意味は以下。タイムスタンプや IP アドレスがない点には違和感がありますが、攻撃のパケット記録としては十分なフィールドが揃っています :
duration, protocol_type, service, flag, src_bytes, dst_bytes, land, wrong_fragment, urgent, hot, num_failed_logins, logged_in, num_compromised, root_shell, su_attempted, num_root, num_file_creations, num_shells, num_access_files, num_outbound_cmds, is_host_login, is_guest_login, count, srv_count, serror_rate, srv_serror_rate, rerror_rate, srv_rerror_rate, same_srv_rate, diff_srv_rate, srv_diff_host_rate, dst_host_count, dst_host_srv_count, dst_host_same_srv_rate, dst_host_diff_srv_rate, dst_host_same_src_port_rate, dst_host_srv_diff_host_rate, dst_host_serror_rate, dst_host_srv_serror_rate, dst_host_rerror_rate, dst_host_srv_rerror_rate
そして攻撃の種類は以下の 23 種類。1999 年という年代を考慮しても少な過ぎる印象ですので、実用上は自前のログを用意する必要があります :
back, buffer_overflow, ftp_write, guess_passwd, imap, ipsweep, land, loadmodule, multihop, neptune, nmap, normal, perl, phf, pod, portsweep, rootkit, satan, smurf, spy, teardrop, warezclient, warezmaster
TensorFlow による実装、トレーニングと評価
モデルについては(複雑なものも考えていたのですが)シンプルな MLP で十分でした。パケットログは 40 程度の特徴量にしかならないので、その複雑さは CNN とは比較になりません。
下左図はトレーニング損失グラフ、下右図はテストデータによる検証精度です。
テストデータは複数用意されていますが、30 万行程度のラベル付きのデータを使用しました。 精度は約 97 % が上限でした。
![]() | ![]() |
以上