In questo articolo andremo a vedere come creare un certificato personale per firmare digitalmente uno script PowerShell per permettere la sua esecuzione in ambienti particolarmente restrittivi. L’esecuzione di script PowerShell è normalmente disattivata, permettere l’esecuzione di tutti gli script può non essere la soluzione più adatta, in termini di sicurezza, magari possiamo scegliere un approccio più morbido per eseguire script firmati da noi.
Non ho modo di sapere se questa soluzione possa funzionare in tutti gli ambienti, dove ci sono policy aziendali molto restrittive o antivirus particolarmente “paranoici”, non vi resta che provare.
Creazione del certificato
Per creare un certificato bisogna usare questo comando:
New-SelfSignedCertificate -DnsName turbolab@turbolab.it -CertStoreLocation Cert:\CurrentUser\My\ -FriendlyName "MyCert" -NotAfter (Get-Date).AddYears(10) -KeyLength 4096 -Type Codesigning
Per vedere se è effettivamente presente tra i certificati personali si utilizza questo comando:
Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert
Il dato che ci serve, per esportare il certificato e creare un file .cer, è il Thumbprint da inserire in questo comando:
Export-Certificate -Cert Cert:\CurrentUser\My\Inserire_Il_Thumbprint -FilePath d:\certificato.cer
Nome del file e destinazione dove salvarlo li potete modificare a vostra scelta.
Bisogna ora importare il certificato come Autorità di certificazione attendibile e poi come Autore attendibile.
Import-Certificate -CertStoreLocation Cert:\LocalMachine\TrustedPublisher -FilePath d:\certificato.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath d:\certificato.cer
Quando ho provato a importare il certificato in un computer diverso da quello dove l’avevo creato, inizialmente avevo il file del certificato su una pendrive e ottenevo un errore di accesso negato quando tentavo l’importazione con i comandi appena visti. L’errore è stato superato quando ho copiato il file del certificato sul disco locale ed allora sono riuscito ad importare il file.
Una volta installato il certificato cambieranno anche le sue informazioni.
Ora possiamo firmare digitalmente il nostro script PowerShell:
Set-AuthenticodeSignature -FilePath d:\turbolab.ps1 -Certificate (Get-ChildItem -Path Cert:\CurrentUser\My\ Inserire_Il_Thumbprint)
Andando a verificare le proprietà del file ci sarà ora la firma digitale.
I criteri di esecuzione script
Per modificare i criteri di esecuzione di PowerShell, in modo da consentire solo gli script firmati, bisogna consultare questo articolo.
Il commando Set-ExecutionPolicy AllSigned
permette di eseguire solo script firmati digitalmente, mentre se eseguo lo scriptnonfirmato.ps1 questo viene bloccato.
Per eseguire uno script Powershell non firmato digitalmente dovrei usare Set-ExecutionPolicy unrestricted
.