パケット収集ツール「Moloch」で収集したパケットを分析してみよう
指定したネットワークインターフェイスを通過するすべてのパケットを収集して分析したい、という場合に適したパケットキャプチャツール「Moloch」では、Webブラウザ経由でアクセスできる「Moloch Viewer」経由で収集したパケットの分析が行える。今回はこのMoloch Viewerを使ったパケット分析機能を紹介する。
目次
GUIでパケットの解析や検索が可能
パケット解析ツール「Moloch」は、大規模な環境にも対応したパケット解析ツールだ。特徴としては、サービスとして起動して常時パケットの収集を実行できる点などがある。
Molochの機能やインストール方法などについては前回記事で紹介しているが、Molochでは「Moloch Viewer」というWebインターフェイス経由で収集したパケットの閲覧や検索といった分析処理が行える。今回はこのMoloch Viewerの機能や使い方について紹介する。
なお、今回記事ではMolochのパケットキャプチャサービスである「Moloch Capture」やMoloch Viewerがインストールされた環境が利用できることを前提としている。これらの環境構築については前回記事を参照して欲しい。
Moloch Viewerの基本構成
Moloch Viewerは、デフォルトでは8005番ポートでHTTP待ち受けを行っている。Webブラウザで「http://<Moloch Viewerが実行されているマシンのIPアドレスもしくはホスト名>:8005」にアクセスすることで、Moloch Viewerの各種機能を利用できる。なお、アクセスの際はBASIC認証による認証が必要となる。Moloch Viewerのインストール時にここで利用するためのユーザー登録処理を実行しているはずなので、ここではそのユーザー名とパスワードを入力しよう。
Moloch Viewerでは、画面上部にメニューバーが表示されており、ここからMoloch Viewerの各機能(画面)にアクセスできる(図1)。
また、左上のフクロウ画像をクリックするとMoloch viewerに関するヘルプが表示される(図2)。操作方法などで困ったり、不明な点があったりする場合はこちらを参照すると良いだろう。
パケット解析の基本となる「Sessions」画面
Moloch Viewerにアクセスすると最初に表示されるのが「Sessions」画面だ(図3)。
Molochではクライアントがサーバーに接続要求を行い、接続が確立されていて通信を行いその後接続が切断される(もしくは接続要求が拒否される)までの一連の流れをセッションと呼ぶ。「Sessions」画面では、このセッション単位でパケットを検索・閲覧できるようになっている。 ちなみに、UDPやICMPの場合、連続・関連すると思われるパケットが自動的にまとめられてセッションとして扱われる。
画面上にはグラフが表示されているが、これはデフォルトでは時間毎のセッション数をプロットしたものになっている。グラフ上の「Packets」や「Databytes」ボタンをクリックすることで、パケット数や送受信データバイト数での表示に変更できる(図4)。
「Packets」や「Databytes」表示の場合、青色で表示されているのが対象ホストへの通信、赤色で表示されているのが対象ホストから発信される通信となる。同様に「Lines」および「Bars」ボタンではグラフの表示方法を棒グラフと折れ線グラフとで切り替えられる(図5)。
グラフ表示する時間範囲はデフォルトでは「Last hour」(過去1時間)となっているが、画面左上のドロップダウンメニューで変更が可能だ(図6)。「Start」および「End」欄に表示範囲を入力して範囲を指定することも可能だ。
「Start」「End」欄の隣にある「Bounding」欄は指定した時間境界をまたぐセッションについての扱いを指定するもので、表1のものが選択できる。
値 | 説明 |
---|---|
First Packet | 最初のパケットの到達時刻が指定時間内のセッションを表示 |
Last Packet | 最後のパケットの到達時刻が指定時間内のセッションを表示 |
Bounded | 最初もしくは最後のパケットの到達時刻が指定時間内のセッションを表示 |
Session Overlaps | 最初のパケットの到達時刻が指定時間最後より前で、かつ最後のパケットの到達時刻が指定時間最初よりも後のセッションを表示(セッションの少なくとも一部が指定時間内にあるものを表示) |
Database | データベースに記録された時刻が指定時間内のセッションを表示 |
グラフ上部の虫眼鏡ボタン(「-」、「+」)や「<」「>」ボタンでも対象時間を変更できる。また、グラフのプロット間隔は「Interval」で指定でき、「Auto」(自動)のほか、「Seconds」(1秒毎)や「Minutes」(1分毎)、「Hours」(1時間毎)、「Days」(1日毎)が選択可能だ。
画面左上の地球儀アイコンをクリックすると、国/地域ごとのパケットの送信元/送信先頻度に応じて塗られた世界地図が表示される(図7)。ここでは色が濃いものほど頻度が多いことを示している。デフォルトでは送信元と送信先の両方を合計した結果で表示されているが、地図右側の「S」(送信元)および「D」(送信先)ボタンでそれぞれの表示を切り替えられる。
「×」ボタンをクリックすると地図を非表示にできるほか、「+」「-」で拡大・縮小、「↙↗」ボタンで表示エリアの拡大・縮小が行える(図8)。
どちらの表示の場合でも、国・地域にマウスポインタを合わせるとその頻度がポップアップ表示される。
セッションの内容を確認する
リスト表示されているセッションからその内容を確認したいセッションを選び、先頭に表示されている「+」をクリックするとその詳細情報が表示される(図9)。
図9はIPv6におけるICMP(ICMP6)の例だが、ここでは送信元/送信先の情報やパケット数、バイト数、データバイト数(パケットに含まれるデータサイズ)、パケットの内容などが表示されていることが分かる。また、画面の上部にある「Download Pcap」や「Source Raw」、「Destination Raw」の各リンクからはPcap形式でパケット全体をダウンロードしたり、パケットの生データをダウンロードできる。
ここで表示される内容はプロトコルなどによって変わり、Molochが対応しているプロトコルについてはアプリケーション層(いわゆるLayer 7、L7)レベルでのパケット分析が行われてその結果が表示される(図10)。なお、この情報はMolochでは「SPI(Session Profile Information)」と呼ばれている。
図10はHTTPのセッションを表示した例だが、まずTCP/IPレベルでのそのセッションに関する情報が表示され、続いてHTTPレベルでの情報とパケット内容が表示される(図11)。
パケット内容については、上部と下部に表示されるボタンで表示形式を「natural」(自動)、「ascii」(ASCII形式)、「utf8」(UTF-8形式)、「hex」(16進数形式)から選択できるほか、内容を分析するための補助機能も用意されている。
パケット内容はデフォルトでは16進数のダンプ(hexdump)形式で表示されるが、たとえばHTTPなどのASCII文字ベースのプロトコルなら「ascii」を選択することでその内容を分析しやすくなる(図12)。
また、セッションの一部でGZIP圧縮されたコンテンツが送受信されていた場合、「Uncompress」ボタンをクリックすることでその内容を展開して表示できる(図13、14)
同様に「Unbase64」ではBASE64エンコードされた内容を展開でき、「Show Image & Files」ではセッションでやり取りれた画像データを画像として表示できる。
フィルタリング
Molochでは基本的に指定したネットワークインターフェイスを通過するすべてのパケットが収集される。そのため、分析には絞り込み操作が欠かせない。絞り込み操作は基本的に画面上部の「Search」ボックスに条件式を入力して行うことになる。条件式は次のような形式で指定する。
<フィールド> <演算子> <値>
「フィールド」は、セッションのどの属性を対象に絞り込みを行うかを指定する部分だ。たとえばIPアドレスを条件に絞り込みを行いたい場合、「ip」を指定する。また、属性によってはより細かく対象を指定できるものもある。たとえば「ip.src」や「ip.dst」と指定することで、送信元IPアドレスや送信先IPアドレスを指定できる。
プロトコル固有の属性も検索対象として指定できる。たとえばHTTPであれば「http.method」でリクエストメソッドを、「http.cookie.value」でCookieの値を、「http.uri」でリクエストURIを対象として指定できる。そのほかDHCPやDNS、メール(SMTP/POP3)、Kerberos 5、MySQL、Oracle、Radius、SMB、TLSなどでこういったプロトコル固有の属性を対象にした検索が利用可能だ。これらについて詳しくはMolochのヘルプの「Fields」欄を参照して欲しい。
「host」(ホスト名)といった複数のプロトコルを横断的に対象にできるフィールドもある。特定のプロトコルのみを対象としたい場合は、たとえば「host.http」や「host.smb」のように指定すれば良い。そのほか、主要なフィールドとしては表2のものが挙げられる。
フィールド名 | 説明 |
---|---|
bytes | セッション中で送受信された総バイト数 |
bytes.src | セッション中で送信元が送信した総バイト数 |
bytes.dst | セッション中で受信先から送信された総バイト数 |
country | セッションに関連する国/地域 |
country.src | 送信元の国/地域 |
country.dst | 送信先の国/地域 |
databytes | セッション中で送受信されたデータ部分の総バイト数 |
databytes.src | セッション中で送信元が送信したデータ部分の総バイト数 |
databytes.dst | セッション中で受信先から送信されたデータ部分の総バイト数 |
host | セッションに関連するホスト名 |
http.method | HTTPのメソッド |
http.statuscode | HTTPのステータスコード |
http.uri | HTTPにおけるリクエストURI |
ip | IPアドレス |
ip.src | 送信元IPアドレス |
ip.dst | 送信先IPアドレス |
mac | MACアドレス |
mac.src | 送信元MACアドレス |
mac.dst | 送信先MACアドレス |
port | ポート番号 |
port.src | 送信元ポート番号 |
port.dst | 送信先ポート番号 |
「演算子」は指定したフィールドと値をどのように比較するかを指定するもので、もっとも多く使われるのは「==」だろう。この演算子を使用した場合、指定したフィールドが指定した値に一致するものを検索できる。また、「!=」演算子では逆に対象フィールドの値が指定した値に一致しないものを検索できる。そのほか、一部のフィールドでは「<」(より小さい)や「>」(より大きい)、「<=」(以下)、「>=」(以上)といった演算子も利用できる。
値については文字列やIPアドレス、数値、日付に加えて「そのフィールドが存在する」ことを意味する「EXISTS!」キーワードが利用できる。文字列については「?」(任意の1文字にヒット)や「*」(任意の長さの任意の文字列)といったワイルドカードも利用可能だ。また、「/<正規表現>/」という書式で正規表現も利用できる。
IPアドレスについてはIPv4およびIPv6の両方に対応しており、「192.0.2.0/24」のような形式で範囲指定も可能だ。
日付については「2018/01/01 00:00:00」といった形式に加えて、「+」や「-」を使って現在時刻からのオフセットを指定できる。たとえば現在時刻から1日後は「+1d」、1日前は「-1d」のようにして指定できる。この場合の「d」は日付を表す単位で、利用できる単位は次の表3のとおりだ。
単位 | 説明 |
---|---|
s、sec、secs、second、seconds | 秒 |
m、min、minute、minutes | 分 |
h、hr、hrs、hour、hours | 時間 |
d、day、days | 日 |
w、week、weeks | 週 |
mon、month、months | 月 |
q、qtr、qtrs、quarter、quarters | 四半期(4分の1年、3か月) |
y、yr、yrs、year、years | 年 |
なお、文字列、IPアドレス、数値、日付のいずれも、複数の項目を指定するリスト表記(「[<値1>, <値2>, ...]」)を利用できる。また、複数の条件式を「&&」(論理積)や「||」(論理和)で結合することもできる。「()」で優先順位を指定することも可能だ。
フィルタリングの具体例
それでは、いくつかフィルタリングの具体例を見てみよう。
監視対象のホストから発信されたセッションを対象に絞り込むには、「発信元のIPアドレスがそのホストのIPアドレスに一致する」という条件で絞り込みを行えば良い。これは、次のような条件式になる。
ip.src == <ホストのIPアドレス>
この場合、プロトコルについては指定していないのでTCPだけでなくUDPやICMPでのセッションについても表示される(図15)。
ここからTCPのセッションのみを絞り込むには、これに加えて「ip.protocol == tcp」という条件を「&&」で追加すれば良い(図16)。
ip.src == <ホストのIPアドレス> && ip.protocol == tcp
ちなみに、リストに表示されている各項目にマウスポインタを重ねるとドロップダウンメニューを表示させるボタン(「▼」)が表示され、それをクリックして表示されるメニューから条件を追加できる。たとえば図17の場合、「プロトコルがICMPである」、もしくは「プロトコルがICMPでない」、などの条件を選択できる。
特定のIPアドレス宛のセッションを対象に絞り込むには次のような条件式を利用する。
ip.dst == <IPアドレス>
また、送信元もしくは送信先のどちらかが指定したIPアドレスに合致するセッションを絞り込むには、単に「ip」のみを条件として使用すればよい。
ip == <IPアドレス>
なお、「http.method == EXISTS!」のような条件式を使うことで特定のプロトコルのセッションのみを検索することもできるが、こういった用途では次節で紹介する「SPI View」を利用するほうが使いやすい。
Views機能
Molochの検索機能では、頻繁に使う検索式を「View」として登録しておくことができる。「Search」ボタン横の「目のアイコン」をクリックして「New View」を選択すると登録フォームが表示され、ここからViewを登録できる(図18)。
登録フォームでは「View Name」にView名、「Expression」にクエリ式を入力する。たとえばクエリ式に「ip.protocol == icmp」を指定すると、ICMPパケットだけを絞り込むViewを作成できる(図19)。
作成したViewは「目」のアイコンをクリックして表示されるドロップダウンメニューから呼び出せる(図20)。
Viewを選択すると、その検索式が実行されてその結果が表示される。この状態でさらにSearch欄に条件を追加することで、さらに結果を絞り込むこともできる。
プロトコル単位での分析に向けた「SPI View」
「Sessions」画面は時系列でセッション単位での分析を行えたが、「SPI View」はプロトコル単位でセッションを検索・分析できる(図21)。
SPI Viewのデフォルト表示では一部のプロトコルが展開された状態で表示されるので一見分かりにくい。まずこれら横の「-」をクリックして閉じると状況が把握しやすいだろう(図22)。
この例では「general」に「icmp (795)」「tcp (351)」「udp (28)」の3つが表示されており、これは指定した期間内にicmpのセッションが795件、tcpのセッションが351件、udpのセッションが184件観測されたということを意味している。
続いて、プロトコルごとの詳細情報を見てみよう。たとえば「http」をクリックして表示内容を展開すると、図23のような画面が表示される。
この例では、たとえば「Body Magic」として「application/json (104)」や「application/x-gzip (22)」などが並んでいる。これは、期間内にリクエスト/レスポンスボディが「application/json」のセッションが104件、「application/x-gzip (22)」のものが22件確認されたといったことを意味している。
「Body MD5」の部分に多数の文字列が並んでいるのが目を引くが、これは送受信されたパケットのボディ部分のMD5ハッシュが並んでいるだけで、この文字列自体に意味は無い。
画面をスクロールしていくと、ほかにもさまざまなパラメータが並んでいることが分かる。たとえば「URI」では、リクエストされたURIがそれぞれ並んでいる(図24)。
ちなみに、ここで表示するパラメータは画面上のボタンで選択が可能だ。デフォルトでは一部のパラメータのボタンしか表示されていないが、「︾」をクリックすると対応するすべてのパラメータが表示される(図25)。
表示されるパラメータが多く目的のものを探しにくい場合などは、ここで表示する内容を切り替えると良いだろう。
パラメータごとに並ぶ値の1つにマウスポインタを合わせるとドロップダウンメニューが表示され、そこからその条件を追加したり、該当するセッションをSessions画面で表示したりできる(図26)。
Sessions画面ではSPI Viewで指定した条件に該当するフィルタ条件で絞り込みを行った結果が表示され、ここからセッションの詳細やその内容を確認できる(図27、28)。
ちなみにこの画面でも、Sessions画面と同様に対象期間やSearchボックスを利用した絞り込みが利用可能だ。
グラフでプロパティを比較できる「SPI Graph」
「SPI Graph」画面では、指定したプロパティについてその値毎に集計を行った結果をグラフ表示できる。
プロパティの指定は、「SPI Graph」欄で行う。たとえば、ここで「ip.protocol」と指定すると、TCP、UDP、ICMPといったプロトコルごとにセッション数の変動や送受信元の国/地域をグラフで比較できる(図29)。
ほかの画面と同様、ここでは表示するグラフの縦軸を「セッション数」や「パケット数」、「データバイト数」で切り替えたり、棒グラフと折れ線グラフを切り替えたりすることが可能だ。
セッションの送信元/送信先の関係をグラフ表示する「Connections」画面
「Connections」画面では、記録したセッションの送信元と送信先の関係をグラフで表示できる(図30)。
デフォルトではグラフの紫色の端点が送信元IPアドレス(Src IP)、黄色の端点が送信先IPアドレスおよびポート番号(Dst IP:Dst Port)となっており、どのIPアドレスからどのIPアドレスおよびポート番号に対し通信が行われているかを確認できる。
ここではマウスのスクロールホイールで拡大・縮小が、ドラッグで表示範囲の移動が行える。また、マウスポインタをIPアドレス部分に合わせると、そのIPアドレスやポートに関する情報がポップアップ表示される(図31)。
Connections画面では、「Src:」や「Dst:」の値を変更することで、IPアドレス以外の情報を使ってグラフを描画することもできる。たとえば「Src:」として「Src IP」(送信元IPアドレス)、「Dst:」に「URI」(HTTPにおけるリクエストURI)を指定することで、送信元IPアドレスとURIの関連性をグラフで確認できる(図32)。
そのほかの管理機能
メニューバーにある「Files」や「Stats」、「History」、「Settings」、「Users」については、パケット解析のための機能ではなく、Moloch自体の管理などのための画面を開く項目だ。
まず「Files」だが、こちらはデータをPcap形式で出力した際に、その出力先などの情報をリスト表示する画面だ(図33)。
「Stats」画面は、取得したパケット数などの統計情報を確認できるものだ(図34)。
ここで表示する内容は「Graph Type」欄で選択できる(図35)。
詳しくはオンラインヘルプを参照して欲しいが、注意したいのは「Total Dropped/Sec」(毎秒当たり総ドロップ数)だ。これは、何らかの原因でMolochが保存できなかったパケット数を示している。もしこの値が0以上の場合、過負荷などで一部のパケットを記録できていないことになるため、設定や構成などを見直す必要がある。
「History」画面は、Moloch APIに関するアクセスログだ。通常あまりチェックする必要はないが、APIにアクセスしたユーザーやクエリに要した時間なども確認できる(図36)。
「Settings」画面では、Moloch Viewerの各種設定を行える(図37)。各画面でのデフォルト表示値などの変更もここで行える。ここから登録したViewsの管理も行える。
「Users」画面は管理者向けの機能で、ここでユーザーの追加や権限設定などを行える(図38)。
権限設定により、Webインターフェイスにはアクセスできず、APIのみ利用できるユーザーを作成するような設定も可能だ。
分かりやすいインターフェイスで収集したパケットを分析可能
このように、Moloch Viewerではさまざまな側面から取得したパケットを分析できる。主要なプロトコルについてはその内容までも検索対象とできるため、問題のある通信を比較的容易に特定できるだろう。
また、Wiresharkなどのパケット分析ツールではパケット収集時にあらかじめ収集対象のパケットを指定しておくことが多いが、その場合設定によっては必要なパケットが収集されないというミスも発生しうる。Molochの場合、すべてのネットワークトラフィックが記録されたデータベースを検索するという仕組み上、パケットの取得漏れが発生しにくいのも使いやすい。
今回は紹介していないが、外部のプログラムからMoloch ViewerのAPIに直接アクセスしてデータを取得することもできる。これを利用すれば、監視・管理などにもMolochを利用できる。
一方で、パケットが大量に流れる実運用環境においては構成を工夫する必要がある点についてはややハードルが高い。AOLなどの大規模な環境での利用実績はあるが、前回記事で紹介したとおりそういった環境ではクラスタ構成かつネットワークパケットブローカーの導入などが推奨されているなど、ノウハウが必要となりそうだ。とはいえ、ツールとしての完成度はすでに高く、クラスタ構成を利用しないのであればインストールも容易だ。まずは気軽に試してみると良いだろう。