【製品情報】Mobile Beholder:簡易ネットワーク管理/調査支援ツール公開(2008/05/28)
【技術メモ】DDoS 攻撃的な SMTP 接続の分析を掲載(2007/08/13)
【技術メモ】Beholder を利用したサイトへのアクセス動向の分析を掲載(2007/08/08)
【お知らせ】ウェブサイトを刷新(2007/08/02)

BeholderTM
出力モジュール拡張型パケットキャプチャ

BeholderTM は、 ネットワークのトラフィック状況を分析するためのデータ収集用センサーです。 単純なパケットキャプチャを行うだけのソフトウェアですが、 出力モジュールを交換することでキャプチャデータを様々な用途向けに加工できます。 出力モジュールには、Kobold の cciplog を発展させた IPログ・モジュールと TCP/UDP の一連のフローを記録する フロー・モジュールがあります。 これらのモジュールは、PostgreSQLSQLite のデータベースと連動して動作できます。 また、RRDtool を用いたグラフ作成モジュールもあります。

本製品は、以下のような分析や記録を行いたい管理者向けのソフトウェアです。

  • 管理しているネットワークのトラフィック状況を分析したい
  • 特定のトラフィックのペイロードを記録したい
  • FreeBSD サーバへのアクセスをすべて記録して分析したい

現在、FreeBSD/i386 6.2-RELEASE 用のパッケージとしてダウンロードできます。

製品内容は、 beholder 本体と arpscan, fastping, tcptraceroute, dhcping, wol などのネットワーク監視用のコマンドライン・ツールが含まれています。 また、これらのコマンドライン・ツールを iPod touch のアプリケーションとして実装した Mobile Beholder を公開しています。

導入手順

パッケージの導入

ダウンロードページから Beholder のパッケージを入手します。 ここでは、パッケージのファイル名を beholder-x.y.z.tbz として説明します。 x.y.z には、バージョン番号を表す数字が入ります。 Beholder の動作には、 Kobold, NetFD, SXML, IEEE OUI のライブラリと SQLite, PostgreSQL, RRDtool のデータベースを必要とします。 FreeBSD の ports などを利用して導入してください。 なお、Kobold, NetFD, SXML および IEEE OUI ライブラリは、 ダウンロードページからパッケージを取得して導入できます。 次のコマンドを実行すると Beholder が FreeBSD システムに導入されます。 依存するパッケージも同様のコマンドを使った方法で導入できます。


  # pkg_add beholder-x.y.z.tbz

FreeBSD の設定ファイルの編集

Beholder を利用するための設定を /etc/rc.conf あるいは /etc/rc.conf.local ファイルに記述します。vi などのエディタを使って以下のように記述してください。


  beholder_enable="YES"

Beholder の設定ファイルの編集

Beholder の設定ファイルが /usr/local/share/beholder/beholder.conf.sample にありますので、 これを /usr/local/etc/beholder.conf としてコピーします。 そのままでは、利用可能な機能がすべて列挙されていますので、 用途に応じて編集します。ここでは、 IPヘッダの記録を行う PostgreSQL 版 IPログ機能の設定例を示します。

基本項目の設定

FreeBSD のデーモンプログラムとして起動させるための、基本項目を設定します。 <user>, <group>, <pid-file>, <log-file> を稼働させる FreeBSD のシステム環境に合わせて編集してください。 FreeBSD 標準では、beholder ユーザとグループは存在しないので、 これらを nobody と nogroup にすると良いでしょう。


    <user>beholder</user><
    <group>beholder</group><
    <pid-file>/var/run/beholder.pid</pid-file>
    <log-file>/var/log/beholder.log</log-file>

センサー機能の設定

パケットをキャプチャするセンサー機能の設定を行います。 <interface> は FreeBSD のネットワーク・インタフェース名を指定します。 <filter> タグには tcpdump 形式の書式を指定できます。 <snap-size> はデフォルトでは、 パケットのペイロード部分も記録できるように 65535 となっていますが、 IPログ機能の場合はヘッダ部分の情報のみで十分なので、1024 とします。 <network> には、Beholder が稼働するネットワークを記述します。 Beholder をルータなどのネットワーク機器のミラーリング・ポートに繋いだ場合は、 <promiscuous> を on するとネットワーク上の全パケットを収集します。 デフォルトは、off です。


    <sensor>
      <interface>em0</interface><
      <filter>ip or icmp or vlan</filter><
      <snap-size>1024</snap-size><
      <promiscuous>on</promiscuous><
      <timeout>1000</timeout><!-- ミリ秒単位 -->
      <network>192.168.1.0/24</network>
    </sensor>

