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 aplicar 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.

Políticas de Controle de Aplicativo

Uma política de Controle de Aplicativo é 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 impede a execução de arquivos de script não aprovados ou os executa no modo ConstrainedLanguage, dependendo das configurações de 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. Você pode usar esse módulo Windows PowerShell no Windows PowerShell 5.1 ou no PowerShell 7 por meio da 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 o local exigido no sistema, C:\Windows\System32\CodeIntegrity.

    Observação

    Você deve copiar algumas definições de política para uma subpasta, como C:\Windows\System32\CodeIntegrity\CiPolicies. Para obter mais informações, consulte [Dicas de administrador de controle de aplicativo &problemas conhecidos][03].

  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, pode alterar o nome novamente para reativar a política.

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

Teste usando a auditoria da política de 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 de análise. 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.

Configurações adicionais para o PowerShell

O Controle de Aplicativo dá suporte a configurações adicionais para o PowerShell.

  • BlockScriptOnPolicyFailure: essa configuração bloqueia a execução de scripts que não atendem aos requisitos de política de Controle de Aplicativo. Quando habilitado, o Controle de Aplicativo bloqueia qualquer script que não seja explicitamente permitido pela política em vez de executá-lo no modo ConstrainedLanguage .

    Observação

    Essa configuração é imposta pelo Controle de Aplicativo e se aplica a todas as versões do PowerShell (powershell.exe e pwsh.exe).

  • FileOnlyEntry: essa configuração impede que o PowerShell seja executado com argumentos que não resultam na execução de um arquivo especificado. Quando ativado, o Controle de Aplicativo bloqueia a execução de comandos do PowerShell que são passados por meio do pipeline, aos parâmetros -Command ou -EncodedCommand, ou em sessões interativas que permitem a execução direta de comandos. Quando habilitado, o PowerShell executa apenas scripts especificados com o -File parâmetro.

    Exemplos de execuções bloqueadas:

    pwsh
    pwsh -NoExit -File ./file.ps1
    pwsh -Command Get-ChildItem
    "Get-ChildItem" | pwsh -File -
    pwsh -EncodedCommand <base64-string>
    

    Exemplos de execuções permitidas:

    pwsh -File ./file.ps1
    pwsh -NoProfile -NonInteractive -File ./file.ps1 arg1 arg2
    

    Observação

    Essa configuração só se aplica ao PowerShell 7.7-preview.4 e versões mais recentes. Se você definir essa configuração para versões anteriores, o AppSetting será ignorado silenciosamente.

Para usar essas configurações, você deve adicioná-las ao arquivo XML da política de Controle de Aplicativo (SystemCIPolicy.xml). Abra o arquivo XML em um editor de texto e adicione a <AppSettings> seção da política. O exemplo a seguir mostra o <AppSettings> XML com ambas as configurações habilitadas.

<?xml version="1.0" encoding="utf-8"?>
<SiPolicy xmlns="urn:schemas-microsoft-com:sipolicy">

    <!-- Existing policy content -->

    <AppSettings>
        <AppSetting
            AppManifest="Powershell"
            Name="BlockScriptOnPolicyFailure"
            Value="true" />

        <AppSetting
            AppManifest="Powershell"
            Name="FileOnlyEntry"
            Value="true" />
    </AppSettings>

</SiPolicy>

Leitura adicional

  • [Dicas de administrador de controle de aplicativo e problemas conhecidos][03]
  • [Entender a aplicação de scripts no Controle de Aplicativos][02]
  • [Criar uma política de Controle de Aplicativo para dispositivos totalmente gerenciados][01]

[01]: /windows/security/application-security/application-control/app-control-for-business/design/create-App Control-policy-for-fully-managed-devices [02]: /windows/security/application-security/application-control/app-control-for-business/design/script-enforcement [03]: /windows/security/application-security/application-control/app-control-for-business/operations/known-issues