about_Logging_Windows

簡単な説明

PowerShell は、エンジン、プロバイダー、コマンドレットからの内部操作を Windows イベント ログに記録します。

詳細な説明

PowerShell では、エンジンとプロバイダーの開始と停止、PowerShell コマンドの実行など、PowerShell 操作に関する詳細がログに記録されます。

Windows PowerShell 5.1 でのログ記録の詳細については、about_Loggingを参照してください

PowerShell では、次の 2 つのカテゴリのログ記録の構成がサポートされています。

  • モジュール ログ - 指定されたモジュールのメンバーのパイプライン実行イベントを記録します。 モジュールのログ記録は、セッションと特定のモジュールの両方で有効にする必要があります。 このログの構成の詳細については、about_PowerShell_Configを参照してください

    構成によってモジュール のログ記録が有効になっている場合は、モジュールの LogPipelineExecutionDetails プロパティの値を設定することで、セッション内の特定のモジュールのログ記録を有効または無効にすることができます。

    たとえば、PSReadLine モジュールのモジュール ログ記録を 有効にするには、次のようにします

    $psrl = Get-Module PSReadLine
    $psrl.LogPipelineExecutionDetails = $true
    Get-Module PSReadline | Select-Object Name, LogPipelineExecutionDetails
    
    Name       LogPipelineExecutionDetails
    ----       ---------------------------
    PSReadLine                        True
    
  • スクリプト ブロックのログ記録 - 対話形式で呼び出された場合でも、自動化を介して呼び出された場合でも、コマンド、スクリプト ブロック、関数、スクリプトの処理を記録します。

    スクリプト ブロック ログを有効にすると、PowerShell は処理するすべてのスクリプト ブロックの内容を記録します。 有効にすると、新しい PowerShell セッションによってこの情報がログに記録されます。 詳細については、「スクリプト ブロック ログの有効化」を参照してください

Windows での PowerShell イベント プロバイダーの登録

Linux または macOS とは異なり、Windows では、イベントをイベント ログに書き込む前にイベント プロバイダーを登録する必要があります。 PowerShell イベント プロバイダーを有効にするには、管理者特権の PowerShell プロンプトから次のコマンドを実行します。

$PSHOME\RegisterManifest.ps1

Windows での PowerShell イベント ログ エントリの表示

PowerShell ログは、Windows イベント ビューアーを使用して表示できます。 イベント ログは、アプリケーション ログとサービス ログ グループにあり、PowerShellCore という名前です。 関連付けられている ETW プロバイダー GUID は .{f90714a8-5509-434a-bf6d-b1624c8a19a2}

スクリプト ブロック ログが有効になっている場合、PowerShell は次のイベントを PowerShellCore/Operational ログに記録します。

フィールド
EventId 4104 / 0x1008
チャネル Operational
Level Verbose
オペコード Create
タスク CommandStart
Keyword Runspace

Windows での PowerShell イベント プロバイダーの登録解除

イベント プロバイダーを登録すると、イベントのデコードに使用されるバイナリ ライブラリにロックが設定されます。 このライブラリを更新するには、このロックを解除するためにプロバイダーの登録を解除する必要があります。

PowerShell プロバイダーの登録を解除するには、管理者特権の PowerShell プロンプトから次のコマンドを実行します。

$PSHOME\RegisterManifest.ps1 -Unregister

PowerShell を更新した後、実行 $PSHOME\RegisterManifest.ps1 して更新されたイベント プロバイダーを登録します。

スクリプト ブロックログの有効化

スクリプト ブロック ログを有効にすると、PowerShell は処理するすべてのスクリプト ブロックの内容を記録します。 有効にすると、新しい PowerShell セッションによってこの情報がログに記録されます。

Note

診断以外の目的でスクリプト ブロック ログを使用する場合は、以下で説明するように、保護されたイベント ログを有効にすることをお勧めします。

スクリプト ブロック ログは、グループ ポリシーまたはレジストリ設定を使用して有効にすることができます。

グループ ポリシーの使用

