$

ログ解析パッチワーク

ログ解析向けデータ処理ツール「Quilt」の設計思想について

はじめに

quilt-logo

機器の障害や侵害の調査を行う際など、単発でログを読みたいなというケースは割とあります。
grepやcut, awkなどの標準コマンドで一生懸命加工してもかまわないのですが、実際やってみるとフォーマット崩れや整形ミスが起きることもしばしば。

もちろん、CSVやJSONを加工するツールは無数にありますが、これ!というのがなく、結局Pythonでスクリプトを書いたりすることが多かったのです。

悩み

例えば、次のようなWindowsイベントログがあったとします。

欲しい列だけ抜き出して、

TimeCreated Computer UserName RemoteHost PayloadData2
2016-10-06 01:47:21.9551972 WIN-WFBHIBE5GXZ.example.co.jp -- (fe80::4888:72d0:4f06:d1a1) LogonType 3
2016-10-06 01:47:21.9551972 WIN-WFBHIBE5GXZ.example.co.jp -- (::1) LogonType 3
2016-10-06 01:47:21.9551972 WIN-WFBHIBE5GXZ.example.co.jp -- (192.168.16.1) LogonType 3
2016-10-06 01:47:21.9551972 WIN-WFBHIBE5GXZ.example.co.jp -- (fe80::4888:72d0:4f06:d1a1) LogonType 3
2016-10-06 01:49:00.9378317 WIN-WFBHIBE5GXZ.example.co.jp -- (fe80::4888:72d0:4f06:d1a1) LogonType 3

くらいにするだけなら、まぁ標準コマンドでもなんとかできますよ。

じゃあ、こんな表が欲しいときは?

時刻(JST) ログオン元 ユーザ名 ログオン先 ログオンタイプ
2016-10-06 10:47:21.955197200 WIN-WFBHIBE5GXZ.example.co.jp -- fe80::4888:72d0:4f06:d1a1 3
2016-10-06 10:47:21.955197200 WIN-WFBHIBE5GXZ.example.co.jp -- ::1 3
2016-10-06 10:47:21.955197200 WIN-WFBHIBE5GXZ.example.co.jp -- 192.168.16.1 3
2016-10-06 10:47:21.955197200 WIN-WFBHIBE5GXZ.example.co.jp -- fe80::4888:72d0:4f06:d1a1 3
2016-10-06 10:49:00.937831700 WIN-WFBHIBE5GXZ.example.co.jp -- fe80::4888:72d0:4f06:d1a1 3

やることが一気にふえます。

  • 列名を分かりやすい日本語へ揃える
  • 元の時刻をUTCからJSTへ変換する
  • LogonType や () など余計な文字列を取り除く

sedやらawkやらなにやらで一生懸命加工してもいいですが、結果が本当にあっているのか不安です(大体はイレギュラーな値を含む行から先が壊れている)。
じゃあExcelなりなんなりのGUIツールでやればいいかもしれませんが、それを100個とか1,000個とかやるのはつらい。非常に。

それで気づいたのですが、私がやりたいのって抽出・フィルタ・整形だけじゃなく、加工もなんですよね。 調査の途中で思いついた処理をガチャガチャつなげて、最後は人間が読みやすい形で出してほしい。

でもそこまでできるツールってあんまりないなぁと思いました。

Quilt

そこで、ログ解析に使ういろんなデータ処理をつなげて実行できるようにしたのが Quilt です。 基本構文は次のとおり。

種類 役割 例
INITIALIZER データを読み込む処理 load
CHAINABLE データを加工する処理 select, grep, sed, sort
FINALIZER 処理結果を出力する処理 showtable, dump

各処理は - で区切って左から右へ処理をつなげていきます。

CLI

CLIから使うのであれば、下記のように使います。
ロード、列の選択、整形表示を行っています。

さっきの表を作りたいなら、次のように書けます。

ちょっと長いですが、見ての通り

  • eventlog.csv をロードする
  • 調査に必要な列だけを選択する
  • TimeCreated 列の日時を UTC から Asia/Tokyo に変換する
  • RemoteHost 列の先頭と末尾に付いている括弧を取り除く
  • PayloadData2 列から LogonType という文字列を取り除く
  • 各列を分かりやすい日本語の名前に変更する
  • 最後に表形式で表示する

