
ネットワークトラフィックの分析と特徴抽出のためのフレームワーク。
LUCX(LUCID network traffic parser eXtended)は、pcap 形式の事前記録されたトラフィックトレースと、ネットワークインターフェースからキャプチャしたライブネットワークトラフィックの両方で動作するネットワークトラフィックパーサーです。LUCX は LUCID データセットパーサー(https://github.com/doriguzzi/lucid-ddos)の拡張版です。元のバージョンと同様に、LUCX は既存のオンラインシステムで収集されるものと整合するトラフィック観測を生成します。そこでは、検出アルゴリズムが事前定義された時間ウィンドウにわたって収集されたトラフィックフローのセグメントを処理する必要があります。
さらに、LUCX はより多くの特徴量(例:TLS 固有の特徴量)を Packet-Level と Statistical の 2 つの異なる形式で抽出します。これらについては本 README で後述します。
トラフィックの前処理操作は 2 つの異なるステージに分かれています。最初のステージではパケットから特徴量を抽出し、それらをフローと時間ウィンドウに整理します。2 番目のステージでは特徴量の正規化、パディング(または所望の出力形式に応じてフラット化)を実行し、訓練、検証、テストセットを hdf5 形式で保存します。
このリポジトリで Jupyter ノートブックとして提供されているサンプルのネットワーク侵入検知システム(NIDS)は、LUCX によって生成されたパケットレベルおよび統計的ネットワークトラフィック表現の両方を使用して、ディープラーニングモデル(具体的には多層パーセプトロン(MLP)または畳み込みニューラルネットワーク(CNN))を訓練および評価するために使用できます。
LUCX は Python v3.X、Numpy、Pyshark で実装されています。LUCX は多数の Python ツールとライブラリのインストールを必要とします。これは conda ソフトウェア環境(https://docs.conda.io/projects/conda/en/latest/)を使用して行うことができます。
conda の軽量版である miniconda のインストールを推奨します。miniconda は MS Windows、MacOSX、Linux で利用可能であり、https://docs.conda.io/en/latest/miniconda.html# で入手可能なガイドラインに従ってインストールできます。
MS Windows 10 バージョン 2004 以降(ビルド 19041 以降)または Windows 11 が必要です。
MS Windows では、まずコマンドラインから Linux 用 Windows サブシステムをインストールします:wsl.exe —install(詳細はこちらを参照)。このコマンドはコンピューターに Ubuntu Linux OS をインストールします。Windows メニューから WSL アプリを実行することで Linux コマンドラインにアクセスできます。その後、以下の Linux OS 向けガイドラインに従ってください。
ターミナルを開き、以下のコマンドのいずれか(お使いのオペレーティングシステムに基づく)を実行し、画面の指示に従ってください:
bash Miniconda3-latest-Linux-x86_64.sh (on Linux operating systems)
bash Miniconda3-latest-MacOSX-x86_64.sh (on macOS)
次に、Python 3.13.5 に基づく新しい conda 環境(python313 という名前)を作成します:
conda create -n python313 python=3.13.5
新しい python313 環境をアクティベートします:
conda activate python313
さらにいくつかのパッケージをインストールして環境を設定します:
(python39)$ pip install scikit-learn h5py pyshark matplotlib graphviz pandas scikeras pydot seaborn
Pysharkはデータの前処理に使用されます。これはtsharkのPythonラッパーにすぎないため、tsharkもインストールされている必要があります。UbuntuベースのOSでは、次のコマンドを使用します:
sudo apt install tshark
macOSでは、こちらからWiresharkをダウンロードしてインストールするだけです。
現在のパーサーコードはwireshark/tshark バージョン 4.4.9 以上で動作することに注意してください。
LUCXは双方向のネットワークトラフィックフローを扱います。これは、同一の5タプル識別子またはその転置5タプルを共有するパケットのグループとして定義されます。5タプルはIPネットワークにおいて通信ストリームを一意に特徴付ける一般的な方法であり、以下で構成されます:
パケットがこれら5つのフィールドで同一の値を持つ場合、それらは同じフローの一部と見なされます。転置5タプルの概念は双方向通信を考慮します。つまり、送信元と宛先のアドレス/ポートが入れ替わってもプロトコルが同じであれば、パケットは依然として同じフローの一部と見なされます。これにより、会話の両方向(クライアント → サーバー、サーバー → クライアント)がまとめてグループ化されることが保証されます。
例: IP 192.168.1.10のクライアントが、IP 203.0.113.5のWebサーバーにポート80でTCPリクエストを送信するとします。クライアントは送信元ポート54321を使用します。
逆方向が順方向の転置5タプルと一致するため、両方のパケット群は同じトラフィックフローに属します。 さらに、LUCXはデータセットのネットワークトラフィックトレース(または受信ネットワークトラフィック)から抽出された各トラフィックフローを、時間ウィンドウに基づいてサブフローに分割します。このセグメンテーションは、静的または動的な時間ウィンドウ内でトラフィックが収集され、その後分析のために分類器へ転送される実世界のシナリオをシミュレートします。これにより、システムは侵入検知システム(IDS)の運用慣行を反映します。IDSは、短期的な挙動を特定し攻撃を検知するために、時間で区切られたパケット集約にしばしば依存しています。
パケットがフローにグループ化され、フローがさらにサブフローに分割された後、LUCXはサブフローをMLベースの分類器のトレーニング、検証、テストに使用できるサンプルに変換します。出力形式には2つの可能性があります: 配列(LUCIDと同様)またはベクトルです。最初の形式はパケットから直接抽出された特徴を保持し、2番目の形式はパケットレベルの特徴の統計的表現を生成します。 これら2つの動作モードは、それぞれパケットレベル特徴と統計的特徴と呼ばれます。
これは元のLUCIDデータセットパーサーと同じ形式に従います。サブフローを配列に変換し、各列がパケットレベルの特徴(例: タイムスタンプ、パケット長、TCP SYNフラグ、ICMPタイプ)を表し、各行が時系列順のパケットに対応します。構造は同じままですが、追加の特徴を導入するか、既存の特徴をバイナリ表現に展開する(例: IPおよびTCPフラグ)ことにより、列数が増加しています。 最初の行にはサブフローの最初のパケットが含まれ、これは時間ウィンドウ内で収集されたフローの最初のパケットでもあります。最初の列はパケットのタイムスタンプです。最初のパケットではタイムスタンプはゼロに設定され、後続のパケットのタイムスタンプは、それらの到着時刻と最初のパケットの元のタイムスタンプとの差分として表されます。このアプローチにより、パケット到着時刻に絶対値を使用することを避け、同じサブフローに属するパケットの相対的なタイミングパターンを保持します。
| timestamp | packet_length | IP_ttl | IP_flags_df | ... | ICMP_code |
|---|---|---|---|---|---|
| 0 | 64 | 128 | 0 | ... | 0 |
| 1.2 | 128 | 64 | 1 | ... | 8 |
| ... | ... | ... | ... | ... | ... |
| 0 | 0 | 0 | 0 | ... | 0 |
| 0 | 0 | 0 | 0 | ... | 0 |
各サンプルについて、現在の特徴量の数は78で、レコードバージョン、ハンドシェイク拡張およびタイプなどTLS固有の特徴量が含まれます。特徴量の完全なリストは、このREADMEの末尾にある付録で確認できます。
LUCIDと同様に、LUCXは各サブフローについて設定可能な事前定義された数のパケットを収集します。この数は、以下で説明するコマンドラインオプション--packets_per_flow で設定できます。この数を超えるパケットは破棄され、--packets_per_flow より少ないパケット数のサブフローは、上記の例に示すようにゼロパディングされます。
特徴量の統計バージョンは、トラフィックサブフローのベクトル表現で構成され、各サブフローは時間ウィンドウ内で収集された統計的特徴量のベクトルとして表現されます。例えば、最初の特徴量は同じサブフローのパケット間の平均到着間隔時間であり、2番目の特徴量は平均パケット長、といった具合です。
| IAT (mean) | packet_length (mean) | IP_ttl (mean) | IP_flags_df (count) | ... | ICMP_code (mean) | Nr. of Packets |
|---|---|---|---|---|---|---|
| 0.01 | 130 | 102.5 | 2 | ... | 3 | 5 |
ベクトルの要素数は、パケットレベルの表現の配列の列数に、ベクトルの末尾に追加される1つの追加特徴量(サブフロー内のパケット数)を加えたものに等しくなります。パケットレベルの表現では、これは配列内の非パディング行の数から導出できる暗黙的な特徴量です。特徴量の完全なリストは、このREADMEの末尾にある付録で確認できます。
この表現では、オプション--packets_per_flowは、統計を計算する際に時間ウィンドウ内で各サブフローについて収集するパケット数を指定します。
LUCXは現在、ニューブランズウィック大学(UNB)(https://www.unb.ca/cic/datasets/index.html) の3つのDDoSデータセット(CIC-IDS2017、CSE-CIC-IDS2018、CIC-DDoS2019)をサポートしています。このガイドでは後者の一部を使用し、sample-datasetフォルダに含めています。
サポートという用語は、スクリプトがパケットおよびトラフィックフローを正常またはDDoSとして正しくラベル付けする機能を意味します。一般に、これはUNBデータセットの場合のようにトラフィックトレースに付属するラベルを含むファイルを解析するか、コード内で攻撃者のIPアドレスと被害者のIPアドレスを手動で指定することによって行われます。もちろん、後者の場合も、この情報はデータセットおよびトラフィック生成に使用された方法論に非常に固有であるため、スクリプトはトラフィックの正しい情報(攻撃者/被害者のIPアドレスのすべてのペア)で調整する必要があります。
とはいえ、lucx_network_traffic_parser.pyには、上記の3つのデータセット(CIC-IDS2017、CSE-CIC-IDS2018、CIC-DDoS2019)の攻撃者/被害者のペアを含む構造が含まれていますが、利用可能なコードを複製することで他のデータセットをサポートするように簡単に拡張できます。
例えば、次のPython辞書は、CIC-DDoS2019データセットに関与する攻撃者と被害者のIPアドレスを提供します:
DOS2019_FLOWS = {'attackers': ['172.16.0.5'], 'victims': ['192.168.50.1', '192.168.50.4']}
CIC-DDoS2019データセットでは、DDoSパケットの送信元IPアドレスが、テストベッド内で攻撃ネットワークと被害者ネットワークを接続するルーターのIPアドレスに置き換えられていることに注意してください(CIC-DDoS2019)。
lucx_network_traffic_parser.pyを使用する際に、以下のパラメータを指定できます:
-c, --classes : トラフィッククラスに割り当てる名前(利用可能なオプションはBINARY(デフォルト)、DOS2019)-d, --dataset_folder: データセットを含むフォルダ-f, --traffic_type : 処理するフローの種類(all、benign、ddos)-m, --max_flows : pcapファイルから抽出するフローの最大数-n, --packets_per_flow : サンプル内のパケットの最大数(デフォルト:10パケット)-o, --output_folder : スクリプトが出力を保存するフォルダ。このオプションを使用しない場合はデータセットフォルダが使用されます-p, --preprocess_folder : 中間ファイル*.dataを含むフォルダ-s, --samples : 縮小された出力内のトレーニングサンプル数-t, --dataset_type : データセットの種類。利用可能なオプションは:DOS2017、DOS2018、DOS2019-w, --time_window : 時間ウィンドウの長さ(秒)(デフォルト:10秒)--binary : バイナリラベル(デフォルト:False)--preprocess_file : 中間ファイル*.dataへのパス--dont_normalize : 特徴量の正規化をスキップ(デフォルト:False)--flatten : 配列状の中間フロー表現をベクトルに平坦化(デフォルト:False)--enable_tls : TLS固有の特徴量の抽出を有効化(デフォルト:False)--multiclass : マルチクラスラベルを有効化。整数値またはone-hotエンコーディングのいずれかを使用(0=バイナリ(デフォルト)、1=整数マルチクラス、2=one-hotエンコーディングマルチクラス)