2023年5月16日火曜日

ホストログの分析3 : 推移確率行列の算出

 第1回で求めた「wls_day-07_all.csv」に対して、推移確率行列を求めていきます。まず、状態空間を何にするかを検討する必要がありますが、第2回でEnvetIDに対して頻出回数を求めました。今回もEventIDを状態空間として、時系列にどのような推移があるかをカウントし、推移確率に直していきます。

・ライブラリの利用:mpi4py

今回のプログラムは利用者が数万人ですので、一人一人の推移を確認していくと、かなりの時間がかかってしまいます。そのため、並列計算を用いて、各プロセスに計算する利用者を割り振り、計算時間の短縮をはかります。注意として、並列計算をすると各プロセスでメモリを消費するので、今回プロセス数は8で実施しました。計算時間は約1時間ほどでした。

・工夫している点:状況をファイルに書き込み

並列計算をしていると、mpi4pyではターミナルへの標準出力が途中ではされなくなってしまいます。実行の状況を確認するために、プロセス0ではファイルの書き込みを行い、どのような段階にあるかをファイルを見ることで確認できます。Linux系OSでは、「tail -f ファイル名」で更新している様子が自動更新されわかりやすいです。

最後に、各プロセスでカウントした推移をプロセス0で集約して、行和を1にすることで正規化しています。これで推移確率行列ができています。

ソースコードリンク:https://github.com/smzn/CyberSecurity_MarkovChain/blob/main/HostEventsTransition.py

2023年5月8日月曜日

ネットワークログの分析3 : 同値類の算出

 デバイス間の推移確率が求められたので、次はこの推移確率から同値類とその同値類中の中心ノードを算出していきます。利用するファイルは以下のファイルです。transition_count_non0_rate.csv

このファイルを取り込んでいきます。

この推移確率行列から、デバイスを状態として、状態を同値類に分類していきます。同じ同値類であることは、相互到達可能であることを意味します。デバイス間で相互到達可能の集合がいくつあるかを調べていきます。次の関数を利用します。
getEquivalence4(th, roop, p)関数
この関数は3つの引数(th, roop, p)を持ちますが、thは推移しているとみなすことができる閾値です。つまり、この値より推移確率が大きいとき、推移があると考えます。roopは何回で到達可能かを示す値です。pは推移確率行列です。戻り値はmodify_equivalence, class_number, reachableがあります。modify_equivalenceは同値類ごとにデバイスが分類されています。class_numberは同値類の数、reachableは状態間で推移が可能かどうかを{0,1}で表した接続行列です。
もう一つ関数を作っていきます。
getDegreeMax(equivalence, reachable)関数
これは、同値類の中で中心性のノードがどれかを計算しています。次数中心性で求めています。
今回の計算結果では、
同値類数が6964個、
最大クラス数 : 18090、
最大クラスを持つindex : 0 
最大クラスの最大次数を持つノード番号 : 6947、
デバイス名 : Comp186884
となりました。ここまでの結果で同値類数、同値類の中の中心性デバイスの情報がわかるようになりました。