Windows のイベントログビューアで複数の evtx ファイルを検索する
こんにちは、kenzauros です。
最近はイベントログと戯れています。
今回は下記のようにアーカイブされたり抽出したりして複数に分かれたイベントログファイル (evtx) をまとめて一つの条件で検索する方法を紹介します。
カスタム検索のしくみ
単純に1つの evtx ファイルを検索するのであれば、 evtx をダブルクリックするだけで Windows 標準のイベントビューアーが開きますので、これで内容を確認できます。
この状態で (1) [現在のログをフィルター…] をクリックし、(2) [XML] タブを開くと単一の evtx ファイルの検索用クエリーが XML で表示されますので、どんな構造か確認できます。
これを見ると基本構造は下記のようになっていることがわかります。
<QueryList>
<Query Id="0" Path="file://ファイルフルパス">
<Select Path="file://ファイルフルパス">XPath クエリ</Select>
</Query>
</QueryList>
実際の検索条件は <Select>
タグ内に XPath クエリー で指定します。
ちなみにこの <Query>
タグ側の Path
はなくても動くため、実質的には <Select>
タグ内の Path
だけにフルパスを記載すれば問題ありません。
試しに [手動でクエリーを編集する] をチェックしてクエリーを編集してみます (警告メッセージが表示されますが、 [はい] を押してかまいません)。
<Query>
タグ側の Path
属性を削除し、XPathクエリー (*
のみが書かれている部分) に *[System[(EventID=4624)]]
とでも書いて OK を押します。
開いたログが「セキュリティ」ログであればログオンイベント (4624) だけが抽出されるはずです。
これで単一ファイルに対する検索クエリーをどのように書けばいいのかがわかりました。
カスタムビューの作成
カスタムの検索条件で抽出するときはカスタムビューを作ったほうがわかりやすいので、ここで手順を紹介します。
右クリックメニューから [カスタムビューの作成] を選びます。
[XML] タブを開き、 [手動でクエリーを編集する] をチェックします。警告メッセージが表示されますが、 [はい] を押します。
作成した <QueryList>
XML をペーストします。この中でも編集できますが、かなり不便なので別のテキストエディターで編集して貼り付けることをおすすめします。
[OK] を押し、適当な名前をつけて [OK] を押すとカスタムビューが作成されます。すでに存在する名前を指定して、上書きもできます。
これでカスタムビューが作成されました。
複数のイベントログファイルを検索するには
単一ファイルに対する検索クエリーを眺めていると <QueryList>
タグはその名の通り「リスト」なので複数の <Query>
を内包できそうであることが想像できます。
ということで <Query>
をコピーして、その Query/Select
タグの Path
に別のイベントログ・ファイルを指定してみます。
<QueryList>
<Query Id="0">
<Select Path="file://C:\tmp\Archive-Security-2018-02-28-00-23-31-756.evtx">*[System[(EventID=4624)]]</Select>
</Query>
<Query Id="1">
<Select Path="file://C:\tmp\Archive-Security-2018-02-27-00-49-19-462.evtx">*[System[(EventID=4624)]]</Select>
</Query>
</QueryList>
これでカスタムビューを作成すると 2 ファイルからイベント ID = 4624 のイベントが抽出されます。
さらに眺めているとなんとなく <Query>
自体まとめてしまってもよさそうな気がします。ということでまとめてみます。
<QueryList>
<Query Id="0">
<Select Path="file://C:\tmp\Archive-Security-2018-02-28-00-23-31-756.evtx">*[System[(EventID=4624)]]</Select>
<Select Path="file://C:\tmp\Archive-Security-2018-02-27-00-49-19-462.evtx">*[System[(EventID=4624)]]</Select>
</Query>
</QueryList>
これでもうまくいきました。これが一番シンプルな形かもしれません。
というわけで、イベントビューアーで複数の evtx ファイルを検索する場合はこの <Select>
タグを増やせばよい、ということがわかりました。
検索クエリー XML を作るメソッドを一気に作る
形式はわかったものの、数十個を超えるファイルパスを XML に記述するのは面倒ですので、 Python でまとめて XML を作るスクリプトを作成しました。
Gist に置いていますので、参考にしてください。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import glob
import re
import os
# 上限ファイル数 (適宜変更)
limit = 3
# 対象にする EventID のリスト (適宜変更)
event_id_list = [4624, 4634, 4625, 4648]
# EventData/Data の検索値のリスト (適宜変更)
data_value_list = ['hogehoge', 'fugafuga', 'momimomi']
# ----------------------------------------------------------------------
# 抽出条件式に変換
event_id = " or ".join(["(EventID=" + str(i) + ")" for i in event_id_list])
event_data = " or ".join(["(Data='" + v + "')" for v in data_value_list])
condition = "*[System[" + event_id + "] and EventData[" + event_data + "]]"
# ファイル番号
n = 0
# 出力ファイル
output_file = codecs.open("query_list.xml", "w", "utf-8")
output_file.write("<QueryList>\n")
output_file.write(" <Query Id=\"0\">\n")
for filename in glob.glob("*.evtx"):
print(filename)
path = os.path.abspath(filename)
output_file.write(" <Select Path=\"file://" + path + "\">" + condition + "</Select>\n")
n += 1
if n >= limit: break
output_file.write(" </Query>\n")
output_file.write("</QueryList>\n")
output_file.close
このスクリプトは、同じフォルダーに存在する evtx ファイル分の <Select>
タグを生成するようになっています。
イベント ID と EventData/Data の値で検索するようなクエリーを作成するようにしており、対象の検索値は event_id_list
, data_value_list
等で指定できます。
limit
は <Select>
タグを生成するファイルの上限数です。あまり大量のファイルに対して検索すると時間がかかるので、クエリーの動作確認時は小さな値にしておくことをおすすめします。「全部」にする場合は 10000
など大きな値を指定してください。
検索用 XPath クエリー覚え書き
いつも使う検索条件の XPath クエリーをメモしておきます。参考にどうぞ。
イベント ID で絞り込み
単一のイベント ID の場合
*[System[(EventID=4624)]]
複数のイベント ID の場合
複数の値は or
でつなぎましょう。
*[System[(EventID=4624) or (EventID=4634)]]
イベント ID + EventData/Data タグの値での絞り込み
単一のイベント ID + EventData/Data タグの値
複数条件は and
でつなぎましょう。
*[System[(EventID=4624)] and EventData[(Data='hogehoge')]]
さらに「Name 属性が IpAddress
の EventData/Data の値が -
以外のレコード」の場合はこちら。 (2018/6/26 追記)
*[System[(EventID=4624)] and EventData[Data[(@Name='IpAddress')] != '-']]
複数 EventData/Data タグ版
がんばって and
と or
を駆使しましょう。
*[System[(EventID=4624) or (EventID=4634)] and EventData[(Data='hogehoge') or (Data='fugafuga')]]
EventData/Data タグの名前指定版
<EventData>
<Data Name="SubjectUserSid">S-1-5-18</Data>
<Data Name="SubjectUserName">hogehoge</Data>
こんな感じのイベントログで <Data Name="SubjectUserName">
この中身だけを検索したい場合です。
*[System[(EventID=4624)] and EventData[(Data[(@Name='SubjectUserName')]='hogehoge')]]
条件が増えてくると []
の数がわからなくなってきて、合っていないとエラーになりますのでご注意ください。