LoginSignup
2
0

PythonでWindows形式のイベントログであるevtxデータをCSVに変換してみました

Posted at

概要

NetAppファイルサーバのイベントログであるevtxデータを サクッと確認するために CSV形式 へ変換保存するプログラムです。

実行環境

macOS Ventura 13.0
python 3.8.12

事前準備

事前に以下のモジュールをインポートしておきます。

$ pip install python-evtx

実行プログラム

extviewer2.py
import argparse
import time
from Evtx.Evtx import Evtx
import pandas as pd

INPUT_FILE = './20230511_13.evtx'


# CSVファイルへの変換
def evtx_to_csv(evtx_file):
    # イベントスキーマーの定義
    SCHEMA = 'http://schemas.netapp.com/events/event'

    # カラムの定義
    EventID = []
    EventName = []
    TimeCreated = []
    Computer = []
    SubjectIP = []
    DomainName = []
    UserName = []
    ObjectType = []
    ObjectName = []
    
    # イベントファイルのオープン
    with Evtx(evtx_file) as log:

        # イベントレコードの取得
        for record in log.records():
            elm = record.lxml()

            # # 個々のrecord構造の確認(最初に確認しましょう)
            # print(record.xml())

            EventID.append(elm.xpath("//event:EventID", namespaces={"event":SCHEMA})[0].text)
            EventName.append(elm.xpath("//event:EventName", namespaces={"event":SCHEMA})[0].text)
            TimeCreated.append(elm.xpath("//event:TimeCreated", namespaces={"event":SCHEMA})[0].get("SystemTime"))
            Computer.append(elm.xpath("//event:Computer", namespaces={"event":SCHEMA})[0].text)
            SubjectIP.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[0].text)
            DomainName.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[5].text)
            UserName.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[6].text)
            ObjectType.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[8].text)
            ObjectName.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[10].text)

        # データフレームを作成
        df = pd.DataFrame({
            'EventID' : EventID,
            'EventName' : EventName,
            'TimeCreated' : TimeCreated,
            'Computer' : Computer,
            'SubjectIP' : SubjectIP,
            'DomainName' : DomainName,
            'UserName' : UserName,
            'ObjectType' : ObjectType,
            'ObjectName' : ObjectName
        })

        # # 画面への表示
        # print(df.to_markdown())

        # # CSVファイルへの書き込み
        # output_file = evtx_file + '.csv'
        # df.to_csv(output_file, header=True, index=True)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='extvをjson形式にするプログラム')
    parser.add_argument('-i', '--input', type=str, default=INPUT_FILE, help='対象となる extvファイル')
    args = parser.parse_args()

    # 経過時間の計測開始
    start = time.time()
    evtx_to_csv(args.input)
    generate_time = time.time() - start

    print("\n処理時間:{0}".format(generate_time) + " [sec]\n")

プログラムの実行

.evtxの全体構造を知るために「print(record.xml())」のコメントを外して実行してみます。

$ python extviewer2.py
    :
    :
<Event xmlns="http://schemas.netapp.com/events/event"><System><Provider Name="NetApp-Security-Auditing" Guid="{3CB2AAAA-FEFE-4A4A-BDBD-DCF422F33333}"></Provider>
<EventID>4663</EventID>
<EventName>Write Object</EventName>
<Version>101.2</Version>
<Source>CIFS</Source>
<Level>0</Level>
<Opcode>0</Opcode>
<Keywords>0x8020000000000000</Keywords>
<Result>Audit Success</Result>
<TimeCreated SystemTime="2023-05-09 13:07:44.935497"></TimeCreated>
<Correlation></Correlation>
<Channel>Security</Channel>
<Computer>FAS2750A/kg_domain</Computer>
<ComputerUUID>1c3a88ff-bbac-1111-7070-00a098000bee/55239d44-9393-1111-bebe-000098db8bee</ComputerUUID>
<Security></Security>
</System>
<EventData><Data Name="SubjectIP" IPVersion="4">10.2.1.6</Data>
<Data Name="SubjectHostname" Source=""></Data>
<Data Name="SubjectUnix" Uid="0" Gid="1" Local="false"></Data>
<Data Name="SubjectUserSid">S-1-5-22-888882222-1115556666-353845456-500</Data>
<Data Name="SubjectUserIsLocal">false</Data>
<Data Name="SubjectDomainName">NETAPP</Data>
<Data Name="SubjectUserName">testuser</Data>
<Data Name="ObjectServer">Security</Data>
<Data Name="ObjectType">File</Data>
<Data Name="HandleID">00000000000aaa;00;000999ee;0cdb8844</Data>
<Data Name="ObjectName">(zidoma);/00_Develop/HeaderEncryption/testdir/rs-audit.db.encryptedrn</Data>
<Data Name="WriteOffset">0</Data>
<Data Name="WriteCount">4096</Data>
</EventData>
</Event>
    :
    :
処理時間:0.23432326316833496 [sec]

.evtxデータを画面に表示するために「print(df.to_markdown())」のコメントを外して実行してみます。

$ python extviewer2.py
|    |   EventID | EventName             | TimeCreated                | Computer           | SubjectIP   | DomainName   | UserName      | ObjectType                          | ObjectName                                                            |
    : 
    :
| 10 |      4663 | Read Object           | 2023-05-09 13:07:44.851498 | FAS2750A/kg_domain | 10.2.1.6    | NETAPP       | testuser      | File                                | (zidoma);/00_Develop/HeaderEncryption/testdir/rs-audit.db.encryptedrn |
| 11 |      4663 | Write Object          | 2023-05-09 13:07:44.935497 | FAS2750A/kg_domain | 10.2.1.6    | NETAPP       | testuser      | File                                | (zidoma);/00_Develop/HeaderEncryption/testdir/rs-audit.db.encryp
    : 
    :
処理時間:0.15549492835998535 [sec]

.evtxデータをCSVに変換保存するために、「df.to_csv(output_file, header=True, index=True)」あたりのコメントを外して実行してみます。

$ python extviewer2.py

処理時間:0.13499021530151367 [sec]

作成されたCSVファイルを確認します。

$ vim 20230511_13.evtx.csv
-------------------------------
,EventID,EventName,TimeCreated,Computer,SubjectIP,DomainName,UserName,ObjectType,ObjectName
    : 
    :
10,4663,Read Object,2023-05-09 13:07:44.851498,FAS2750A/kg_domain,10.2.1.6,NETAPP,testuser,File,(zidoma);/00_Develop/HeaderEncryption/testdir/rs-audit.db.encryptedrn
11,4663,Write Object,2023-05-09 13:07:44.935497,FAS2750A/kg_domain,10.2.1.6,NETAPP,testuser,File,(zidoma);/00_Develop/HeaderEncryption/testdir/rs-audit.db.encryptedrn
    : 
    :

まとめ

NetAppファイルサーバのイベントログの必要な部分のデータを選択し、CSVファイル形式で保存しました。これでサクッとイベントログの監査がやりやすくなりました。

参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
.evtxファイルをPythonで解析する

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0