技術者ブログ
クラウド型WAF「Scutum(スキュータム)」の開発者/エンジニアによるブログです。
金床“Kanatoko”をはじめとする株式会社ビットフォレストの技術チームが、“WAFを支える技術”をテーマに幅広く、不定期に更新中!

HadoopとDunkheadでCodeRedワームの感染の様子を可視化する

はじめに
Dunkheadはタイムスタンプ付きのテキストデータ(アクセスログなど)を手軽に可視化するためのソフトウェアです。Hadoop上で動作するため、データのサイズが大きい、いわゆるビッグデータの場合にも使用することができます。
今回はCAIDAで公開されているCodeRedワーム感染時の時系列データを、Dunkheadで可視化してみます。CodeRedワームは12年前(2001年)に猛威をふるった、今となっては非常に懐かしいコンピュータウイルスです。わずか14時間の間に35万ものホストに感染し、当時のインターネットを大混乱に陥れました。
今回利用するCodeRedワームに関するデータセットは、下記の組織によって提供されています。
Support for the CAIDA Dataset on the Code-Red Worms was provided by Cisco Systems, the US Department of Homeland Security, the National Science Foundation, DARPA, and CAIDA Members.
The CAIDA Dataset on the Code-Red Worms - July and August 2001, David Moore and Colleen Shannon.
可視化の対象となるタイムスタンプ付きのデータはcodered-july.table.txtという名前のファイルで、29万行あり、サイズは21MBほどです。2013年の今となってはそれほど大きなものではないため、Hadoopを使わなくても解析可能ですが、ちょっと変わったデータセットということで、Dunkheadによる可視化のチュートリアルのひとつとして使ってみます。
生のデータを見てタイムスタンプ部のフォーマットを確認する
Dunkheadでデータを可視化する場合、まずは生のデータがどのようなものなのか、先頭の数十行程度でもよいので、実際にエディタで確認します。可視化の対象とするCodeRedワームのデータは、以下のようなフォーマットになっています。
# The tab seperated columns in this file are: # 1. start time # 2. end time # 3. TLD # 4. country # 5. latitude # 6. longitude # 7. AS number # 8. AS name 995557500.416929007 995557500.416929007 com us 33.03 -96.74 7132 SBIS-AS (7132) 995555891.224946022 995587111.971 arpa tw 24.15 120.67 3462 HINET-AS (3462) 995559414.895717978 995577450.949 arpa us 34.07 -117.17 1 BBNPLANET (1) 995534024.986616969 995586691.982 arpa us 39.58 -104.9 2914 VERIO (2914) 995556450.434137940 995586811.959 arpa us 39.58 -104.9 2914 VERIO (2914) 995559336.812577009 995559712.060075998 arpa tw 24.15 120.67 3462 HINET-AS (3462) 995563575.986 995565201.511910 arpa br -10 -55 13353 NETSTREAM (13353) 995566935.941 995586271.950 arpa ru 60 47 6903 AHA-AS (6903) 995584651.959 995584934.978689 net us 41.89 -87.62 19024 INTERNAP-BLK5 (19024)
各データはタブで区切られており、左から開始時間、終了時間、TLD、国、緯度、経度、ASナンバー、AS名となっているようです。
タイムスタンプ部のフォーマットはUNIX TIME(秒)で、小数点以下も存在しているようです。通常、Dunkheadの設定ファイルにおいてdatetime.formatの値はJavaのSimpleDateFormatのフォーマットに従った記述を行います。しかし今回のようにUNIX TIMEの場合には、該当するフォーマットが存在しません。そこで、かわりに「unixtime_second」あるいは「unixtime_millisecond」という表記を使用します(前者は秒の場合、後者はミリ秒の場合)。
タイムスタンプ部は行の先頭から始まっているので、Dunkheadの設定ファイルを以下のように記述してみます。
{ "datetime": { "format": "unixtime_second", "regex": "^[0-9\\.]{10,}" }, "fields": [] }
単位時間あたりの感染ホスト数を可視化する
Dunkheadを実行すると、以下の画像が1つだけ出力されます。これは単位時間(デフォルト値の5分)あたりのログの件数、つまり5分間に新たに感染したホスト数のグラフになります。ピーク時には約8000以上のホストが、たった5分の間に感染していたことがわかります。

CAIDAにあるレポート、The Spread of the Code-Red Worm (CRv2)のFigure4の図が、ちょうどこのグラフと同じ内容になっています(CAIDAでは縦軸の数値は5分ではなく、1分です)。
TLD別の感染ホスト数を可視化する
データにはTLDの情報が含まれているので、次にTLD別に単位時間あたりの感染ホスト数を可視化してみます。大量の画像が生成されるのを防ぐため、閾値(threshold)を100に設定します。また、regex項目でTLDにあたる左から三番目のアルファベットで構成される部分をグループ化し、それをkey項目の中で「$1」として使います。これによって、例えばTLDが「com」のデータは「TLD-com」で集められます。設定ファイルは次のようになります。
{ "threshold": 100, "datetime": { "format": "unixtime_second", "regex": "^[0-9\\.]{10,}" }, "fields": [ { "name": "TLD-$1", "regex": "^[0-9\\.]+\\t+[0-9\\.]+\\t+([a-zA-Z]+)", "type": "count" } ] }
上記設定でDunkheadを実行すると、約50個ほどの画像ファイルが出力されます。ここではそのうちのいくつかについて見ていきます。





.comと.netは圧倒的な多さで、感染の様子もほとんど同じであることがわかります。.govや.milといった重要なドメインのホストについても、少数はやられているようです。また、.jpは.comなどの1/10程度の比率で感染していたようです。
感染停止時間に注目して可視化する
CodeRedワームはある時間になると感染を停止し、攻撃を開始するようにプログラミングされていました。データの左から2番目の数字が「感染フェーズが終わった」と見られる時間です。
995555891.224946022 995587111.971 arpa tw 24.15 120.67 3462 HINET-AS (3462) 995559414.895717978 995577450.949 arpa us 34.07 -117.17 1 BBNPLANET (1) 995534024.986616969 995586691.982 arpa us 39.58 -104.9 2914 VERIO (2914) 995556450.434137940 995586811.959 arpa us 39.58 -104.9 2914 VERIO (2914)
設定ファイルを次のように記述し、単位時間あたりの感染フェーズを終えたホストの数について可視化を行ってみます。
{ "datetime": { "format": "unixtime_second", "regex": "^[^\\t]+\\t([0-9\\.]{10,})" }, "fields": [] }
これにより、次のような画像が出力されます。

プログラミングされていた時刻に、いっせいに停止されていることがわかります。ピークに含まれないホストは、タイムゾーンの影響か、あるいは時計が狂っていたのでしょうか。この図は先述したCAIDAのレポート中のFigure6と同じものになります。
まとめ
今回は、Hadoop上で手軽にデータを可視化するためのソフトウェア、Dunkheadを使い、CodeRedワームの感染時のデータを可視化してみました。Dunkheadはこのように、タイムスタンプ付きのデータであればgrepするような感覚で、簡単に可視化を行うことができます。
今回解析対象としたデータは小さな規模のものでしたが、DunkheadはHadoop上で動作するアプリケーションであるため、データが大規模な場合にも今回と同様に「設定ファイルに注目したい項目を記述する」だけの簡単なアプローチで可視化が可能です。フィードバック等があればお気軽に@kinyukaまでお寄せください。