2023年3月25日土曜日

ネットワークログの分析2 : ネットワークログから推移確率作成まで

今回は前回最後に集計したファイルを使って、そこから推移確率行列を作成していきます。前回作成したファイルは 
・netflow_day-02_sum.csv  (どのホストで通信があったかを集計したもの)
・netflow_day-02_device.csv  (ホストの集合、Src、Dstで和集合をとったもの)
の2つを利用していきます。
[2023/05/02 修正]
デバイス集合を和集合から積集合に変更したので、netflow_day-XX_device_intersection.csvを使うように変更します。

1. 推移確率行列作成のための元情報作成
推移確率行列は行和が1となる正規化されたものです。いきなりそれを作成する前に、一度どのくらいの量(カウント、通信バイト量など)があったかを推移確率の形で集計します。つまり、行はFromのホストが並び、列はToのホストが並びます。推移確率行列は正方行列のため、FromとToは同じホストが並びます。これは上記のnetflow_day-02_device.csvを使います。必要なライブラリを取り込み、ファイルを取り込みます。-> 変更 netflow_day-02_device_intersection.csv

この後、推移量をまとめるための2次元配列を用意します。

今回は元データにある、通信回数、通信時間、パケット数(fron, to)、バイト量(from, to)で作成しています。

保存されるcsvファイルはデータ量が大きいので注意が必要です。回数や通信時間は整数型なので、1.94GB、その他の実数型は6.79GBとなっています。計算は数分で終わると思いますが、保存に時間がかかります。

ここまでで各推移量の集計は完了です。
ここまでのソースコード

2. 推移確率行列への正規化
1で作成した推移量を使って、推移確率行列に正規化します。推移確率行列は行和が1なので、推移量のそれぞれの行和を求めて、割り算すればいいのですが、今回のdevice_listはSrcもDstもまとめた集合になっています。つまり、DstにしかなかったホストもSrcになりうる可能性があり、当然その行は通信がないので、行和が0となってしまいます。そのため、行和が0となるホストを集合から取り除いていきます。
行和が0となるホストの抽出->推移量とDevice_listから対象ホストを削除->行和が0となるホストの抽出->推移量とDevice_listから対象ホストを削除->...を繰り返していきます。今回はわかりやすくループでは実施していませんが、本来はループで一気に実施します。
今回は回数に注目してやっていきます。改めて保存したcsvファイルを取り込んでからやっていきます。
(1) 1回目 : 行和が0になるホストを削除(行と列を削除する) -> toにしかないホストを削除
行和が0となるホストのリストを作成して、推移量行列から削除していきます。

この処理で31,142×31,142の推移量行列だったものが、25,847×25,847に減りました。
(2) (1)でのホストをDevice_listから削除
Device_listからも(1)で選択された行和0のホストを削除します。
この(1)、(2)を行和0となるホストがなくなるまで繰り返します。
2回目

3回目

4回目
4回目では行和0のホストは検出されず、3回で終了です。
念の為、ここまでの推移量の行和0となった情報とホスト集合をcsvに保存しておきます。
最後に行和で割って、推移確率行列として、「transition_count_non0_rate.csv」として保存します。
transition_count_non0_rate.csvは実数型なので、データ量が少し大きくなるので注意してください。また今回のような回数(整数型)は行和で割るときに、キャストが必要です。

ひとまず、ここまでの流れを実施するには、下記の2つのソースファイルを利用しましょう。

2023年3月19日日曜日

ネットワークログの分析1 : ネットワークログの取得と分析準備

 ネットワークログは様々なものがありますが、オープンデータで入手できるものを使って、分析をしてみようと思います。ここでは以下の点に注目して実施していきます。プログラム言語はPythonでやっていきます。

(1)大量なログを分析できる形に整えることができる

(2)ネットワーク管理者が設計図で確認できる内容ではなく、実際のネットワークデータから、コンピュータ間の同値類(セグメントみたいなもの)を確認し、可視化する

(3)コンピュータ間の通信をマルコフ連鎖でモデル化する(推移確率を求める)

1. 利用データの準備

今回は「Unified Host and Network Data Set」を使わせてもらいます。ここには「Network Event Data」と「Host Event Data」の2つがあり、今回は「Network Event Data」を使います。このデータは、サイトから引用すると下記のような項目があり、シンプルでわかりやすいです。

利用するためには、メールアドレスの登録をすると、データをダウンロードするためのスクリプトが出てくるので、Linux等の環境で行い、ダウンロードを行なって下さい。ただし、データが巨大なので十分な領域を確保してやりましょう。解凍後のcsvの1ファイルは7~10Gbyte位あります。あと謝辞にこのサイトを入れるのを忘れないようにしましょう。
M. Turcotte, A. Kent and C. Hash, “Unified Host and Network Data Set”, in Data Science for Cyber-Security. November 2018, 1-22

ダウンロードしたら、展開しておき、csvファイルを確認します。今回は最初の日のデータで、「netflow_day-02.bz2」(1.08GB)を展開した「netflow_day-02.csv」(7.15GB)を使っていきます。

bz2の展開には「bunzip2 netflow_day-XX.bz2」のようにbunzip2を使うといいでしょう。

2. データの取り込み

必要なモジュール(numpy, pandas, matplotlib.pyplot)をインストールして、ファイルを取り込みます。

無事データの取り込みができると、このファイルでは、115,949,436件のデータがあることがわかります。
基本統計情報を見てみると、特にバイト数が桁数が大きいところがあるので、他の項目もまとめて10^6で割り、バイトはメガバイト(MB)に変換しておきます。maxの項目をみると、桁数が減っていることがわかります。
変更前のdf.describe()
10^6で割った後のdf.describe()

