暗号化した通信はtcpdumpでどう見えるか
プロトコルの脆弱(ぜいじゃく)性
前回は、tcpdumpの基本的な使い方について説明しました。今回は、tcpdumpを用いていくつかの通信内容を実際に閲覧し、それらの結果から通信を行う際のセキュリティーについて検討してみます。
HTTP、FTP、SMTP、POP3(またはIMAP4)は、いずれも私たちが普段インターネット上で提供されているサービスを利用する上で、非常に重要な役割を果たしているプロトコルです。
SMTP/POP3は、メールの送受信を行うためにはなくてはならないものですし、HTTPは、Googleに代表される検索エンジンの定着や、近年のWeb 2.0/クラウドコンピューティングと言ったキーワードの元で盛り上がりを見せている数多くのWebブラウザベースの新しいサービスの出現によって、果たす役割が年々拡大しています。
しかし、これらのプロトコルは成立した時代が古く、現在のようにさまざまな人々によって利用されることを想定していなかったため、セキュリティーに関しては当初ほとんど考慮されていませんでした。そのため、インターネットの利用者が増加し、多様化するにしたがって、これらのプロトコルのセキュリティー上の問題が指摘されるようになりました。特に、ユーザーのパスワードの扱いに関しては大きな問題となっています。
セキュリティー上の問題を解決するために、これらのプロトコルにはいずれもパスワード、または通信内容すべてを暗号化するための方法が追加されました。しかし、これらのプロトコルは互換性を保つために従来の(セキュリティー上に問題のある)方法で通信を行うことも可能としています。
また、プロトコルによっては追加された暗号化方式自体に脆弱性が発見されたなどの理由で、別の暗号化方式を用いることが推奨されている場合もあります。したがって、安全な通信を行うためにはサービスの提供者/利用者双方がセキュリティー意識を強く持ち、どのような方法を用いて通信を行うのが良いのかを調査することが重要です。
そこで、今回はパスワードなどのように第三者に知られると問題となるような通信内容を実際にtcpdumpを用いて閲覧してみます。平文で流れるパスワードを取得することが予想以上に容易であることを実感し、個々人のセキュリティー意識の向上につながれば、と思います。
tcpdumpでユーザー名とパスワードを閲覧してみよう
今回は、図1-1のサンプルプログラムを用いてメールの受信を行い、tcpdumpを用いてその通信内容を閲覧してみます。図1-1のサンプルプログラムは、指定されたPOP3サーバーへ指定されたユーザー名、パスワードで接続し、サーバーに受信メールが存在していれば、最も新しく到着したメールの内容を表示するプログラムです。なお、このプログラムは、筆者が公開しているライブラリ(http://sourceforge.jp/projects/clxcpp/)を使用しています。
図1-2は、tcpdumpを用いて、図1-1のサンプルプログラムを実行したときのパスワード送信時の通信内容を表示させたものです。平文でパスワードを送信している場合、メールを受信するための通信パケットを取得することさえできれば容易に他人のパスワードを取得できることが分かります。これは、平文でパスワードを送信しているのであれば、ほかのプロトコルにおいても同様です。
パスワードを平文で送信することの危険性は、インターネットが普及するにつれて広く認識されるようになりました。そのため、前述したように、パスワードの送受信を行うことのあるプロトコルには、通信パケットが盗聴されたとしてもパスワードが分からないようにするための暗号化方法が追加されました。通信パケットを盗聴された場合でも、パスワード(または通信内容すべて)を知られないようにする方法として、以下の2通りが存在します。
・パスワードを暗号化する
・通信経路を暗号化する
次に、これら暗号化方法のそれぞれについて説明していきます。