Windows Server 2022 with PS 第9章

第9章: サービスおよびプロセスの監視と管理


1. この章で解説する主要な技術・概念(箇条書き)

  1. サービス管理の基礎
    • Windowsサービスとは何か、スタートアップの種類(Automatic, Manual, Disabled, Delayed Startなど)
    • PowerShellによるサービス状態制御(Get-Service, Start-Service, Stop-Service, Restart-Service
  2. サービスのステータス監視と自動再起動
    • 監視スクリプトの実装例、サーバー障害時のダウンタイム短縮
    • イベントログ・メール通知との連携
  3. プロセス管理コマンド
    • Get-Process, Stop-Process の詳細と注意点
    • リモートサーバー上のプロセス確認・制御(Invoke-Command, Get-Process -ComputerName など)
  4. イベントログ・監査ログの収集とフィルタリング
    • Get-EventLog, Get-WinEvent の違い、セキュリティログ(Securityログ)の重要性
    • フィルタリングやイベントIDに基づく分析
  5. ログ分析スクリプトとレポート生成
    • 継続的なログ収集の自動化、閾値や特定イベントIDでのアラート発行
    • ログ内容の可視化(HTMLレポートなど)
  6. サービス・ログ監査の実務的活用シナリオ
    • ビジネスクリティカルなサービスの安定運用と冗長化戦略
    • SIEM連携やセキュリティ強化(ランサムウェア対策など)

2. サービス管理の基礎

2-1. Windowsサービスとは

  • Windowsサービスは、バックグラウンドで動作し、ユーザーがログオンしていなくても実行されるプログラム。
  • OS起動時に自動スタートするもの(Automatic, Delayed Start)や、必要時に手動起動するもの(Manual)がある。
    • 例: Print Spooler, Windows Update (wuauserv), DNS Server (DNS) など。

2-2. スタートアップの種類

  1. Automatic(自動): システム起動と同時に開始。
  2. Automatic (Delayed Start): システム起動後、一定時間遅らせて開始する(負荷分散が狙い)。
  3. Manual(手動): 手動で明示的に開始されるまで起動しない。
  4. Disabled(無効): 管理者が再度「Manual」や「Automatic」に戻すまで起動不可。

2-3. サービス管理の基本コマンド

# 一覧と状態を確認
Get-Service

# 特定サービスを停止
Stop-Service -Name "Spooler"

# 特定サービスを開始
Start-Service -Name "Spooler"

# 再起動
Restart-Service -Name "Spooler"
  • Get-Service では -Name-DisplayName を使って絞り込み可能。
  • サービスが起動中に Stop-Service で停止を強制しようとすると、依存関係のあるサービスも影響を受ける場合があるため注意。

3. サービスのステータス監視と自動再起動

3-1. 監視スクリプトの実装例

<#
.SYNOPSIS
  指定サービスの状態を監視し、停止していた場合に自動再起動を試みる。

.DESCRIPTION
  サービスダウン時のダウンタイムを最小化するためのシンプルなサンプル。

.PARAMETER ServiceName
  監視対象サービスの内部名(例: wuauserv)。
#>

param(
    [Parameter(Mandatory=$true)]
    [string]$ServiceName
)

$service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue

if ($service -eq $null) {
    Write-Host "Service '$ServiceName' does not exist on this server."
    return
}

if ($service.Status -eq "Stopped") {
    Write-Host "Service '$ServiceName' is Stopped. Attempting to Start..."
    Start-Service -Name $ServiceName

    Start-Sleep -Seconds 5

    $updatedStatus = (Get-Service -Name $ServiceName).Status
    if ($updatedStatus -eq "Running") {
        Write-Host "Service started successfully."
    } else {
        Write-Host "Failed to start '$ServiceName'. Check event logs."
    }
} else {
    Write-Host "Service '$ServiceName' is already Running."
}
  • これをタスクスケジューラで5分おきに回すなどすれば、サービス停止から自動的に復旧を試みる。
  • 本番環境では、何度も再起動に失敗したら別のアクション(アラート通知など)へ移行するロジックが必要。

3-2. イベントログ・メール通知との連携

  • 再起動に失敗した場合、Email通知ログ記録を行うことで、管理者が早期対応可能。
  • スクリプト末尾で Send-MailMessage や外部APIへのWebhookなどを使えば、稼働状況のモニタリングを効率化できる。

4. プロセス管理コマンド

4-1. Get-Process と実行中のプロセス監視

Get-Process
# CPU, Handles, WS (WorkingSet), VM, etc. が表示
  • 特定プロセス名(例: notepad)のみ表示するには、Get-Process -Name "notepad"
  • 大規模環境では、-ComputerName パラメータ(Windows PowerShell 5.1では廃止済み、または制限あり)やInvoke-Command経由でリモート取得を行う。

4-2. Stop-Process と注意点

Stop-Process -Name "notepad" -Force
  • 強制終了するため、データが保存されていないアプリケーションは破損が起きるリスクがある。
  • サーバー上の重要なプロセス(IIS Worker ProcessやSQL Serverなど)を誤って止めないよう注意。

4-3. リモートサーバーのプロセス一覧取得例

Invoke-Command -ComputerName "Server01" -ScriptBlock {
    Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
}
  • CPU使用量の高い上位プロセスを確認し、必要に応じてStop-Processを同様にリモートから実行できる。

5. イベントログ・監査ログの収集とフィルタリング

5-1. Get-EventLog と Get-WinEvent の違い

  • Get-EventLog: 従来の“クラシック”イベントログ(System, Application, Security)に対応。
  • Get-WinEvent: 新しいイベントログ(ETW)を含むより広範なログソースに対応し、高速・柔軟なフィルタリングが可能。
  • 例:
  # Systemログの最新10件を表示
  Get-EventLog -LogName System -Newest 10

  # Get-WinEventで"System"ログからエラーのみ取得
  Get-WinEvent -LogName "System" | Where-Object { $_.LevelDisplayName -eq "Error" }

5-2. セキュリティログ(Securityログ)の強化

  • Securityログには、ログオン・ログオフ、アカウント操作、権限変更などの監査情報が記録される。
  • 監査ポリシー(GPO)で「成功・失敗」イベントを詳細に記録する設定を行い、侵入検知不正操作の追跡を容易に。
  • ただし、ログ量が膨大になるため、適宜フィルタリング&アーカイブが必要。

5-3. フィルタリングとファイル出力例

Get-WinEvent -FilterHashtable @{
    LogName = "Application"
    Level = 2   # 2=Error, 3=Warning, 4=Information
    Id = 1000
} | Select-Object TimeCreated, Id, LevelDisplayName, Message |
    Export-Csv "C:\Logs\AppError1000.csv" -NoTypeInformation
  • これにより、イベントID 1000(アプリケーションエラーなど)に関するエントリを抽出してCSV保存。

6. ログ分析スクリプトとレポート生成

6-1. 定期レポート作成例 (HTML出力)

# Daily-LogReport.ps1
$errors = Get-WinEvent -LogName "System" -MaxEvents 1000 | Where-Object { $_.LevelDisplayName -eq "Error" }
$report = @"
<html>
<head><title>Daily System Error Report</title></head>
<body>
<h1>Daily System Error Report</h1>
<p>Total Errors: $($errors.Count)</p>
<table border='1'>
<tr><th>TimeCreated</th><th>EventID</th><th>Message</th></tr>
"@

foreach ($err in $errors | Select-Object -First 50) {
    $report += "<tr><td>$($err.TimeCreated)</td><td>$($err.Id)</td><td>$($err.Message)</td></tr>"
}
$report += "</table></body></html>"

$report | Out-File "C:\Logs\SystemErrorReport.html"

# (Optional) メール送信
# Send-MailMessage -To "admin@example.com" -Subject "System Error Report" -BodyAsHtml $report -SmtpServer "mail.example.com"
  • 例ではSystemログからエラー(Error)を最大50件までHTML化して保存。
  • これをタスクスケジューラで1日1回実行し、管理者がHTMLレポートを確認するという運用が可能。

6-2. SIEMとの連携

  • 大規模企業では、SIEMツール(Security Information and Event Management)にイベントをリアルタイム送信し、相関分析や集中管理を行う。
  • PowerShellスクリプトでJSON形式のログを生成し、REST APIやSyslog経由でSIEMにアップする例もある。
  • セキュリティログ(Securityログ)のイベントID(例: 4625: ログオン失敗)を検出して即座にSIEMでアラートを上げる運用が一般的。

7. サービス・ログ監査の実務的活用シナリオ

7-1. ビジネスクリティカルなサービスの安定運用

  • SQL ServerIISなど主要アプリのサービスがダウンすると即時影響が大きい。
  • 前章のバックアップ高可用性構成と合わせ、サービス再起動スクリプトを仕込む、ダウン検知でアラートを出すなど多層対策が重要。

7-2. ランサムウェアや改ざんの検知

  • イベントログにファイル削除拡張子一括変更など異常操作の痕跡があれば早期検知。
  • 監査ログでオブジェクトアクセスを詳細に記録する設定をし、Get-WinEvent等で定期解析する例がある。
  • WAC(Windows Admin Center)や外部SIEMと連携すると広範囲のサーバーを一括監視できる。

7-3. ログのローテーションと長期保管

  • イベントログ容量が大きくなると古いログが上書きされるため、容量管理上限を越えたらエクスポートするスクリプトを導入すると安心。
  • 重要な監査ログはWORMメディアクラウドストレージに定期転送して改ざんリスクを下げる運用も検討。

8. 章末まとめと次章へのつながり

8-1. 学習のまとめ

  • サービス管理の基礎を再確認し、Get-Service, Start-Service, Stop-Service などでスクリプト・リモート管理が可能であることを把握。
  • サービスの自動監視・再起動スクリプトで運用の安定化を狙う際、失敗時アラートや複数回失敗の対処フローを検討すればダウンタイムをさらに短縮。
  • プロセス管理Get-Process, Stop-Process)を用いてメモリ使用量やCPU過負荷プロセスを特定・停止するテクニック、リモートサーバーにも同様に適用可能。
  • イベントログ・監査ログの収集手段として、Get-EventLog(クラシック)、Get-WinEvent(ETW含む)を比較し、Securityログ監査の重要性を学んだ。
  • ログ分析スクリプトやレポート生成を行うことで、障害・セキュリティ侵害の早期発見やSIEM連携が実務上効果的である点を理解。
  • 最後に、ビジネスクリティカルサービスの安定化やランサムウェア対策など、サービス・ログ監査がどのように現実的な運用課題を解決するかを具体的に示した。

8-2. 次章へのつながり

  • 次章(第10章)では、セキュリティ強化とコンプライアンスの自動化に焦点を当てます。
  • 本章で解説したログ収集・サービス監査の仕組みは、セキュリティ面での脆弱性追跡コンプライアンス遵守(例: GDPR, PCI DSS)に直結する重要要素です。
  • 次章では、高度な監査ログ設定やSIEMとの連携ACL管理パスワードポリシーなどをスクリプト化する手法をさらに深掘りし、組織のセキュリティ・コンプライアンスレベルを一段上げることを目指します。