ネットワークを流れるパケットをキャプチャーして収集し、Pythonとリレーショナルデータベースを用いて精度よく解析するための実践的なテクニックを紹介する本特集。前回までの内容で、キャプチャーしたパケットから通信先サーバー名を格納したテーブルと、各パケットの5タプル(送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート、宛先ポート)を格納したテーブルを作成しました。第6回はこれらを利用し、クラウドサービスの利用状況などを可視化する手法を解説します。
第4回 Pythonによるパケット解析で国内にないサーバーを検出、そのやり方は 第5回 ネットワークの遅延に切り込む第一歩、HTTPSの通信先を取得する手法企業の情報システムにおいて、SaaS(ソフトウエア・アズ・ア・サービス)の利用が進んでいます。これら外部サービスの存在感は大きくなっており、サービスを便利に使うことで業務のスピードを高められる一方、コスト管理やサービス自体の選択、評価に対する負荷が高まっています。
例えば情報システム部門に寄せられるクラウドサービスの利用申請などは、セキュリティーやコストの観点から審査され、利用の可否が決定されます。ただし、一定期間後にそのサービスが継続して利用されているかどうかは追跡して調査する機会があまりありません。そのようなとき、契約しているサービスの一覧と付き合わせて使用率を可視化できる仕組みがあれば、一時的に使わなくなったサービスを解約してコストを抑え、SaaS本来の利便性をうまく引き出す使い方ができるかもしれません。
本特集の第5回までの内容で、キャプチャーしたパケットから通信先サーバー名を格納したテーブルと、各パケットの5タプル(送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート、宛先ポート)を格納したテーブルの2つをつくりました。これらのテーブル同士を結合することで、特定のサービスがいつ、どの端末から利用されているのかといったことが分かります。
ここからさらに分析することで、先月と比べて利用状況はどう変わったのか、ライセンス数は適切なのか、月末月初などのタイミングでレスポンスの問題は発生していないかなど、改善につながるデータが得られるはずです。こうした分析のための基礎として、まずはストリーム単位のアクセス件数を集計して可視化してみましょう。
今回は実際の環境で収集したデータを使い、テーブル間のデータ結合など、SQLとその開発環境を中心に解説します。
実パケットを使用してパケットデータベースをつくる
今回配布するコードを以下からダウンロードしてください。「06.zip」というzipファイルに「cap_import-TLS-DB-Backup.ipynb」「backup_20211011_163817.sqlite3」という名称のファイルをアーカイブしています。
サンプルファイルのダウンロードcap_import-TLS-DB-Backup.ipynbファイルを開きます。このファイルには、前回までに作成したコードから、tlsテーブルとpacketsテーブルのそれぞれの作成と、データ投入を実行するコードを記述しています。
18行目と68行目に存在する以下のコードで、筆者が用意したreal.pcapを読み込んでいます。
packets = PcapReader('./real.pcap')
今回はこのreal.pcapを提供できなかったため、代わりにこのpcapファイルから抽出したsqlite3データベースを提供します。実際に試すに当たり、手元で取得したパケットキャプチャーデータを用いてデータベースをつくる場合の注意事項があります。コード冒頭の以下のコメントについて説明します。
通常の環境で収集したパケットの中にはTCP/UDP以外のパケットが入ることがあります。例えばスパニングツリーやARP(Address Resolution Protocol)などです。
今回使用するScapyライブラリーに非対応のパケットデータが原因でpcapファイルを読み込んだ際にコードが落ちてしまうケースが考えられます。そうしたことが起こらないように、あらかじめTCPとUDPでフィルターしておく必要があります。さらにパケットキャプチャーファイルの形式はtcpdumpと互換性のあるpcapフォーマットである必要があります。
Wiresharkを使用してパケットを収集すると、保存時のデフォルト拡張子はpcapngになっています。そのため保存し直すなどして変換してから利用します。
Pythonプログラムの実行結果は以下のようになりました。tlsテーブルに43件、packetsテーブルに4万9256件のデータができています。