【製品情報】Mobile
Beholder:簡易ネットワーク管理/調査支援ツール公開(2008/05/28)
【技術メモ】DDoS 攻撃的な
SMTP 接続の分析を掲載(2007/08/13)
【技術メモ】Beholder
を利用したサイトへのアクセス動向の分析を掲載(2007/08/08)
【お知らせ】ウェブサイトを刷新(2007/08/02)
BeholderTM は、 ネットワークのトラフィック状況を分析するためのデータ収集用センサーです。 単純なパケットキャプチャを行うだけのソフトウェアですが、 出力モジュールを交換することでキャプチャデータを様々な用途向けに加工できます。 出力モジュールには、Kobold の cciplog を発展させた IPログ・モジュールと TCP/UDP の一連のフローを記録する フロー・モジュールがあります。 これらのモジュールは、PostgreSQL や SQLite のデータベースと連動して動作できます。 また、RRDtool を用いたグラフ作成モジュールもあります。
本製品は、以下のような分析や記録を行いたい管理者向けのソフトウェアです。
現在、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
Beholder を利用するための設定を /etc/rc.conf あるいは /etc/rc.conf.local ファイルに記述します。vi などのエディタを使って以下のように記述してください。
beholder_enable="YES"
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 の 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 を起動させます。 今回は、手動で実行しますが、次回からはシステムの起動時に自動的に行われます。
# /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アドレス、 国名の略称と割り当てネットワークアドレス、パケット数、パケットの合計サイズ、 処理時間などがあります。 また、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種類あるのは、 wireshark や ImageMagick などの既存のソフトウェアで簡単にペイロードを利用するためです。
例えば、 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 形式の出力の他に、 出力結果を PostgreSQL や SQLite のデータベースに直接保存することもできます。 詳しくは、各コマンドの "-h" オプション指定時に出力される簡易説明で確認してください。
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 は、複数ホストに対する高速な死活監視を行うためのプログラムです。 高速化を図るために 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 は、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 は、ネットワーク上で稼働している 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 は、Wake On LAN を行うためのプログラムです。 wol プログラムの仕組みは、Wake On LAN 用のマジックパケットを UDP で送信しているだけです。 使い方は、Wake On LAN 対応の NIC を持つハードウェアの MAC アドレスを指定して実行します。
# wol 01:02:03:04:05:06
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 は、簡易ポートスキャナです。 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を検出する方法」と 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 が落ちました。
また、本ツールは、技術的興味から実装しただけですので、 上記以外の動作検証も行っておりません。 そのため、ツール自体が実際のネットワーク環境において、 効果的にその有効性を発揮するのかも分かりません。 ご利用の際は、ツールの結果を参考程度に活用するのがよろしいかと思われます。
ネットワーク用途向けコンパクトフラッシュ版 FreeBSD
IPv4アドレスから国名を検索するC言語用ライブラリ
出力モジュールを拡張可能なパケットキャプチャとネットワークツール
接続元の国毎にアクセス制御 を行うための Postfix用 milter