次の方法で共有


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 イベント ビューアーを使用して表示できます。 イベント ログは Application および Services Logs グループにあり、 PowerShellCore という名前です。 関連付けられている ETW プロバイダー GUID が {f90714a8-5509-434a-bf6d-b1624c8a19a2}

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

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

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

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

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

$PSHOME\RegisterManifest.ps1 -Unregister

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

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

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

Note

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

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

グループ ポリシーの使用

自動文字起こしを有効にするには、Administrative Templates ->PowerShell Core を使用して、グループ ポリシーの Turn on PowerShell Script Block Logging 機能を有効にします。

レジストリを使用する

次の関数を実行します。

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

保護されたイベント ログ

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

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

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

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

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

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

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

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

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

警告

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

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

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

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

関連項目