Nozomi Networks GuardianにPCAPファイルをアップロードするスクリプトを作ってみた

 Dec 23, 2022 10:29:49 AM  テリロジー 「半公式」エンジニアブログ(仮)

こんにちは。

Nozomi Networks製品を担当している木村と申します。

Nozomi Networks GuardianにPCAPファイルをアップロードするスクリプトを作ってみましたので紹介したいと思います。

通常、Guardianはネットワークスイッチからトラフィックを入力して使用するものですが、別の方法で取得済みのPCAPファイルを読み込ませることで可視化する機能があります。

GuardianのGUIから簡単にPCAPを読み込ませることができますが、数が多い場合にはスクリプトで自動化すると楽かと思います。

GuardianにはHTTPSで接続可能なAPIが用意されています。PCAPファイルもAPIを使ってアップロード可能です。

今回はPythonでスクリプトを作ってみました。

この記事を執筆した時点では、あまりにも大量のPCAPをアップロードするとエラーが出ることがあります。その場合は、Guardianを再起動すれば再開できます。

import glob
from pickle import FALSE
import requests
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)
import os
import time

# GuardianのIPアドレスを入力
apiURL = "https://xxx.xxx.xxx.xxx/api/open/pcaps/upload"
apiURL2 = "https://xxx.xxx.xxx.xxx/api/open/pcaps"
# Guardianのログインアカウントを入力
apiUsername = "xxxx"
apiPassword = "xxxx"
# PCAPの保存先フォルダーを指定
files = glob.glob("C:/Upload PCAPs/*")

f = open('./error.log', 'w')

for file in files:

    data = {
        "file" : open(file, 'rb')
    }

# PCAPファイルをGuardianにアップロード
    r = requests.post(apiURL, files=data, auth=requests.auth.HTTPBasicAuth(apiUsername, apiPassword), verify=False)
    
    if r.status_code != 200:
        f.writelines(file + " upload error statusCode:")
        f.writelines(f"{r.status_code}\n")
        continue

# PCAPファイルを再生するためにPCAPにセットされたIDを取得    
    r2 = requests.get(apiURL2, auth=requests.auth.HTTPBasicAuth(apiUsername, apiPassword), verify=False)

    if r2.status_code != 200:
        f.writelines(file + " get id error statusCode:")
        f.writelines(f"{r2.status_code}\n")
        continue

    resp_dict = r2.json()

    l_name = [d.get("filename") for d in resp_dict["result"]]    
    l_id = [d.get("id") for d in resp_dict["result"]]    
    basename = os.path.basename(file)
    l_name_index = l_name.index(basename)
    target_id = l_id[l_name_index]

# PCAPファイルをGuardianで再生
    payload = {
        "id":target_id,
        "use_packet_time": True,
        "data_to_reset_before_play": {}
    }

    r3 = requests.patch(apiURL2, auth=requests.auth.HTTPBasicAuth(apiUsername, apiPassword), verify=False, json=payload)

    if r3.status_code != 200:
        f.writelines(file + " play error statusCode:")
        f.writelines(f"{r3.status_code}\n")
        continue

    time.sleep(10)

f.close()

 

API仕様などの細かい点はマニュアルを参照いただけますと幸いです。

今年もお世話になりました。良いお年をお過ごしくださいませ。


RECENT POST「Nozomi Networks」の最新記事


Nozomi Networks

OT と CPS の文脈における OSI モデルとサイバーセキュリティの基礎

Nozomi Networks

Hyper-Vで仮想版Guardianを構築してみた【補足編】

Nozomi Networks

変電所と送電網のサイバーセキュリティと信頼性の向上

Nozomi Networks

Nozomi NetworksがOTサイバーセキュリティソリューションのFrost Radarのリーダに選ばれる

Nozomi Networks GuardianにPCAPファイルをアップロードするスクリプトを作ってみた