次の方法で共有


App Control を使用して PowerShell をセキュリティで保護する方法

この記事では、App Control for Business ポリシーを設定する方法について説明します。 ポリシーの規則を適用または監査するようにポリシーの構成ができます。 監査モードで、PowerShell の動作は変更されませんが、イベント ID 16387 メッセージを PowerShellCore/Analytic イベント ログに記録します。 強制モードで、PowerShell によってポリシーの制限が適用されます。

この記事では、環境にポリシーを展開する前に、コンピューター全体のアプリコントロール ポリシーで PowerShell の動作をテストできるように、テスト マシンを使用していることを前提としています。

アプリ制御ポリシーを作成する

アプリ制御ポリシーは、ポリシー オプション、許可されているファイル、およびポリシーによって認識される署名証明書に関する情報を含む XML ファイルで記述されます。 ポリシーが適用されると、承認されたファイルのみが読み込みと実行が許可されます。 PowerShell は、承認されていないスクリプト ファイルの実行をブロックする、または、ポリシー オプションに応じて ConstrainedLanguage モードで実行します。

サポートされているすべての Windows バージョンで使用できる ConfigCI モジュールを使用して、アプリ制御ポリシーを作成および操作します。 この Windows PowerShell モジュールは、Windows PowerShell 5.1 または PowerShell 7 で、Windows 互換性レイヤーで使用ができます。 Windows PowerShell では、このモジュールを使用する方が簡単です。 作成したポリシーは、任意のバージョンの PowerShell に適用できます。

アプリ制御ポリシーを作成する手順

テストでは、既定のポリシーと自己署名コード署名証明書の作成のみで済みます。

  1. 既定のポリシーを作成する

    New-CIPolicy -Level PcaCertificate -FilePath .\SystemCIPolicy.xml -UserPEs
    

    このコマンドにより、すべての Microsoft コード署名ファイルを実行できる SystemCIPolicy.xml という既定のポリシー ファイルを作成します。

    Note

    テスト マシン全体をスキャンする必要があるため、このコマンドの実行には最大 2 時間かかる場合があります。

  2. 既定のポリシーで監査モードを無効にする

    新しいポリシーは常に Audit モードで作成されます。 ポリシーの適用をテストするには、ポリシーを適用するときに監査モードを無効にすることが必要です。 notepad.exe や Visual Studio Code (VS Code) などのテキスト エディターを使用して、SystemCIPolicy.xml ファイルの編集をします。 Audit mode オプションをコメント アウトします。

    <!--
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    -->
    
  3. 自己署名証明書を作成する

    テスト コンピューターで実行するテスト バイナリまたはスクリプト ファイルに署名するには、コード署名証明書が必要となります。 New-SelfSignedCertificate は、PKI モジュールによって提供されます。 最良の結果を得るには、Windows PowerShell 5.1 でこのコマンドを実行することが必要です。

    $newSelfSignedCertificateSplat = @{
        DnsName = $env:COMPUTERNAME
        CertStoreLocation = "Cert:\CurrentUser\My\"
        Type = 'CodeSigningCert'
    }
    $cert = New-SelfSignedCertificate @newSelfSignedCertificateSplat
    Export-Certificate -Cert $cert -FilePath c:\certs\signing.cer
    Import-Certificate -FilePath C:\certs\signing.cer -CertStoreLocation "Cert:\CurrentUser\Root\"
    $cert = Get-ChildItem Cert:\CurrentUser\My\ -CodeSigningCert
    
    dir c:\bin\powershell\pwsh.exe | Set-AuthenticodeSignature -Certificate $cert
    
  4. コード署名証明書をポリシーに追加する

    次のコマンドを使用して、新しいコード署名証明書をポリシーに追加します。

    Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath c:\certs\signing.cer -User
    
  5. XML ポリシー ファイルをポリシー強制バイナリ ファイルに変換します

    最後に、ポリシーを適用するには、XML ファイルを App Control で使用されるバイナリ ファイルに変換する必要があります。

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. アプリ制御ポリシーを適用する

    テスト マシンにポリシーの適用には、SIPolicy.p7b ファイルを必要なシステムの場所 (C:\Windows\System32\CodeIntegrity) にコピーします。

    Note

    一部のポリシー定義は、C:\Windows\System32\CodeIntegrity\CiPolicies などのサブフォルダーにコピーすることが必要です。 詳細については、「アプリ コントロールの管理に関するヒント」 > 「既知の問題」を参照してください

  7. アプリ制御ポリシーを無効にする

    ポリシーの無効には、SIPolicy.p7b ファイルの名前を変更します。 さらにテストを行う必要がある場合には、ポリシーを再び適用できるように名前を変更できます。

    Rename-Item -Path .\SIPolicy.p7b -NewName .\SIPolicy.p7b.off
    

App Control ポリシーの監査を使用してテストする

PowerShell 7.4 では、監査モードでアプリ制御ポリシーをサポートする新機能が追加されました。 監査モードでは、PowerShellは ConstrainedLanguage のエラーなしで信頼されていないスクリプトを実行しますが、代わりにイベントログにメッセージを記録します。 ログ メッセージには、ポリシーが強制モードであれば適用される制限が示されています。

監査イベントの表示

PowerShell は、監査イベントを PowerShellCore/Analytic イベント ログに記録します。 ログは既定で有効になっていません。 [Windows イベント ビューアー] で分析ログを有効にするには、[PowerShellCore/Analytic] ログを右クリックして、[ログの有効化] を選びます。

または、管理者権限のある PowerShell セッションから次のコマンドを実行することもできます。

wevtutil.exe sl PowerShellCore/Analytic /enabled:true /quiet

Windows イベント ビューアーでイベントを表示したり、Get-WinEvent コマンドレットを使ってイベントを取得したりできます。

Get-WinEvent -LogName PowerShellCore/Analytic -Oldest |
    Where-Object Id -eq 16387 | Format-List
TimeCreated  : 4/19/2023 10:11:07 AM
ProviderName : PowerShellCore
Id           : 16387
Message      : App Control Audit.

    Title: Method or Property Invocation
    Message: Method or Property 'WriteLine' on type 'System.Console' invocation will not
        be allowed in ConstrainedLanguage mode.
        At C:\scripts\Test1.ps1:3 char:1
        + [System.Console]::WriteLine("pwnd!")
        + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    FullyQualifiedId: MethodOrPropertyInvocationNotAllowed

イベント メッセージには、制限が適用されるスクリプトの位置が含まれます。 この情報は、アプリ制御ポリシーで実行されるようにスクリプトを変更する必要がある場所を理解するのに役立ちます。

重要

監査イベントの確認が済んだら、分析ログを無効にする必要があります。 分析ログは急速に大きくなり、大量のディスク領域を消費します。

PowerShell デバッガーでの監査イベントの表示

対話形式の PowerShell セッションで $DebugPreference 変数を Break に設定すると、PowerShell は、監査イベントが発生したスクリプトの現在の場所で、コマンド ライン スクリプト デバッガーに割り込みます。 ブレークポイントを設定すると、コードのデバッグやスクリプトの現在の状態をリアルタイムで確認することができます。