Uso de App Control para proteger PowerShell
En este artículo se describe cómo configurar una directiva de Control de aplicaciones para empresas . Puede configurar la directiva para aplicar o auditar la regla de la directiva. En el modo de auditoría, el comportamiento de PowerShell no cambia, pero registra los mensajes de id. de evento 16387 en el registro de eventos PowerShellCore/Analytic
. En el modo de cumplimiento, PowerShell aplica las restricciones de la directiva.
En este artículo se da por supuesto que usa una máquina de prueba para que pueda probar el comportamiento de PowerShell en una directiva de Control de aplicaciones para toda la máquina antes de implementar la directiva en su entorno.
Creación de una directiva de Control de aplicaciones
Una directiva de Control de aplicaciones se describe en un archivo XML, que contiene información sobre las opciones de directiva, los archivos permitidos y los certificados de firma reconocidos por la directiva. Cuando se aplica la directiva, solo se permite cargar y ejecutar archivos aprobados. PowerShell impide que los archivos de script no aprobados se ejecuten o los ejecuten en modo ConstrainedLanguage
, en función de las opciones de directiva.
Puede crear y manipular la directiva de Control de aplicaciones mediante el módulo ConfigCI , que está disponible en todas las versiones de Windows compatibles. Este módulo de Windows PowerShell se puede usar en Windows PowerShell 5.1 o en PowerShell 7 mediante la capa Compatibilidad de Windows. Es más fácil usar este módulo en Windows PowerShell. La directiva que cree se puede aplicar a cualquier versión de PowerShell.
Pasos para crear una directiva de Control de aplicaciones
Para las pruebas, solo tiene que crear una directiva predeterminada y un certificado de firma de código autofirmado.
Crear una directiva predeterminada
New-CIPolicy -Level PcaCertificate -FilePath .\SystemCIPolicy.xml -UserPEs
Este comando crea un archivo de directiva predeterminada denominado
SystemCIPolicy.xml
que permite que se ejecuten todos los archivos firmados por código de Microsoft.Nota:
La ejecución de este comando puede tardar hasta dos horas, ya que debe examinar toda la máquina de prueba.
Deshabilitar el modo auditoría en la directiva predeterminada
Siempre se crea una directiva en el modo
Audit
. Para probar la aplicación de la directiva, debe deshabilitar el modo auditoría al aplicarla. Edite el archivoSystemCIPolicy.xml
mediante un editor de texto comonotepad.exe
o Visual Studio Code (VS Code). Convierta en comentario la opciónAudit mode
.<!-- <Rule> <Option>Enabled:Audit Mode</Option> </Rule> -->
Crear un certificado de firma de código autofirmado
Necesita un certificado de firma de código para firmar los archivos binarios o de script de prueba que quiera ejecutar en la máquina de prueba. El módulo PKI proporciona
New-SelfSignedCertificate
. Para obtener los mejores resultados, debe ejecutar este comando en 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
Agregar el certificado de firma de código a la directiva
Use el siguiente comando para agregar el nuevo certificado de firma de código a la directiva.
Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath c:\certs\signing.cer -User
Convertir el archivo de directiva XML en un archivo binario de aplicación de directivas
Por último, debe convertir el archivo XML en un archivo binario usado por App Control para aplicar una directiva.
ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
Aplicación de la directiva de Control de aplicaciones
Para aplicar la directiva a la máquina de prueba, copie el archivo
SIPolicy.p7b
en la ubicación del sistema necesaria,C:\Windows\System32\CodeIntegrity
.Nota:
Algunas definiciones de directivas deben copiarse en una subcarpeta como
C:\Windows\System32\CodeIntegrity\CiPolicies
. Para obtener más información, consulte Sugerencias para administradores de control de aplicaciones y problemas conocidos.Deshabilitar la directiva de Control de aplicaciones
Para deshabilitar la directiva, cambie el nombre del archivo
SIPolicy.p7b
. Si necesita realizar más pruebas, puede volver a cambiar el nombre para volver a habilitar la directiva.Rename-Item -Path .\SIPolicy.p7b -NewName .\SIPolicy.p7b.off
Prueba mediante la auditoría de directivas de Control de aplicaciones
PowerShell 7.4 ha agregado una nueva característica para admitir directivas de Control de aplicaciones en modo auditoría . En este modo, PowerShell ejecuta sin errores los scripts que no son de confianza en el modo ConstrainedLanguage
, pero registra los mensajes en el registro de eventos en su lugar. Los mensajes del registro describen qué restricciones se aplicarían si la directiva estuviera en modo Aplicar.
Visualización de eventos de auditoría
PowerShell registra los eventos de auditoría en el registro de eventos PowerShellCore/Analytic. El registro está deshabilitado de manera predeterminada. Para habilitar el registro, abra el Visor de eventos de Windows, haga clic con el botón derecho en el registro PowerShellCore/Analytic y seleccione Habilitar registro.
Otra opción es ejecutar el siguiente comando desde una sesión de PowerShell con privilegios elevados.
wevtutil.exe sl PowerShellCore/Analytic /enabled:true /quiet
Puede ver los eventos en el Visor de eventos de Windows o usar el cmdlet Get-WinEvent
para recuperar los 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
El mensaje de evento incluye la posición del script en que se aplicaría la restricción. Esta información le ayuda a comprender dónde necesita cambiar el script para que se ejecute en la directiva de Control de aplicaciones.
Importante
Una vez que haya revisado los eventos de auditoría, debe deshabilitar el registro Analytic. Los registros Analytic crecen rápidamente y consumen grandes cantidades de espacio en disco.
Visualización de eventos de auditoría en el depurador de PowerShell
Si establece la variable $DebugPreference
en Break
para una sesión interactiva de PowerShell, PowerShell interrumpe el depurador de scripts de línea de comandos en la ubicación actual del script en que se produjo el evento de auditoría, lo que le permite depurar el código e inspeccionar el estado actual del script en tiempo real.