モジュールの設定

PostgreSQL 版 IPログ・モジュールを利用しますので、 サンプルファイルの次の部分を使います。 別マシンの PostgreSQL サーバにデータを記録する場合は、 <host>, <port> タグの項目も編集してください。 下記の例では、 PostgreSQL と Beholder が同一マシン上で稼働するのでコメントアウトしてあります。


    <module name="iplog" type="pgsql8">
      <path>/usr/local/libexec/beholder/modules/iplog_pgsql8.so</path>
      <database>beholder_iplog</database>
      <--
      <host>192.168.1.23</host>
      <port>5432</port>
      -->
    </module>

以下が最終的な設定ファイルとなります。


  <?xml version="1.1"?>
  <beholder mode="inline">
    <user>nobody</user>
    <group>nogroup</group>
    <pid-file>/var/run/beholder-iplog.pid</pid-file>
    <log-file>/var/log/beholder-iplog.log</log-file>
    <db-dir>/usr/local/share/beholder/db</db-dir>
    <data-dir>/usr/local/share/beholder</data-dir>
    <module-dir>/usr/local/libexec/beholder/modules</module-dir>
    <sensor>
      <interface>em0</interface>
      <filter>ip or icmp or vlan</filter>
      <snap-size>1024</snap-size><
      <promiscuous>on</promiscuous><
      <timeout>1000</timeout><!-- ミリ秒単位 -->
      <network>192.168.1.0/24</network>
    </sensor>
    <module name="iplog" type="pgsql8">
      <path>/usr/local/libexec/beholder/modules/iplog_pgsql8.so</path>
      <database>beholder_iplog</database>
      <--
      <host>192.168.1.23</host>
      <port>5432</port>
      -->
    </module>
  </beholder>

PostgreSQL データベースの作成

PostgreSQL の super-user になって、次の手順で作業を行います。 4行目の "CREATE LANGUAGE plpgsql;" は省略してもかまいません。


  $ psql
  pgsql=# CREATE USER beholder PASSWORD '$beholder';
  pgsql=# CREATE DATABASE beholder_iplog OWNER beholder ENCODING 'EUC_JP';
  pgsql=# \c beholder_iplog
  pgsql=# CRATE LANGUAGE plpgsql;
  pgsql=# \i /usr/local/share/beholder/iplog_pgsql8.sql
  pgsql=# \q

beholder の起動

beholder を起動させます。 今回は、手動で実行しますが、次回からはシステムの起動時に自動的に行われます。


  # /usr/local/etc/rc.d/beholder start

動作確認

Beholder が正常に稼働すれば、 PostgreSQL データベースにパケットの情報が記録されます。 以下の手順で、簡単に確認できます。


  % psql beholder_iplog
  beholder_iplog=# \x
  beholder_iplog=# SELECT * FROM tcpudp LIMIT 1;

  [ データが記録されている場合は、ここに出力されます。 ]

  beholder_iplog=# \q

出力モジュールの概要と用例

IPログ・モジュール

IPログ・モジュールは、 IPパケットのヘッダ情報を解析してデータベースに記録します。 記録される情報は、パケットキャプチャの開始時刻と終了時刻、 プロトコル番号、送信元および送信先の IPアドレス、 国名の略称と割り当てネットワークアドレス、パケット数、パケットの合計サイズ、 処理時間などがあります。 また、TCP や UDP の場合はポート番号、 ICMP などの場合はメッセージタイプとコードも記録します。

IPログ・モジュールを利用することで、 ネットワークの状況を様々な角度から検証できます。 例えば、PostgreSQL データベースにデータを記録していて、 日本以外からの TCP サービスへのアクセス頻度の上位10ヶ国を知りたい場合は、 次のように実行します。


  iplog=# select src_cc,dst_port,count(src_cc) from tcpudp
  iplog=#   where protocol = 6 and src_cc <> 'JP'
  iplog=#   group by src_cc,dst_port order by count(*) desc limit 10;
   src_cc | dst_port | count 
  --------+----------+-------
   US     |       80 | 23534
   CN     |       25 |  7130
   US     |       25 |  4885
   KR     |       80 |  2777
   AR     |       25 |  1603
   TW     |      135 |  1539
   KR     |       25 |  1464
   IN     |      135 |  1457
   BR     |       25 |  1300
   TW     |       25 |   943
  (10 rows)

