
Windowsの運用管理を快適にする10の裏ワザ/表ワザ
[ テクニカルライター 山市 良 ]
2021年12月10日配信
2023年09月28日更新
Windowsイベントログは、システムで発生するシステム、アプリケーション、セキュリティに関する膨大なイベントを記録し、提供するサービスです。Windowsイベントログを使用すると、ハードウェアの障害の予兆、容量不足、システムやアプリケーションの重大なエラー、セキュリティ侵害の痕跡などを調査することができます。Windowsに標準搭載されている[イベントビューアー](Eventvwr.msc)スナップインを使用すると、イベントログを参照したり、フィルター条件を設定して効率的に調査したりできます。しかしながら、[イベントビューアー](Eventvwr.msc)スナップインは現在進行中の問題を調査するのに快適なパフォーマンスを提供できるとは言えません。また、膨大なイベントに埋もれて、重大なイベントの発生を見逃してしまうこともあるでしょう。
WindowsはWindowsイベントログにコマンドラインからアクセスする複数の方法を用意しています。その中で共通のフィルター条件で利用できるPowerShellのGet-WinEventコマンドレットとWevtutilコマンドの2つを紹介します。
次のコマンドラインの例はいずれも、過去24時間(86400000ミリ秒)にシステム(System)ログに記録された、警告レベル以上のイベント、すなわち警告(レベル3)、エラー(レベル2)、重大(レベル1)イベントをフィルターし、記録された順番に出力するものです(画面1)。
Get-WinEvent -LogName System -FilterXPath "*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | Sort -property RecordId | Select
TimeCreated, LevelDisplayName, Message
または
Wevtutil qe System /rd:true /f:text /q:"*[System[(Level=1 or Level=2 or Level=3) and
TimeCreated[timediff(@SystemTime) <= 86400000]]]"
画面1 過去24時間に発生した警告レベル以上のイベントを確認する
Get-WinEventコマンドレットとWevtutilコマンドはどちらも、構造化(XPath)クエリ式でフィルター条件を設定します。クエリ式を作成するのが難しそうと思うかもしれませんが、実は非常に簡単です。
[イベントビューアー](Eventvwr.msc)スナップインを開いて、目的のログを選択し、[現在のログをフィルター…]をクリックします。[フィルター]タブのGUIでフィルター条件を設定したら、[XML]タブに切り替えます。すると、<Select>セクション内に目的のクエリ式が見つかります。なお、クエリの中にXMLの中でエスケープされている&gt;と&lt;が含まれる場合は、それぞれ>と<に置き換えて使用してください。目的のクエリ式を取り出したら、フィルター設定は破棄してかまいません。
画面2 GUIでフィルター条件を設定すると、XPathクエリが完成する
現在進行中の問題をリアルタイムに追跡したい、あるいは再現テストをしながらのイベント発生をリアルタイムに監視したいという場合は、PowerShellで簡単なスクリプトを書くことで対応できます。例えば、次のコードは、過去1時間(3600000ミリ秒)にシステムログに記録された警告以上のイベントがあればそれを出力し、その後、10秒間隔で新たに記録される警告以上のイベントを出力し続けます。-LogNameパラメーターのSystemをApplicationに書き換えることで、アプリケーションログに対応させることができます(画面2)。
$lastRecordId = 0
while ($true) {
$events = Get-WinEvent -LogName System -FilterXpath "*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 3600000]]]" -ErrorAction SilentlyContinue | Sort -property RecordId
if ($events.Count -ne 0) {
if ($lastRecordId -eq 0) {
foreach ($event in $events) {
Write-Host $event.TimeCreated `t $event.LevelDisplayName `t $event.Message
$lastRecordId = $event.RecordId
}
} else {
foreach ($event in $events) {
if ($event.RecordId -gt $lastRecordId) {
Write-Host $event.TimeCreated `t $event.LevelDisplayName `t $event.Message
$lastRecordId = $event.RecordId
}
}
}
}
Start-Sleep -seconds 10
}
画面3 システムとアプリケーションログの警告以上のイベント発生をリアルタイムに監視する
マイクロソフトが無料提供しているWindows Sysinternalsは、WindowsおよびWindows Serverのシステムを高度に監視、診断、およびトラブルシューティングするのに役立つユーティリティ群です。Windowsイベントログ関連のユーティリティとしては、System Monitor(Sysmon)があります。
Sysmonは、個々のコンピューターやネットワーク上の、潜在的で悪質なアクティビティを追跡するために作成されたものですが、悪質なアクティビティだけでなく、トラブルシューティングの目的にも使用できます。
SysmonはWindows SysinternalsのサイトからZIP(sysmon.ziip)としてダウンロードできるほか、Live Sysinternalsのサイトから実行可能ファイル(sysmon.exe)を直接ダウンロードすることもできます。
Windows Sysinternals|Sysmon
https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon
Live Sysinternals
https://live.sysinternals.com/sysmon.exe
Sysmonは多数のルールを用いて、表2に示すイベントを検出します。Sysmonが検出したアクティビティはイベントログ(Microsoft-Windows-Sysmon/Operations)に記録され、[イベントビューアー](Eventvwr.msc)スナップインやその他の標準的なコマンドラインツールから参照できます。
表1 Sysmonのルールと検出可能なイベント(Sysmon v13.02、SchemaVersion 4.50の場合)
ルール名 | イベント | イベントID | 既定 | 説明 |
ProcessCreate | Process Create | 1 | include | プロセスの作成 |
FileCreateTime | File creation time changed | 2 | ファイル作成日時の変更 | |
NetworkConnect | Network connection detected | 3 | ネットワーク接続の検出 | |
ProcessTerminate | Process terminated | 5 | include | プロセス終了 |
DriverLoad | Driver loaded | 6 | ドライバーの読み込み | |
ImageLoad | Image loaded | 7 | 実行可能イメージの読み込み | |
CreateRemoteThread | CreateRemoteThread detected | 8 | リモートスレッド作成の検出 | |
RawAccessRead | RawAccessRead detected | 9 | RAWリードアクセスの検出 | |
ProcessAccess | Process accessed | 10 | 別のプロセスからアクセスの検出 | |
FileCreate | File created | 11 | exclude | ファイルの作成、上書き検出 |
RegistryEvent | Registry object added or deleted | 12 | exclude | レジストリの作成、削除の検出 |
Registry value set | 13 | exclude | レジストリ値の設定の検出 | |
Registry object renamed | 14 | exclude | レジストリのリネーム検出 | |
FileCreateStreamHash | File stream created | 15 | exclude | ファイルストリームの作成検出 |
PipeEvent | Pipe Created | 17 | exclude | 名前付きパイプの作成検出 |
Pipe Connected | 18 | exclude | 名前付きパイプへの接続検出 | |
WmiEvent | WmiEventFilter activity detected | 19 | exclude | WMIイベントフィルター登録の検出、マルウェアの挙動の可能性あり |
WmiEventConsumer activity detected | 20 | exclude | WMIコンシューマーの登録検出 | |
WmiEventConsumerToFilter activity detected | 21 | exclude | WMIコンシューマーのフィルターバンドの検出 | |
DnsQuery | Dns query | 22 | exclude | DNSクエリの検出 |
FileDelete | File Delete | 23 | ファイルの削除検出 | |
ClipboardChange | Clipboard changed | 24 | RDP接続でクリップボード共有を検出 | |
ProcessTampering | Process Tampering | 25 | プロセスのイメージの外部からの変更の検出 | |
- | Sysmon service state changed | 4 | - | Sysmonサービスの状態変更(開始、停止)の検出 |
- | Sysmon config state changed | 16 | - | Sysmon構成の変更の検出、フィルタールールの更新など |
- | Error report | 255 | - | Sysmonのエラーの検出 |
インストールなしで利用できるWindows Sysinternalsの大多数のユーティリティとは異なり、Sysmonはシステムにインストールすることでサービスとして動作し、システムの起動直後からシャットダウンまで、長期にわたって(Sysmonをアンインストールするまで)監視を継続します。Sysmonは構成によっては膨大なイベントを記録し続けるため、フィルター条件を設定して、短期間に集中的に監視することをお勧めします。
Sysmonをインストールするには-iパラメーターを指定して管理者として実行します。すると既定の構成でインストールされ、監視がスタートします。既定の構成では、表2のincludeとなっているプロセスの作成と終了イベント、およびSysmon関連のイベントです。また、ネットワーク接続の検出とイメージの読み込みイベントの監視機能は無効化されます。Sysmonのインストール後、-cパラメーターを指定して実行すると、現在の構成をダンプ出力できます(画面4)。
sysmon.exe -acceteula -i
sysmon -c
画面4 Sysmonを既定の構成でインストールし監視をスタート。既定の構成では、すべてのプロセスの作成と終了がログに記録される
Sysmonによる監視を停止するには-uパラメーターを指定して実行してSysmonをアンインストールします。アンインストールすると記録済みのイベントログを解釈できなくなります。アンインストール後もイベントログを参照するためには-mパラメーターを指定して実行し、ログの解釈に必要なイベントマニュフェストのみをインストールします。
sysmon -u
sysmon -m
特定のプロセスに対象を絞って、イメージの読み込みイベント、およびネットワーク接続(TCP/UDPポートへの接続)イベントを含めて監視するには、次のようなコマンドラインでインストールします。既にSysmonをインストールしてある場合は、いったんアンインストールしてから、再インストールしてください。次の例は、app.exeというプロセスに関連するイベントのみをログに記録します。複数のプロセスを指定する場合は、app.exe, app2.exeのようにカンマで区切って指定してください。
sysmon.exe -accepteula -i -l -n app.exe
SysmonはXML構成ファイルを使用して複雑なフィルター条件を設定できます。例えば、HTTPS(443)およびRDP(3389)へのネットワーク接続のみを検出させたい場合は、次のようなmyconfig.xmlファイルを記述し、Sysmonをネットワーク接続イベントの検出を有効(-nパラメーター)にしてインストールしたあと、-cパラメーターを付けてXML構成ファイルを読み込ませます(画面5、画面6)。
sysmon.exe -accepteula -i -n
sysmon -c myconfig.xml
myconfig.xml ※SchemaVersionはSysmonのバージョンによって更新されることがあります。適切なのSchemaVersionはSysmon -sを実行して確認、変更してください。 |
<Sysmon schemaversion="4.50"> <EventFiltering> <DestinationPort>443</DestinationPort> </EventFiltering> |
画面5 XML構成ファイルを使用してSysmonをインストール、構成する
画面6 Sysmonを使用してHTTPS(443)およびRDP(3389)ポートへの着信を監視する
Sysmonをうまく使いこなすことで、知りたい情報に絞って効率よく監視することができます。しかし、複雑な条件を設定するのは難しいかもしれません。Sysmonのダウンロードサイトにある使用例や、以下の書籍の解説が参考になるでしょう。ただし、現在利用できるバージョンは、さらに機能が拡充されており、使用方法のすべてが説明されているわけではないことに留意してください。
Windows Sysinternals徹底解説 改訂新版(日経BP社)
https://www.nikkeibp.co.jp/atclpubmkt/book/17/P98960/
※本ページは2022年6月22日現在の情報です。
こちらのページの続きを含めた、全10テクニックをまとめたホワイトペーパーをご覧いただけます。以下のフォームよりお申込みください。