共用方式為


如何使用應用程控來保護 PowerShell

本文說明如何設定 商務 用應用程控原則。 您可以設定原則來強制執行或稽核原則的規則。 在稽核模式中,PowerShell 行為不會變更,但會將事件標識碼 16387 訊息記錄到 PowerShellCore/Analytic 事件記錄檔。 在強制模式中,PowerShell 會套用原則的限制。

本文假設您使用的是測試計算機,以便在環境中部署原則之前,先在全機器應用程控原則下測試 PowerShell 行為。

建立應用程控原則

XML 檔案會說明應用程控原則,其中包含原則所辨識的原則選項、允許的檔案,以及簽署憑證的相關信息。 套用原則時,只允許已核准的檔案載入和執行。 根據原則選項,PowerShell 會封鎖未核准的腳本檔案執行或以 ConstrainedLanguage 模式執行。

您可以使用 ConfigCI 模組來建立及操作應用程控原則,此模組適用於所有支援的 Windows 版本。 此 Windows PowerShell 模組可在 Windows PowerShell 5.1 或 PowerShell 7 中透過 Windows 相容性 層使用。 在 Windows PowerShell 中使用此課程模組會更容易。 您所建立的原則可以套用至任何版本的 PowerShell。

建立應用程控原則的步驟

若要進行測試,您只需要建立默認原則和自我簽署的程式代碼簽署憑證。

  1. 建立默認原則

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

    此命令會建立稱為 SystemCIPolicy.xml 的默認原則檔案,允許所有Microsoft程式代碼簽署的檔案執行。

    注意

    執行此命令最多可能需要兩個小時,因為它必須掃描整個測試計算機。

  2. 在默認原則中停用稽核模式

    新原則一律會在模式中 Audit 建立。 若要測試原則強制執行,您必須在套用原則時停用稽核模式。 SystemCIPolicy.xml使用或 Visual Studio Code 之類的notepad.exe文字編輯器來編輯檔案(VS Code)。 將選項批註化 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 檔案轉換成應用程控用來套用原則的二進位檔。

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. 套用應用程控原則

    若要將原則套用至您的測試電腦,請將檔案複製到SIPolicy.p7b所需的系統位置 C:\Windows\System32\CodeIntegrity

    注意

    某些原則定義必須複製到子資料夾,例如 C:\Windows\System32\CodeIntegrity\CiPolicies。 如需詳細資訊,請參閱 應用程控系統管理員秘訣和已知問題

  7. 停用應用程控原則

    若要停用原則,請重新命名 SIPolicy.p7b 檔案。 如果您需要進行更多測試,您可以將名稱變更回重新允許原則。

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

使用應用程控原則稽核進行測試

PowerShell 7.4 新增了新功能,以支援稽核模式中的應用程控原則。 在稽核模式中,PowerShell 會在模式中 ConstrainedLanguage 執行不受信任的腳本,而不會發生錯誤,而是將訊息記錄至事件記錄檔。 記錄訊息描述如果原則處於 強制 模式,將會套用哪些限制。

檢視稽核事件

PowerShell 會將稽核事件記錄到 PowerShellCore/Analytic 事件記錄檔。 預設不會啟用記錄檔。 若要啟用記錄檔,請開啟 Windows 事件檢視器,以滑鼠右鍵按兩下 PowerShellCore/Analytic 記錄,然後選取 [啟用記錄]。

或者,您可以從提升許可權的 PowerShell 工作階段執行下列命令。

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

您可以在 Windows 事件檢視器 中檢視事件,或使用 Get-WinEvent Cmdlet 來擷取事件。

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 會在腳本中發生稽核事件的目前位置中斷至命令行腳本調試程式。 斷點可讓您對程式代碼進行偵錯,並即時檢查腳本的目前狀態。