ネットワークを流れるパケットをキャプチャーして収集し、Pythonとリレーショナルデータベースを用いて精度よく解析するための実践的なテクニックを紹介する本特集。暗号化されたトラフィックを分析するアプローチとして第5回では「読める部分を読む」手法を取り上げました。第7回はもう1つのアプローチである「トラフィックの形そのものを俯瞰(ふかん)でとらえる」ための考え方と実装例を示します。
第5回 ネットワークの遅延に切り込む第一歩、HTTPSの通信先を取得する手法トラフィックの概要を定量的につかむことで何ができるでしょうか。例えばネットワーク上で問題が起こって再発防止策を考えなければならなくなった場合、この方法を使えば同種のトラフィックを自動的に検出して警告したり、ポート番号を偽装した通信に対して実際にどのような種類なのかを推測したりする手助けとなります。
開発部門の現場では、融通の利かないセキュリティーポリシーに対して、時間をかけてルールを変えるための手続きをするよりも、テクノロジーの工夫によって問題が起こっていないように見せかける「バッドノウハウ」が生まれることがあります。
例えばSSHのようなターミナル通信がファイアウオールで止められている場合、Webアクセスでよく使われる他のポート番号(443番や80番など)を使って通り抜けるようなケースです。
Skypeのような初期のWeb会議システムの場合、こうしたファイアウオール回避の機能がソフトウエアとして実装されていたケースがありました。そのような環境でも、実質「駄目なものは駄目」というガバナンスの徹底が必要な場面もあるでしょう。パケットキャプチャーとプログラミングによって、高解像度なデータを自由に分析することでこれらの検出能力を高められます。
トラフィックを俯瞰的な視点から分析するには1つひとつのパケット単位ではなく、前後の文脈であるストリーム単位の把握が必要です。
Wiresharkでは、画面上に表示されているパケットを右クリックし、「追跡」メニューから各種プロトコルのストリームを抜き出すためのディスプレーフィルターを設定できます。ただし、これは問題のある通信の前後関係を細かく見ていく場合に必要な機能であり、ストリームを横断的に把握する機能ではありません。この弱点をプログラムで補う方法を解説します。
TCPストリームの管理
具体的にストリームを把握するための方法について解説します。
今回使用するサンプルコードを以下からダウンロードしてください。「07.zip」というzipファイルに「cap_import-Stream.ipynb」と各種SQL文をアーカイブしています。
サンプルファイルのダウンロードまずはcap_import-Stream.ipynbファイルを開いてください。いったんこのJupyter Notebookの処理をすべて流してから個別のプロセスを説明します。
最初のセルはパケットの5タプル(送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート、宛先ポート)をデータベースに読み込むコードです。これまでに何度も登場しているため、コードの画面は割愛します。
2つ目のセルからはpacketsテーブルのデータをStream単位で管理するためのSQL文を連続して流します。3つ目のセルではpacketsテーブルができているかを確認しています。