Firmar scripts de PowerShell con un certificado digital interno (ES-es)
Cuando queremos ejecutar scripts de PowerShell encontramos que el Sistema Operativo por defecto deniega esta operación, por temas de seguridad la política de ejecución se encuentra restringida (Restricted), esto podemos observarlo rápidamente si ejecutamos:
Get-ExecutionPolicy
La siguiente imagen muestra el error al intentar ejecutar un script y la política en ejecución:
https://jesuspenaranda.files.wordpress.com/2014/08/exec-restricted2.jpg
Políticas de Ejecución de PowerShell
PowerShell tiene cuatro políticas de ejecución:
- Restricted, no permite la ejecución de scripts
- AllSigned, todos los scripts deben estar firmados por un publicador de confianza
- RemoteSigned, los scripts descargados deben estar firmados por un publicador de confianza
- Unrestricted, No hay restricciones, todos los scripts se pueden ejecutar
El factor Seguridad
Aunque probablemente lo mas simple sea cambiar la política de ejecución a Unrestricted o RemoteSigned, debemos tomar en cuenta los riesgos a los que esto nos expone, por un lado la política Unrestricted permitirá la ejecución de cualquier script descargado quizá desde un origen poco confiable, abriendo así la posibilidad de estar ejecutando no solo lo que esperamos, sino también alguna desagradable sorpresa, por el otro lado la política RemoteSigned que parece mas segura porque evita que scripts descargados se ejecuten, tiene el riesgo de que cualquier script que no haya sido evaluado o aprobado sea ejecutado causando problemas en sistemas productivos.
El escenario ideal
Con todo lo antes dicho, resulta evidente que lo mejor para la seguridad de nuestros entornos de trabajo es que la política de ejecución este configurada en AllSigned, para esto, será necesario utilizar un certificado digital con el propósito de firmar código y que además sea publicador de confianza en todos nuestros sistemas.
El proceso de creación del Certificado Digital para la firma de scripts
Lo primero es que en la organización se haya instalado una entidad certificadora de confianza, como los scripts que se escribirán y ejecutarán son para el ámbito interno, utilizaremos un CA instalado como Enterprise en un sistema operativo Windows, una gran ventaja de esto es que nos aseguramos que todos los equipos y usuarios del AD confiarán automáticamente en este ente emisor. El proceso de instalación del Rol ADCS es realmente muy sencillo, en este enlace Instalar CA Windows se detallan los pasos. Una vez instalado el servicio:
1. Editar el template de certificado “Code Signing“, desde la consola del CA, seleccionamos “Certificate Templates“, le damos clic derecho y seleccionamos “Manage“, con esto abriremos la consola de templates, ubicamos el template “Code Signing” e ingresamos a sus propiedades, en el tab “Security” agregamos al usuario o grupo de usuarios que recibirán el certificado para firma de código, este certificado debe ser enrolado por una persona o grupo de personas de confianza quienes se encargarán de revisar los scripts y luego proceder a firmarlos, para propósitos de esta demostración utilizaremos al administrador, los permisos a otorgar son “Read” y “Enroll“
2. Publicar el certificado “Code Signing“, para esto vamos nuevamente a la consola del CA, buscamos “Certificate Templates“, damos clic derecho y seleccionamos “New/ “Certificate Template to Issue” y buscamos de la lista el certificado “Code Signing“
3. Una vez publicado el template, iniciamos sesión con la cuenta del usuario que enrolara el certificado digital para firma de código, iniciamos una consola MMC en blanco, agregamos el snap-in “Certificates” y seleccionamos “My user account“
https://jesuspenaranda.files.wordpress.com/2014/08/enroll_codesigning.jpg
4. Desde la consola de certificados de usuario, seleccionamos “Personal“, le damos clic derecho, seleccionamos “All Tasks” y “Request New Certificate..”
5. En el asistente de enrolamiento de certificado buscaremos en el CA interno el template de certificado “Code Signing“, lo seleccionaremos y daremos clic en “Details” editamos las propiedades y nos aseguramos de marcar la opción “Mark Private Key Exportable” desde la ficha “Private Key”
6. Luego de esto, damos OK para aceptar el cambio de las propiedades y presionamos el botón “Enroll“, empezará el proceso de enrolamiento del certificado digital quedando instalado correctamente según se muestra en la siguiente imagen. Con esto finalizamos la creación del certificado digital para firmar nuestros scripts.
Publicar el certificado para firma de código en el Active Directory
Una vez que hemos enrolado el certificado digital que utilizaremos para la firma de scripts, será necesario agregarlo como publicador de confianza desde el Active Directory, esto nos permitirá que la ejecución de scripts firmados por este certificado sean aceptados por todos los equipos desde donde se realice la ejecución, para propósitos de esta demostración utilizare una política de grupo GPO que vinculare a nivel de Dominio.
1. Exportar el certificado digital para firma de código, desde la consola MMC con el snap-in de certificados desde donde hicimos el enrolamiento, seleccionamos el certificado, le damos clic derecho y seleccionamos “Export“
- Se iniciará un asistente, dejamos las opciones por defecto y seleccionamos una ruta de destino para exportar el certificado (como notarán, no es necesario llevar la llave privada), es necesario tomar nota de la ubicación del certificado una vez exportado.
- Iniciamos la consola Group Policy Management desde un Controlador de Dominio o un servidor con el feature “Group Policy Management Console” instalado, para crear nuestra política de grupo (GPO), crearemos una GPO nueva con un clic derecho en el nombre del dominio y seleccionando “Create a GPO in this domain, and Link it here“, le colocamos un nombre adecuado y clic en OK
- Buscamos en la política la ruta “Computer Configuration/Policies/Windows Settings/Security Settings/Public Key Policies/Trusted Publishers” aquí damos clic derecho y seleccionamos “Import“
5. Buscamos el certificado de firma de código que exportamos anteriormente y lo importamos en la política, en la próxima secuencia de actualización de políticas de grupo, todos los equipos del dominio agregarán este certificado como publicador de confianza
- Una vez actualizada la política de grupo deberíamos encontrar en la lista de publicadores de confianza de cualquier equipo el certificado que importamos en el Active Directory
https://jesuspenaranda.files.wordpress.com/2014/08/trustedpublishers.jpg
En este punto, ya estamos listos para cambiar la política de ejecución de PowerShell a “AllSigned” y firmar nuestros scripts.
**
Cambiando la política de ejecución de PowerShell y firmando los scripts**
1. Lo primero que haremos es cambiar la política de ejecución de PowerShell a AllSigned, para esto usaremos el cmdlet
Set-ExecutionPolicy -AllSigned
Luego aceptaremos el cambio con un "Y".
2. Ahora firmaremos digitalmente el script que intentamos ejecutar al principio de esta demostración, para esto usaremos dos líneas de comandos, la primera para cargar el certificado digital y la segunda para firmar el script
$cert=(dir cert:currentuser\my\ -CodeSigningCert)
Set-AuthenticodeSignature '.\ListComputer.ps1' $cert
https://jesuspenaranda.files.wordpress.com/2014/08/firmarscript.jpg
- Editamos el script desde el bloc de notas y veremos la firma digital como parte del archivo
https://jesuspenaranda.files.wordpress.com/2014/08/firmarscript2.jpg
- Para terminar la demostración ejecutaremos el script y veremos que PowerShell lo procesa normalmente.
https://jesuspenaranda.files.wordpress.com/2014/08/firmarscript3.jpg
Como ven, esto es algo que puede hacerse sin mucha complicación y nos permite trabajar con un entorno seguro en la creación y ejecución de scripts para nuestro querido PowerShell.