また、日本以外から TCP ポート番号 25 にアクセスしてくる上位10ヶ国を知る場合は、 次のように実行します。


  iplog=# select src_cc,count(src_cc) from tcpudp
  iplog=#   where protocol = 6 and dst_port = 25 and src_cc <> 'JP'
  iplog=#   group by src_cc order by count(*) desc limit 10;
   src_cc | count 
  --------+-------
   CN     |  7130
   US     |  4885
   AR     |  1603
   KR     |  1464
   BR     |  1300
   TW     |   943
   CL     |   896
   FR     |   880
   GB     |   831
   IN     |   784
  (10 rows)

先の実行例と合わせると、Beholder が稼働しているネットワーク環境では、 ほとんどの TCP のサービスが米国(US)や中国(CN)などからの 迷惑メールのアクセスで使用されていることが分かります。 これは、日本以外からメールが来ることがないので、このように判断できます。

フロー・モジュール

フロー・モジュールは、TCP および UDP パケットの一連の情報を解析し、 各プロトコルのヘッダ情報とペイロードをデータベースに記録します。 記録されるヘッダ情報は、ほぼ IPログ・モジュールと同じで、 パケットキャプチャの開始時刻と終了時刻、 プロトコル番号、送信元および送信先の IPアドレス、 国名の略称と割り当てネットワークアドレス、パケット数、パケットの合計サイズ、 処理時間などです。

また、ペイロードは、tcpdump 形式と "raw" 形式の2種類を保存します。 これらのデータは、FreeBSD 上のファイルとして保存され、 データベースではその保存場所を管理しています。 ペイロードをデータベース内に保存せずに外部ファイルとして保存することで、 他のソフトウェアから容易にアクセス可能になります。 ペイロードの保存形式が2種類あるのは、 wiresharkImageMagick などの既存のソフトウェアで簡単にペイロードを利用するためです。

例えば、 2007年3月29日19:30から同20:00の間にウェブサーバへのアクセスがあり、 その内容が何かを知りたい場合は、次のように実行します。


  flowlog=# select * from flowlog where src_port = 80 and
  flowlog=#   ts_start > '2007-03-29 19:40' and
  flowlog=#   ts_end < '2007-03-29 19:50';
  -[ RECORD 1 ]--------------------------------------------
  ts_start  | 2007-03-29 19:47:46.538438
  ts_end    | 2007-03-29 19:47:46.590383
  protocol  | 6
  src_addr  | 210.173.173.89
  src_port  | 80
  src_cc    | JP
  src_net   | 210.160.0.0/12
  dst_addr  | 192.168.1.22
  dst_port  | 52918
  dst_cc    | SIP16
  dst_net   | 192.168.0.0/16
  tcp_flags | FS*PA****
  packets   | 4
  octets    | 267
  psize     | 131
  proctime  | 0.51945
  tcpdump   | /var/beholder/2007/03/29/19/flowlogrAFEBtpl.tcpdump
  payload   | /var/beholder/2007/03/29/19/flowlogrAFEBtpl.payload

フロー・モジュールを利用することで、 簡単に特定の日時のパケットの情報とペイロードを調べることができます。 応用次第では、Network Security Forensics にも活用できます。

例えば、tcpdump の内容を wireshark の入力とした場合は、次のように実行します(一部のみ抜粋)。


  % tshark -x -r /var/beholder/2007/03/29/19/flowlogrAFEBtpl.tcpdump
  1   0.000000 210.173.173.89 -> 192.168.1.22 TCP http > 52918 [SYN, ACK]
Seq=0 Ack=0 Win=5792 Len=0 MSS=1460 TSV=1524457915 TSER=55747735 WS=0

0000  00 40 ca df b5 06 00 0d 02 26 d8 99 08 00 45 00   .@.......&....E.
0010  00 3c 00 00 40 00 37 06 01 f7 d2 ad ad 59 c0 a8   .<..@.7......Y..
0020  01 16 00 50 ce b6 e5 98 50 0d da 91 99 ab a0 12   ...P....P.......
0030  16 a0 12 25 00 00 02 04 05 b4 04 02 08 0a 5a dd   ...%..........Z.
0040  61 bb 03 52 a4 97 01 03 03 00                     a..R......

  4   0.033000 210.173.173.89 -> 192.168.1.22 TCP http > 52918 [FIN, ACK]
Seq=132 Ack=624 Win=6864 Len=0 TSV=1524457918 TSER=55747760

0000  00 40 ca df b5 06 00 0d 02 26 d8 99 08 00 45 00   .@.......&....E.
0010  00 34 31 b5 40 00 38 06 cf 49 d2 ad ad 59 c0 a8   .41.@.8..I...Y..
0020  01 16 00 50 ce b6 e5 98 50 91 da 91 9c 1b 80 11   ...P....P.......
0030  1a d0 39 aa 00 00 01 01 08 0a 5a dd 61 be 03 52   ..9.......Z.a..R
0040  a4 b0                                             ..

