ログ解析パッチワーク
ログ解析向けデータ処理ツール「Quilt」の設計思想について
はじめに
機器の障害や侵害の調査を行う際など、単発でログを読みたいなというケースは割とあります。
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 という名前も、そういう小さな処理を継ぎ接ぎしていくイメージから付けています(& 好きな曲名から借用)。 ログ解析はパッチワークや!
おわり