3. デバイス集合を作成
「SrcDevice」と「DstDevice」を使って、デバイス集合を作成します。このデバイス集合を使って、どこからどこへの通信があるかを集計していきます。SrcDeviceにしかないデバイス、DstDeviceにしかないデバイス、両方にあるデバイスがあるので、それぞれ集合として抽出して、その和集合を取ります。SrcDeviceには25,847件、DstDeviceには25,308件ありました。

[2023/05/02]修正
ここで書いてあるように、最初はデバイスの和集合でやっていました。取りこぼしが無いように、全てのデバイスで集計して、通信が無いデバイスを後から削除しようと思いましたが、実際やってみると、集計ファイルが100GBになり、とても無理でした。ですので、和集合ではなく、積集合をとり、From <--> To の通信が両方ともあるデバイスのみ対象に変更しました。

4. 推移表の作成
3で作成したデバイス集合を使って、どのデバイスからどのデバイスへ通信があったかを集計します。今回はデータフレームの抽出は使わず、groupbyを使うことで高速に処理できます。

2022年9月14日水曜日

AWS Rekognition (5) : カスタムラベルの利用

物体抽出したい画像が集まったら、オリジナルの学習モデルをカスタムラベルで作成します。

(1) Custom Labelsのプロジェクトを作成

Amazon RekognitionからCustom Labels -> Use Custom Labels -> Get Started -> S3バケットの作成をしていきます。このS3バケットに画像を入れて学習をしていきます。



ProjectsからCreate Projectをして作成していきます。
プロジェクト名を指定して、プロジェクトを作成します。

(2) 学習用データセットを作成
プロジェクトが作成されると下の図のように、順番に何をするかが示されます。最初はデータセットを作成していきます。

1のcreate datasetをクリックします。
いくつかの選択肢がありますが、今回は
「Start with a single dataset」:学習データ、テストデータには自動で分割
「Import images from S3 bucket」:S3にアップロードしたデータを利用
の2つを選んで実施します。

いったんここでS3に移動して、画像をアップロードします。
今回は imageフォルダの中の3つのフォルダに入っている画像30枚を利用します。Custom Labelで強制的に作られたS3バケットの中にimageフォルダをアップロードしておきます。
アップロードが終わると、下記の画面が見えます。

右上にある「Copy S3 URI」でリンクをコピーします。
コピーしたら、もう一度Custom Labelsに戻ります。
S3 URIをコピーし、「Automatically assign image-level labels to images based on the folder name」にチェックを入れます。これでフォルダ名がラベル名となります。

ここまでできたら、Create Datasetをクリックします。画像が取り込まれると、ラベルのついた画像があることがわかります。

注意:AWS Academyで上記を実行すると、Network エラーになるかもしれません。なった場合は、S3からの同期ではなく、自分のPCからアップロードを選択して、一つひとつやってみて下さい。

(3) 学習の実行
「3. Train model」でボタンを押し実行します。

trainが始まり、進行中だと表示されます。数時間、学習に時間がかかります。
表示が変わり、精度など確認できれば学習完了です。


(4) 学習モデルの利用
作成した学習モデルを使っていきます。学習済みのプロジェクトから上のメニューで「Use Model」を選択します。下の API Code でPythonを選択すると、pythonコードが出てきます。

ソースコードには、Start Model、Analyze Image、Stop Modelがあります。Start、Stopはプロジェクトのボタンでもできます。Startは時間がかかります。Stopはすぐにできます。利用しないときはStopしましょう。ここではAnalyze Imageを見ていきます。PythonコードをSageMakerで実行していくので、SageMakerを開きます。
!pip install boto3
でライブラリをインストールしておきます。モデルをStartした後、以下を実行します。AWS Academyの場合はセッション情報も必要です。

図のように検出ができればOKです。

色々書きましたが、AWS RekognitionにあるTutorialの動画4本がわかりやすいので、そちらを参照して下さい。

2022年9月9日金曜日

AWS Rekognition (4) : 教師画像の収集

 自分がターゲットにしたい対象物を認識させるためには、その対象物の教師画像を用意して学習させなければなりません。今回はFlickrという画像収集サイトのAPIを使って、まとめて画像を取得してきます。どのようなpython環境(Google Colab)でもできますが、ここではSageMakerで実施していきます。

(1) Flickr APIの用意

Flickrでは様々な画像を取得できますが、一度に取得するためには、APIを使った方が便利です。詳しいページもたくさんあるので、下記を参考にしてFlickr APIキーを取得して下さい。

https://worktoolsmith.com/flickr-api-key/


http://kwski.net/api/807/

(2) ライブラリのインストール

最初にFlickr APIを使うためのライブラリをインストールしておきます。Jupyterファイルを用意して、ファイル名を付けて保存しておきます。そのファイルに下記2つのコマンドを書き、インストールします。

!pip install flickrapi

!pip install retry

(3) プログラムの実行

最初に画像を格納するフォルダを作成します。今回は「image」とします。これをjupyterファイルと同じ階層に用意します。imageの中にキーワードをフォルダ名として作成し、そのキーワードフォルダの中に画像を10枚程度保存していきます。以下のプログラムを実行します。


プログラムをキーワードを富士山として実行すると、./image/富士山/ フォルダができ、その中に画像が格納されます。

他のキーワードでも検索を行うと、フォルダが作成され画像が格納されます。

このような形で教師画像を取得することができました。

(4) 取得画像のダウンロード

S3にプログラムで転送してもいいのですが、ちょっと面倒なのでここでは、手元にダウンロードしてから、改めてS3にアップロードします。jupyterファイルに次を追加します。jupyterファイルと同じディレクトリにあるimageフォルダの中身を全てzip化します。

!zip -r image.zip ./image/*

zipファイルが作成されますので、ダウンロードして中身を確認して下さい。

これでS3にアップする準備ができました。