🐙

WindowsのイベントログをS3に保存するスクリプト

2022/10/29に公開約2,400字

はじめに

元々AWS CLIやAWS SDKを使ってプログラムを書いていたので、
Windowsのイベントログを月に1回 S3に保管して管理できないかふと思ってやってみた結果を記載

前提

・AWS上にWindowsサーバを作成して、IAMのロールにてS3とSNSの適切な権限のロールを作成してWindwsサーバにIAMロールを割り当てています。
・S3にバケットを作成しWindowsサーバからのみバケット操作できるようにバケットポリシーを作成しております。
・作成したWinodwsサーバには、AWS CLIをインストールしています。インストール手順についてはこちらを参考にして下さい。
・S3にイベントログを保存できなかった時にエラー処理として、SNSで通知する仕様にしております。

作ったPowerShellのスクリプト

特に何か記載することはなく、各プログラムの動作を書いているので、そこまで難しくないと思います。


# 保存先のバケット名を記載
$BucketName = "********"

# 取得対象のイベントログを指定
$LogNames = @("********")

# SNS送信先のARNを指定
$Arn = "********"

# 先月時点のyyyyMM文字列を取得し作成するファイル名につける
$YYYYMM = (Get-Date).AddMonths(-1).ToString("yyyyMM")

# 出力先として「C:\temp」フォルダを指定
$DstFolder = "c:\temp\"

# イベントログを取得する対象の期間を先月1日から末日までの1ヶ月間と指定
$StartJTime = (Get-Date -Day 1 -hour 0 -minute 0 -second 0).AddMonths(-1)
$EndJTime = (Get-Date -Day 1 -hour 0 -minute 0 -second 0)

# イベントログを取得する際の日付をUTCに変換(UTCに変換しないとフィルタリング条件として使えない)
$StartUtcTime = [System.TimeZoneInfo]::ConvertTimeToUtc($StartJTime).ToString("yyyy-MM-ddTHH:mm:ssZ")
$EndUtcTime = [System.TimeZoneInfo]::ConvertTimeToUtc($EndJTime).ToString("yyyy-MM-ddTHH:mm:ssZ")

# 日付指定でフィルタリング条件作成
$Filter = @"
  Event/System/TimeCreated[@SystemTime>='$StartUtcTime'] and
  Event/System/TimeCreated[@SystemTime<'$EndUtcTime']
"@ 

# イベントログ出力用のオブジェクトを作成
$EvSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession

# イベントログをevtx形式で出力
foreach($LogName in $LogNames){
  $OutFile = $DstFolder + "\" + $Env:COMPUTERNAME + "_" + $LogName + "_" + $YYYYMM + ".evtx"
  $Locale = [System.Globalization.CultureInfo]::CreateSpecificCulture("ja-JP")
  $EvSession.ExportLogAndMessages($LogName,"LogName",$Filter,$OutFile,$True,$Locale)
}

# エクスポートしたイベントログファイルを圧縮
$ZipFile = $OutFile + ".zip"
Compress-Archive -Path $OutFile -DestinationPath $ZipFile 

# S3バケットに保存
aws s3 cp $ZipFile s3://$BucketName/

# AWS CLIのステータスコードを取得して0以外のステータスの場合にSNSメッセージを送信
# リターンコードの詳細:https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-returncodes.html
if ($lastexitcode -ne 0){
    aws sns publish --topic-arn $Arn --message "Windows EventLog S3 Upload Fail"
}Else{
	#ファイルを削除
	Remove-Item $OutFile
	Remove-Item $ZipFile
	
	# エクスポートした時のMetaFileが作成されるので削除(-Recurse -Forceで、rmの-rfと同じ機能となる)
	Remove-Item -Path C:\temp\LocaleMetaData -Recurse -Force
}

終わり。

GitHubで編集を提案

Discussion

ログインするとコメントできます