Como usar o Controle de Aplicativos para proteger o PowerShell

Este artigo descreve como configurar uma política de Controle de Aplicativos para Empresas . Você pode configurar a política para impor ou auditar a regra da política. No modo de auditoria, o comportamento do PowerShell não é alterado, mas registra as mensagens da ID do Evento 16387 no log de eventos do PowerShellCore/Analytic. No modo de imposição, o PowerShell aplica as restrições da política.

Este artigo pressupõe que você esteja usando um computador de teste para que possa testar o comportamento do PowerShell em uma política de Controle de Aplicativos em todo o computador antes de implantar a política em seu ambiente.

Criar uma política de Controle de Aplicativos

Uma política de Controle de Aplicativos é descrita em um arquivo XML, que contém informações sobre opções de política, arquivos permitidos e certificados de assinatura reconhecidos pela política. Quando a política é aplicada, somente arquivos aprovados podem ser carregados e executados. O PowerShell bloqueia a execução de arquivos de script para aprovação ou os executa no modo ConstrainedLanguage, dependendo das opções da política.

Você cria e manipula a política do Controle de Aplicativos usando o módulo ConfigCI , que está disponível em todas as versões do Windows com suporte. Este módulo do Windows PowerShell pode ser usado no Windows PowerShell 5.1 ou no PowerShell 7 via camada de Compatibilidade do Windows. É mais fácil usar esse módulo no Windows PowerShell. A política que você cria pode ser aplicada a qualquer versão do PowerShell.

Etapas para criar uma política de Controle de Aplicativos

Para fins de teste, basta criar uma política-padrão e um certificado de autenticação de código autoassinado.

  1. Criar uma política padrão

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

    Esse comando cria um arquivo de política-padrão chamado SystemCIPolicy.xml, que permite que todos os arquivos assinados por código da Microsoft sejam executados.

    Observação

    A execução desse comando pode levar até duas horas porque ele deve verificar todo o computador de teste.

  2. Desabilitar o modo de auditoria na política padrão

    Uma nova política é sempre criada no modo Audit. Para testar a imposição de políticas, você precisa desabilitar o modo de auditoria ao aplicar a política. Edite o arquivo SystemCIPolicy.xml usando um editor de texto como notepad.exe ou Visual Studio Code (VS Code). Comente a opção Audit mode.

    <!--
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    -->
    
  3. Criar um certificado de autenticação de código autoassinado

    Você precisa de um certificado de autenticação de código para assinar qualquer binário de teste ou arquivo de script que deseja executar em seu computador de teste. O New-SelfSignedCertificate é fornecido pelo módulo PKI. Para obter os melhores resultados, execute esse comando no 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. Adicionar o certificado de autenticação de código à política

    Use o comando a seguir para adicionar o novo certificado de autenticação de código à política.

    Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath c:\certs\signing.cer -User
    
  5. Converter o arquivo de política XML em um arquivo binário de imposição de política

    Por fim, você precisa converter o arquivo XML em um arquivo binário usado pelo Controle de Aplicativos para aplicar uma política.

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. Aplicar a política de Controle de Aplicativos

    Para aplicar a política à sua máquina de teste, copie o arquivo SIPolicy.p7b para a localização do sistema necessário, C:\Windows\System32\CodeIntegrity.

    Observação

    Algumas definições de políticas devem ser copiadas para uma subpasta, como C:\Windows\System32\CodeIntegrity\CiPolicies. Para obter mais informações, consulte Dicas e problemas conhecidos do administrador do App Control.

  7. Desativar a política de Controle de Aplicativos

    Para desabilitar a política, renomeie o arquivo SIPolicy.p7b. Se você precisar fazer mais testes, poderá alterar o nome de volta para reabilitar a política.

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

Testar usando a auditoria de política do Controle de Aplicativos

O PowerShell 7.4 adicionou um novo recurso para dar suporte a políticas de Controle de Aplicativos no modo de auditoria . No modo de auditoria, o PowerShell executa os scripts não confiáveis no modo ConstrainedLanguage sem mostrar erros, mas registra as mensagens no log de eventos. As mensagens de log descrevem quais restrições seriam aplicadas se a política estivesse no modo de imposição.

Exibir eventos de auditoria

O PowerShell registra eventos de auditoria no log de eventos do PowerShellCore/Analytic. O log não está habilitado por padrão. Para habilitar o log, abra o Visualizador de Eventos do Windows, clique com o botão direito no log PowerShellCore/Analytic e selecione Habilitar Log.

Como alternativa, você pode executar o comando a seguir em uma sessão do PowerShell com privilégios elevados.

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

Você pode exibir os eventos no Visualizador de Eventos do Windows ou usar o cmdlet Get-WinEvent para recuperar os eventos.

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

A mensagem de evento inclui a posição do script em que a restrição seria aplicada. Essas informações ajudam você a entender onde você precisa alterar seu script para que ele seja executado na política de Controle de Aplicativos.

Importante

Depois de examinar os eventos de auditoria, você deve desabilitar o log analítico. Os logs analíticos crescem rapidamente e consomem grandes quantidades de espaço em disco.

Exibir eventos de auditoria no depurador do PowerShell

Se você configurar a variável $DebugPreference como Break para uma sessão interativa do PowerShell, o PowerShell invadirá o depurador de script da linha de comando no local atual no script em que o evento de auditoria ocorreu. O ponto de interrupção permite que você depure seu código e inspecione o estado atual do script em tempo real.