WindowsのEventLogをいろいろ取得してみる(EventLog→Syslogサーバ その2)

WindowsのEventLogをいろいろファイルにしてみる

WindowsのEventLogをSyslogサーバで他のLinuxサーバと同様に一元管理したい場合、Syslogサーバに送るのは、以前投稿した「Powershellで特定のファイルをLinuxのSyslogサーバに送信する」で書いたPowershellを使えばよい。(あまり出来はよくないと思うし、メッセージ長などでRFC違反を犯している場合もありうるので、テストは必要だ)

今回はEventLogからCSVファイルにログデータを取得する方法を考えてみる。

 セキュリティ的に取得しておいたほうがよさそうなログ

セキュリティチェックのためにログを取得しようとすると、どんなログを取得すればよいか考えてみた。
Windowsサーバをサーバルームで動作させている場合
- ログオン/ログアウト
- USBメモリの着脱
- PowerShell

あたりは取得しておいたほうがよいと思う。
それでは、実際にはどんな風に取得すべきなのか?考えてみた。
なお、取得したデータは全部Syslogサーバに送ることを考えて、CSVファイルにUTF-8で書き出すようにした。
また、コマンドラインから直接Powershellコマンドを打つ際に、管理者権限が必要になる場合があることから、Powershellの起動は管理者権限で起動するようにする必要がある。

ログを取る

ログイン/ログアウト

まずログイン/ログアウトだが、ログイン情報は、イベントビューアを見ると、
「Windowsログ」-「セキュリティ」
に出ていることがわかる。
ということで、

get-winevent -logname Security -filterxpath "*[System[Provider[@Name='Microsoft-Windows-Security-Auditing']]]" -maxevents 1 | Export-Csv -Encoding UTF8 -path c:\syslog.csv

こんな感じでやると、ログオン/ログオフ情報がsyslog.csvにUTF-8で書き出される。出力結果はこんな感じ。

#TYPE System.Diagnostics.Eventing.Reader.EventLogRecord
"Message","Id","Version","Qualifiers","Level","Task","Opcode","Keywords","RecordId","ProviderName","ProviderId","LogName","ProcessId","ThreadId","MachineName","UserId","TimeCreated","ActivityId","RelatedActivityId","ContainerLog","MatchedQueryIds","Bookmark","LevelDisplayName","OpcodeDisplayName","TaskDisplayName","KeywordsDisplayNames","Properties"
"新しいログオンに特権が割り当てられました。

サブジェクト:
    セキュリティ ID:      S-1-5-18
    アカウント名:     SYSTEM
    アカウント ドメイン:       NT AUTHORITY
    ログオン ID:        0x3e7

特権:     SeAssignPrimaryTokenPrivilege
            SeTcbPrivilege
            SeSecurityPrivilege
            SeTakeOwnershipPrivilege
            SeLoadDriverPrivilege
            SeBackupPrivilege
            SeRestorePrivilege
            SeDebugPrivilege
            SeAuditPrivilege
            SeSystemEnvironmentPrivilege
            SeImpersonatePrivilege","4672","0",,"0","12548","0","-9214364837600034816","15382","Microsoft-Windows-Security-Auditing","54849625-5478-4994-a5ba-3e3b0328c30d","Security","492","5796","Windows7",,"2018/04/07 12:17:47",,,"security","System.Int32[]","System.Diagnostics.Eventing.Reader.EventBookmark","情報","情報","特殊なログオン","System.Collections.ObjectModel.ReadOnlyCollection`1[System.String]","System.Collections.Generic.List`1[System.Diagnostics.Eventing.Reader.EventProperty]"

message部分がもともと改行されているのでCSVっぽくないが、各項目ごとに一応カンマで区切られている。

ここで、CSVの2つ目に"Id"が入っているが、この数字で、ログオン/ログオフ/特殊なログオン なのかがわかる。
詳しくは、Windows 7 および Windows Server 2008 R2 のセキュリティ イベントの説明に載っているが、Windows7上で実際に出ているIdをいくつか書き出してみると以下のようなものがでている。

Id No. 意味
4624 ログオン
4672 特殊なログオン
4634 ログオフ
4625 ログオン失敗

一般ユーザでログオン/ログオフすると、Idは4624が出て、4634でログオフしている。
特権ユーザでログオン/ログオフすると、Idは4624でログオンした後、4672で特権ユーザに昇格している。ログオフは一般ユーザと一緒。

特権ユーザでログインした場合は、4624,4672が連続してログに残ることから、「EventLogを最新の1行で取得する方法はよくない」ということだ。少なくとも2行出してあげると、Syslogサーバに送った際にも、特権ユーザでログオンしたことがわかるようになる。

USBメモリ

これは、EventLogではシステムのところに出る。Idは2003, 2004, 2005, 2010, 2100, 2105が相当するらしいのだが、ソースが見つけられなかった。

PowerShell

PowerShellを動作させると、
「アプリケーションとサービス」 ー 「Windows PowerShell」にログがでる。この時のIdは 600, 400, 403が出ることは確認したが、他のIdが出るかどうかソースが見つけられなかった。また、ログの数がPowershellの動作により変化するようだ。大体8個〜10個のログが出るようなので、-maxevents の値は10以上にしておいたほうが良いような気がする。

ログ取りの方法はさらに続く

実際にはイベントログを手動で取るようだと、なんにも嬉しくないので、イベントが発生した時に自動で取得できるようにしたい。これは前回Syslogサーバにデータを送信するPowerShellを作った時にもリンクを載せたが、@ITの「イベント・ログをトリガーにしてメールを送信する(基本編)」を参考にしてやってみる。

また、イベントログをトリガーにしてログをSyslogサーバに送信するためには、バッチファイルを起動する必要があることから、バッチファイルでPowerShellのスクリプトを動かす方法を考えてみる。

参考

Windows 7 および Windows Server 2008 R2 のセキュリティ イベントの説明
「Powershellで特定のファイルをLinuxのSyslogサーバに送信する」

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.