という処理を、上から順番に実行しています。

- の役割はUNIXのパイプと似ていますが、それぞれの処理結果を逐次受け渡しているわけではありません。
Quiltでは処理を遅延評価として組み立て、最後にまとめて実行します。

数十GBを超えるようなログでも、不要な列の読み込みや中間データの生成をなるべく減らすためです。
ただし、sortのようにデータ全体を見る必要がある処理は例外です(なのでなるべく処理の後ろに書くほうがよい)。

RUN

また、Quiltにはルールによる一括実行もあります。

Quiltでは、CLIで使っている処理をほぼそのままYAMLのワークフローへ移せます。
そのため、調査中はワンライナーで試行錯誤、手順が固まったら再利用可能な処理として残す、という使い方ができます。もちろんgit管理したっていい。

実行するときはこう。

また、Quiltには単純なgrepやselectだけでなく、timesliceによる時間範囲の抽出、changetzによるタイムゾーン変換、正規表現から値を列として取り出すextractなど、ログ解析で頻繁に使う加工も用意しています。
これによって、他プログラムとの行ったり来たりを可能な限り減らしています。

  • changetz — タイムゾーン変換
  • timeslice — 時間範囲で切る
  • bucket — 5分単位などへ丸める
  • delta — 前レコードとの差分
  • extract — regexのnamed captureを列化
  • flatten — JSONLのネストを展開
  • parse-size — 10MB 等をbyteへ変換

ログ解析で使ってみる

せっかくなので、ちょびっと実際のログ解析に近い使い方をしてみます。

今回はJPCERT/CCが公開している ログ分析トレーニング バージョン2 を使います。 この教材はActive Directory環境への攻撃を題材として、Windowsイベントログを使った初動調査を学べるようになっています。

EVTXをCSVにする

QuiltはWindowsイベントログそのものを解析するツールではありませんので、Eric Zimmerman氏の EvtxECmd を使ってEVTXをCSVへ変換します。

まず構造を見る

最初にヘッダーを確認します。

あとは数件だけ見てみたり。

大量の列があって読みづらいですね。必要な列だけに絞りましょう。

ま、多少は見やすいかな。

VPNからのログオンを探す

実践編Hands-on 1では、VPNのIPアドレスとして 10.10.100.254 が与えられ、そこから行われたログオンを特定していきます。 設問は時刻、アカウント、攻撃手法などをログから埋めていく形式です。

ログオン成功を見るなら、まずEvent ID 4624です。このあたりは 君たちはどうWindowsイベントログを調査するか を参照。

10.10.100.254 から handsonlab\domadm へのRDPログオンですね。
さっくりみつかりました。

見つけた情報から深掘りする

実際のログ解析では、一発の検索で答えが出ることはあまりありません。

一つのイベントから、

  • アカウント
  • IPアドレス
  • ホスト名
  • 発生時刻
  • Event ID

といった情報を拾い、それを次の検索条件に使います。

例えば怪しいアカウントが分かったなら、

さらに発生時間帯が分かったなら、

と絞っていきます。

実際に、この教材ではイベントID 4769を手掛かりとして不審なサービスチケット要求を追えるログが含まれています。
こうして調査中に見つけた観点をYAMLへ落とし、別の端末やデータにも繰り返し適用できるようにする。こうした「調査で得た知見を再利用可能な処理へ落とす」という流れは、Detection Engineeringにもつながる話ですね。

おわりに

フォレンジックやマルウェア解析では、用途ごとにさまざまなツールを使い分けます。EVTXをパースするならEvtxECmd、文字列の抽出ならほげほげ、検索ならふがふが...といった具合です。
Quiltは、そういったさまざまなツールの共通出力フォーマットであるCSVやJSONLに対して小さな処理を組み合わせて、調査者が見たい形へ持っていくことが目的です。場合によってはその出力をまた別のツールに食わせたりすることもあるでしょう。

Quilt という名前も、そういう小さな処理を継ぎ接ぎしていくイメージから付けています(& 好きな曲名から借用)。 ログ解析はパッチワークや!

おわり