全4608文字
PR

 ネットワークを流れるパケットをキャプチャーして収集し、Pythonとリレーショナルデータベースを用いて精度よく解析するための実践的なテクニックを紹介する本特集。第1回、第2回で暗号化通信に関する内容を取り上げました。暗号化通信に対して、パケットキャプチャーは無力なのでしょうか。その答えとして2つの解答を用意しました。1つは「トラフィックの形そのものを俯瞰(ふかん)でとらえる」、もう1つは「読める部分を読む」です。今回は後者の「読める部分を読む」アプローチを解説します。

第1回 コロナ禍で変化したネットワーク、なぜ今パケットキャプチャーなのか 第2回 Wiresharkでできないことができる、パケット解析×プログラミング

 HTTPSの暗号化通信を復号するにはプロキシサーバーなどで通信をする2者間に割り込む中間者攻撃(Man in the middle Attack、MITM攻撃)に近いことをするか、サーバー側の秘密鍵が必要になります。これらの条件を満たすのはそれなりに大変です。「そもそも何を知りたいのか」というところまで遡って考えてみましょう。

 トラフィックの品質は暗号化の有無にかかわらずTCPを分析することで得られます。通信相手先の場所を類推するためのRTTも第4回の手法を用いれば把握できます。

第4回 Pythonによるパケット解析で国内にないサーバーを検出、そのやり方は

 トラフィックを管理する立場では、どことどれだけ通信しているのかを知ることが全体設計を改善するための第一歩になります。具体例として、クラウドストレージとの意図しないファイル同期がユーザー端末のレスポンスを悪化させるケースが挙げられます。

 ある環境ではローカルファイルのバックアップがユーザーの意図しない形でクラウドストレージへ自動アップロードされており、大容量ファイルの同期が回線や端末の処理能力を圧迫していました。この構造が「なぜだか分からないが、パソコンが時々遅くなる」といったトラブルとして発現し、ユーザーを悩ませていたわけです。

 こうした事態を避けるため、インターネットに出ていくトラフィックの大小を把握したうえで、大きいトラフィックについては意図したものか、そうでないかを把握することは管理上とても重要です。

 コストをかけて回線や端末の処理性能をアップさせるとしても、無駄な投資を避けるために問題の所在と改善の見通しを付けてから提案したいものです。今回はその第1段階としてネットワークの通信相手先を可視化する手法を解説します。

暗号化通信の通信相手を知る方法

 前回までのプログラムでは5タプル(送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート、宛先ポート)を収集して分析する方法を紹介しました。5タプルのうち、通信相手先を示す情報は宛先IPアドレスです。この宛先IPアドレスが誰なのか(どのドメイン宛てなのか)を知るにはどうすればよいでしょうか。

 前提として、暗号化されていないHTTPであればリクエストヘッダーのURI(Uniform Resource Identifier)にホスト名が入っています。画像のフレームは第4回で使用したtcp-test.pcapに含まれています(フレームナンバー4)。

[画像のクリックで拡大表示]

 しかし、これはHTTP通信の本文です。HTTPSの場合は暗号化されており解読できません。HTTPに限らず、パケットのペイロードにその通信相手先のFQDN(完全修飾ドメイン)が含まれているプロトコルの場合にはその項目を読めばいいのですが、この手法は暗号化に弱いという問題があります。

 その場合に取れる手段の1つはDNS(Domain Name System)を使う方法です。DNS over HTTPSなど、DNS手続き自体が暗号化されている場合を除き、DNSのリクエストに対する応答を直接観測することで、IPアドレスの逆引きができます。