2026年3月のアップデート(KB5079473)により、IT管理者愛用の監視ツール「Sysmon」がWindows 11の標準オプションとして提供開始された。これまで手動導入が必要だった高度なログ収集が、数クリックで実現可能になった。不審なプロセスや通信、ファイル改ざんを可視化する、最強の防御設定と解析テクニックを徹底解説する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象:Windows 11
Windows 11の新機能「Sysmon」がオプション機能に登場2026年3月10日(米国時間)に提供開始となったWindows 11の更新プログラム(KB5079473)で、長年セキュリティの専門家たちに愛用されてきた監視ツール「Sysmon(System Monitor)」が標準搭載された。これまでは、Microsoftのシステムユーティリティー集「Sysinternals」からの手動インストールが必要だったが、今後はWindows 11の「オプション機能」から数クリックで有効化できるようになった。
本Tech TIPSでは、Sysmonを有効化する方法から、ログの確認方法やフィルタリング方法、PowerShellを使った解析手法までを解説する。
Sysmon(System Monitor)は、Windowsのカーネルレベルで動作するシステム監視ツールだ。標準のWindowsイベントログでは記録されない、下表のような詳細な活動を捕捉し、イベントログに書き込む。
| 監視対象 | 内容の例 |
|---|---|
| プロセスの生成・終了 | どのプログラムが何を起動したか |
| ネットワーク接続 | どのプロセスがどのIPに通信したか |
| ファイル作成日時の変更 | タイムスタンプの改ざん検知 |
| ドライバの読み込み | 不審なカーネルドライバの検出 |
| レジストリの変更 | 自動起動設定などの書き換えなど |
| DNSクエリ | ドメイン名の解決記録 |
| Sysmonの監視対象 | |
Sysmonを有効にするには、2026年3月の更新プログラム(KB5079473)の適用が必要である。対象バージョンは、2024 Update(バージョン24H2)と2025 Update(バージョン25H2)である。
「設定」アプリからは、以下の手順で有効化できる。
再起動は不要で、即座に利用可能になる。
PowerShellを使ってSysmonを有効化することもできる。管理者権限でWindowsターミナルのPowerShellを開き、以下のコマンドレットを実行すればよい。
Enable-WindowsOptionalFeature -Online -FeatureName "Sysmon" -NoRestart
Sysmonは、有効化しただけではサービスは起動していない。管理者権限でコマンドプロンプトまたはPowerShellを開き、以下のコマンドを実行する必要がある。
sysmon -i -n
コマンドの実行後、サービスが正常に起動しているかどうかを確認するには、管理者権限でPowerShellを開き、以下のコマンドレットを実行すればよい。
Get-Service Sysmon | Format-List Name, Status, StartType
既にSysinternals版のSysmonをインストールしている場合は、管理者権限でコマンドプロンプトを開き、以下のコマンドを実行する必要がある。これでサービスとドライバがアンインストールされ、メモリ常駐が解除される。
■32bit版
sysmon.exe -u force
■64bit版
sysmon64.exe -u force
Sysmonを実行しただけでは意味がない。Sysmonが記録したイベントを確認し、異常なものがないかどうかを確認する必要がある。
タスクバーにある[スタート]ボタンを右クリックしてクイックアクセスメニューを開き、[イベントビューアー]を選択、「イベントビューアー」を起動する。
左ペインで「アプリケーションとサービスログ」−「Microsoft」−「Windows」−「Sysmon」−「Operational」を選択すると、右ペインにSysmonが記録したイベントの一覧が表示される。
イベントビューアーでログを確認する各イベントには「イベントID」が付与されており、内容を識別する手掛かりになる。主要なイベントIDを下表に示す。
| イベントID | 内容 |
|---|---|
| 1 | プロセス生成(最も基本的な監視項目) |
| 2 | ファイルの作成日時変更(タイムスタンプの改ざん) |
| 3 | ネットワーク接続 |
| 7 | イメージ(DLLなど)の読み込み |
| 11 | ファイルの作成 |
| 12/13/14 | レジストリの変更 |
| 22 | DNSクエリ |
| Sysmonが記録するイベントIDの意味 | |
イベントビューアーは、GUIで確認できて分かりやすい。しかし、大量のログから必要な情報を絞り込むなら、PowerShellの方が圧倒的に効率的だ。
例えば、Sysmonの直近50件のイベントを取得するのであれば、PowerShellで以下のコマンドレットを実行すればよい。
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 50
標準の状態では全てのイベントが記録されるため、ログが膨大になり重要な情報が埋もれてしまう可能性がある。XML形式の構成ファイルを使って「記録しないイベント」を定義しておくのが運用のコツだ。
以下は、単純なSysmonの構成ファイルの例だ。
<Sysmon schemaversion="4.82">
<!-- Capture all hashes -->
<HashAlgorithms>*</HashAlgorithms>
<EventFiltering>
<!-- Log all drivers except if the signature -->
<!-- contains Microsoft or Windows -->
<DriverLoad onmatch="exclude">
<Signature condition="contains">microsoft</Signature>
<Signature condition="contains">windows</Signature>
</DriverLoad>
<!-- Do not log process termination -->
<ProcessTerminate onmatch="include" />
<!-- Log network connection if the destination port equals 443 -->
<!-- or 80, and process isn't InternetExplorer -->
<NetworkConnect onmatch="include">
<DestinationPort>443</DestinationPort>
<DestinationPort>80</DestinationPort>
</NetworkConnect>
<NetworkConnect onmatch="exclude">
<Image condition="end with">iexplore.exe</Image>
</NetworkConnect>
</EventFiltering>
</Sysmon>
ただし、これでは単純なフィルタリングしかしていないため、多くのイベントが記録されてしまう。GitHubの「SwiftOnSecurity/sysmon-config」で配布されている「sysmonconfig-export.xml」が包括的なルールセットとして広く利用されているので、これを活用するのがよいだろう。
このファイルを「config.xml」として保存し、以下のコマンドで適用すればよい。
sysmon -c .\config.xml
構成ファイルでイベントをフィルタリングする(2)設定が正しく適用されたかどうか確認するには以下を実行する。現在の設定内容が表示される。
sysmon -c
PowerShellを使って、「タイムスタンプの改ざんを検出する」と「不審な外部通信を洗い出す」の2つのシナリオでSysmonのイベントログから抽出する方法を紹介しよう。いずれも管理者権限でPowerShellを開いて実行する。
マルウェアは自身の存在を隠すため、作成日時を数年前に偽装することがある。このスクリプトはその「書き換え行為そのもの」を記録したログを抽出するものだ。
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
Id = 2 # ファイル作成日時の変更
} -MaxEvents 100 | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
[PSCustomObject]@{
Time = $_.TimeCreated
Process = ($data | Where-Object Name -eq 'Image').('#text')
TargetFile = ($data | Where-Object Name -eq 'TargetFilename').('#text')
CreationTime = ($data | Where-Object Name -eq 'CreationUtcTime').('#text')
PreviousTime = ($data | Where-Object Name -eq 'PreviousCreationUtcTime').('#text')
}
} | Format-Table -AutoSize
「メモ帳」アプリを起動し、上記のスクリプトを貼り付けて「timestamp.ps1」などのファイル名で保存して、管理者権限で開いたコマンドプロンプトやPowerShellで以下のコマンドで実行すればよい。
PowerShell -ExecutionPolicy RemoteSigned .\timestamp.ps1
該当するログ(イベント)が見つからなかったときは、「Get-WinEvent : 指定した選択条件に一致するイベントが見つかりませんでした。」というエラーメッセージが表示される。
見つかった場合は、対象ログの記録日時や対象プロセスのフルパスなどの一覧表が表示される。
上記のスクリプトでは直近の最大100件のログを抽出する。件数をもっと増やしたい場合は、Get-WinEventコマンドレットの引数「-MaxEvents」の値を増やしてほしい。
どのプロセスがどのIPアドレスやポートに接続したかを一覧化するPowerShellスクリプトは以下の通りだ。見慣れない宛先IPや深夜帯の通信がないかどうか確認するのに役立つ。
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
Id = 3 # ネットワーク接続
} -MaxEvents 200 | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
[PSCustomObject]@{
Time = $_.TimeCreated
Process = ($data | Where-Object Name -eq 'Image').'#text'
DestIP = ($data | Where-Object Name -eq 'DestinationIp').'#text'
DestPort = ($data | Where-Object Name -eq 'DestinationPort').('#text')
DestHost = ($data | Where-Object Name -eq 'DestinationHostname').('#text')
}
} | Sort-Object DestIP -Unique | Format-Table -AutoSize
「メモ帳」アプリを起動し、上記のスクリプトを貼り付けて「netlog.ps1」などのファイル名で保存して、管理者権限で開いたコマンドプロンプトやPowerShellで以下のコマンドで実行すればよい。
PowerShell -ExecutionPolicy RemoteSigned .\netlog.ps1
不審な外部通信を確認する「sysmon -i」でインストールしたSysmonのサービスやドライバをアンインストールするには、管理者権限でコマンドプロンプトを開き、以下のコマンドを実行すればよい。
sysmon -u
これでサービスやドライバの登録が解除され、メモリからアンインストールされる。Sysmonによるログも記録されなくなる。
Copyright© Digital Advantage Corp. All Rights Reserved.
編集部からのお知らせ