また、テキスト形式のアプリケーションであれば、 "raw" ペイロードは人が可読できる状態で保存されていますので、 万が一、重要な電子メールを消してしまっても復元できる確率は高くなります。

コマンドライン・ツールの使い方

附属のコマンドライン・ツールの多くは、 "-o" オプションで出力形式を選択できます。 タブ形式や CSV 形式、HTML 形式の出力の他に、 出力結果を PostgreSQLSQLite のデータベースに直接保存することもできます。 詳しくは、各コマンドの "-h" オプション指定時に出力される簡易説明で確認してください。

arpscan

arpscan は、ネットワークに接続されている機器の IPアドレスと MAC アドレスを収集するプログラムです。 プログラムの仕組みは、RFC 826 の仕様に基づいた方法で IPアドレスに対応する MAC アドレスの応答を受信しているだけです。 また、MAC アドレスとハードウェアベンダの関係は、 IEEE OUI の情報をデータベース化して利用しています。 コマンドの実行には、 FreeBSD のネットワークデバイス名と調査したい IPアドレスの範囲を指定します。 以下の例では、MAC アドレスの一部を伏字にしてあります。


  # arpscan em0 192.168.2.0/24
  em0   00:a0:b0:xx:xx:xx       192.168.2.30    I-O DATA DEVICE, INC.
  em0   00:12:3f:xx:xx:xx       192.168.2.31    Dell Inc
  em0   00:0a:5e:xx:xx:xx       192.168.2.32    3COM Corporation
  em0   00:00:0e:xx:xx:xx       192.168.2.37    FUJITSU LIMITED
  em0   00:20:ed:xx:xx:xx       192.168.2.40    GIGA-BYTE TECHNOLOGY CO., LTD.
  em0   00:01:80:xx:xx:xx       192.168.2.41    AOpen, Inc.
  em0   00:02:b3:xx:xx:xx       192.168.2.47    Intel Corporation
  em0   00:00:85:xx:xx:xx       192.168.2.52    CANON INC.
  em0   00:0d:0b:xx:xx:xx       192.168.2.54    Melco Inc.

fastping

fastping は、複数ホストに対する高速な死活監視を行うためのプログラムです。 高速化を図るために ICMP echo パケットを一斉送信後は、 ICMP reply パケットを受信した順に処理します。 また、FreeBSD 標準の ping プログラムのように単一ホストに対する実行も可能です。 通常は、監視対象とするホストを列挙したファイルを "-f" オプションで指定して、次のように実行します。 "-c" オプションはパケットの送信回数を指定し、 "-t" オプションはタイムアウトを指定します。


  # fastping -c 1 -t 5 -f hosts
  lion                0.013(ms) [alive]
  tiger               0.433(ms) [alive]
  panther            19.371(ms) [alive]
  leopard            34.284(ms) [alive]
  jaguar             48.307(ms) [alive]
  cheetah            65.296(ms) [alive]
  dog                 0.000(ms) [Host Unreachable]
  cat                 0.000(ms) [Host Unreachable]
  rat                 0.000(ms) [dead]
  total: 5.0474 secs.

tcptraceroute

tcptraceroute は、TCP パケットを利用した経路表示プログラムです。 オプション指定がない場合は、80番ポートへのパケットの到達性を使って、 相手先までの経路情報を表示します。 "-n" オプションがない場合は、ホスト名の逆引きを行います。 また、Kobold ライブラリを利用していますので、 標準で経路上の国名の略称を表示します。 さらに、"-A" オプションを利用することで、 AS番号も表示可能です。 以下は、www.google.com までの実行例です。 途中、"JP" から "US" にネットワークが切り替わっているのが分かります。


  # tcptraceroute -An www.google.com
  Tracing the path to www.google.com(66.249.89.104) on TCP port 80, 30 hops max
    1 59.106.21.1     [JP]     0.796 (ms)  [AS9370]
    2 202.181.110.61  [JP]     2.818 (ms)  [AS9370]
    3 202.181.110.6   [JP]     2.855 (ms)  [AS9370]
    4 202.181.110.9   [JP]     0.841 (ms)  [AS9370]
    5 210.171.224.96  [JP]     1.855 (ms)  [AS7527]
    6 216.239.47.233  [US]     1.868 (ms)  [AS15169/AS9729]
    7 216.239.47.54   [US]     9.831 (ms)  [AS15169/AS9729]
    8 66.249.89.104   [US]     1.856 (ms) www.google.com:80 [open] [AS15169]