自動文字起こしを有効にするには、グループ ポリシーで PowerShell スクリプト ブロック ログ機能を有効にするには、管理テンプレート ->PowerShell Core を使用します。

レジストリを使用する

次の関数を実行します。

function Enable-PSScriptBlockLogging {
    $basePath = @(
        'HKLM:\Software\Policies\Microsoft'
        'PowerShellCore\ScriptBlockLogging'
    ) -join '\'

    if (-not (Test-Path $basePath)) {
        $null = New-Item $basePath -Force
    }

    Set-ItemProperty $basePath -Name EnableScriptBlockLogging -Value "1"
}

PowerShell 構成ファイルの使用

PowerShell の ScriptBlockLogging 動作を powershell.config.json 制御するオプションをファイルで設定できます。 詳細については、「about_PowerSHell_Config」を参照してください

保護されたイベント ログ

システムのログ記録レベルを上げると、ログに記録されたコンテンツに機密データが含まれる可能性が高くなります。 たとえば、スクリプト ログを有効にすると、スクリプトで使用される資格情報やその他の機密データをイベント ログに書き込むことができます。 機密データをログに記録したマシンが侵害された場合、ログは攻撃者にリーチの拡大に必要な情報を提供する可能性があります。

この情報を保護するために、Windows 10 では保護されたイベント ログが導入されています。 保護されたイベント ログにより、参加しているアプリケーションは、イベント ログに書き込まれた機密データを暗号化できます。 後で、より安全で一元化されたログ コレクターでこれらのログの暗号化を解除して処理できます。

イベント ログのコンテンツは、IETF 暗号化メッセージ構文 (CMS) 標準を使用して保護されます。 CMS では公開キー暗号化が使用されます。 コンテンツの暗号化とコンテンツの暗号化解除に使用されるキーは、個別に保持されます。

公開キーは広く共有でき、機密データではありません。 この公開キーで暗号化されたコンテンツは、秘密キーによってのみ復号化できます。 公開キー暗号化の詳細については、「Wikipedia - 公開キー暗号化」を参照してください

保護されたイベント ログ ポリシーを有効にするには、保護するイベント ログ データを持つすべてのマシンに公開キーをデプロイします。 対応する秘密キーは、中央のイベント ログ コレクターや SIEM アグリゲーターなど、より安全な場所でイベント ログを後処理するために使用されます。 Azure で SIEM を設定できます。 詳細については、「汎用 SIEM 統合」を参照してください

グループ ポリシーを使用した保護されたイベント ログの有効化

保護されたイベント ログを有効にするには、次を使用して Enable Protected Event Logging グループ ポリシーの機能を Administrative Templates -> Windows Components -> Event Logging有効にします。 この設定には暗号化証明書が必要です。暗号化証明書は、次のいずれかの形式で指定できます。

  • Base-64 でエンコードされた X.509 証明書の内容 (たとえば、証明書マネージャーの Export オプションによって提供されます)。
  • ローカル コンピューターの証明書ストアにある証明書の拇印 (PKI インフラストラクチャによって展開できます)。
  • 証明書への完全なパス (ローカルまたはリモート共有を指定できます)。
  • 証明書または証明書を含むディレクトリへのパス (ローカルまたはリモート共有を指定できます)。
  • ローカル コンピューターの証明書ストアにある証明書のサブジェクト名 (PKI インフラストラクチャによって展開できます)。

結果の証明書には Document Encryption 、拡張キー使用法 (1.3.6.1.4.1.311.80.1)、 Data Encipherment または Key Encipherment いずれかのキー使用法が有効になっている必要があります。

警告

秘密キーは、イベントをログ記録するマシンに展開しないでください。 メッセージを復号化する安全な場所に保持する必要があります。

保護されたイベント ログ メッセージの暗号化を解除する

次のスクリプトは、秘密キーがあると仮定して、イベントを取得および復号化します。

Get-WinEvent Microsoft-Windows-PowerShell/Operational |
    Where-Object Id -eq 4104 |
    Unprotect-CmsMessage

関連項目