dhcping

dhcping は、ネットワーク上で稼働している DHCP サーバの監視を行うためのプログラムです。 プログラムの仕組みは、RFC 2131 の仕様に基づいて実装しています。 最初に DHCPDISCOVER のブロードキャスト・パケットを送信します。 次に、DHCPOFFER パケットを受信した場合、DHCPREQUEST パケットを送信し、 DHCPACK を受信した場合にのみ、結果を出力します。 この場合は、即座に DHCPRELEASE パケットをユニキャストで送信して、 DHCP サーバに IPアドレスを返還します。

使い方は、 dhcping を実行する FreeBSD マシンのネットワークデバイス名を指定して実行します。 以下の例では、DHCP サーバの IPアドレスは、192.168.1.1 で、 割り当て可能な IPアドレスは 192.168.1.50 であることを示しています。


  # dhcping em0
  Got answer from: 192.168.1.1, Your client IP: 192.168.1.50

wol

wol は、Wake On LAN を行うためのプログラムです。 wol プログラムの仕組みは、Wake On LAN 用のマジックパケットを UDP で送信しているだけです。 使い方は、Wake On LAN 対応の NIC を持つハードウェアの MAC アドレスを指定して実行します。


  # wol 01:02:03:04:05:06

knock

knock は、TCP サービス用の簡易ポートスキャナです。 仕組みは、調査したホストのサービスに SYN フラグ付きの TCP パケットを送り、 SYN+ACK フラグの TCP パケットの応答があるかを調べるだけです。 knock は、TCP の正規手順での接続終了処理を行いますので、 調査対象のホストにはアクセス記録がログとして残ります。

調査対象とするホストを指定してコマンドを実行します。 調査ポート番号を指定しない場合は、1〜1024番のみをスキャンします。


  % knock 192.168.1.1
  192.168.1.1    23       [open]
  192.168.1.1    80       [open]
  192.168.1.1   137       [timedout]
  192.168.1.1   138       [timedout]
  192.168.1.1   139       [timedout]
  total: 2: 8.0525 secs.

portscan

portscan は、簡易ポートスキャナです。 TCP サービスのポートスキャンについては、knock と仕組みは同じです。 UDP サービスについては、UDP はポートがオープンしている場合は、 サービス毎の正しいプロトコルで通信しない限り応答がありません。 UDP ポートの開閉を推測するため、ICMP の応答を利用しています。

portscan は knock と違い全ポートをスキャンします。 そのため、実行にはポート番号を指定します。


  % portscan 192.168.1.1 1-1024
  192.168.1.1    23/tcp   [open]
  192.168.1.1    80/tcp   [open]
  192.168.1.1   137/tcp   [timedout]
  192.168.1.1   138/tcp   [timedout]
  192.168.1.1   139/tcp   [timedout]
  total: 2: 8.0525 secs.

UDP ポートが閉じている場合は、次のような実行結果となります。


  # portscan -u 192.168.1.1 1
  192.168.1.1     1/udp        [port unreachable]

UDP ポートが開いている場合は、次のようになります。


  # portscan -u 192.168.1.1 53
  192.168.1.1    53/udp        [open (filtered)]
  total: 1: 2.0501 secs.

winny_scan

winny_scan は、 検出ツールの開発者が語る,「Winnyを検出する方法」Winnyの通信解読に挑戦!を参考に実装したツールです。 調査対象ホストを指定すると全ポートをスキャンします。 Winny が稼働していれば、次のような結果を出力します。 順に、IPアドレス、ポート番号、Winny識別文字、Winnyバージョン、回線速度です。


  % winny_scan 192.168.1.23
  192.168.1.23 24573 Winny Ver2.0b1    (12710) 1071KB/s
  total: 1: 0.0290 secs.

なお、プログラムの動作確認実験は、FreeBSD 上の wine で Winny を稼働させて行いました。 しかしまだ不安定なようで、core を出力して wine が落ちました。

また、本ツールは、技術的興味から実装しただけですので、 上記以外の動作検証も行っておりません。 そのため、ツール自体が実際のネットワーク環境において、 効果的にその有効性を発揮するのかも分かりません。 ご利用の際は、ツールの結果を参考程度に活用するのがよろしいかと思われます。

製品紹介

TrickBSDTM

ネットワーク用途向けコンパクトフラッシュ版 FreeBSD

KoboldTM

IPv4アドレスから国名を検索するC言語用ライブラリ

BeholderTM

出力モジュールを拡張可能なパケットキャプチャとネットワークツール

ManticoreTM

接続元の国毎にアクセス制御 を行うための Postfixmilter