Powershell – Signer les scripts

Plutôt que d’abaisser la sécurité de votre infrastructure en autorisant l’exécution de tous les scripts Powershell :

Set-ExecutionPolicy Unrestricted

Il est possible d’autoriser uniquement l’exécution des scripts Powershell signés.

Set-ExecutionPolicy AllSigned

Pour signer vos scripts, la présence d’une CA au sein de votre infrastructure est obligatoire.

Un script signé peut être déplacé à condition de rester à portée de la chaine de certification. Mais assurer vous de na plus à avoir à modifier votre script avant de le signer. Si vous devez modifier un script signé, vous devrez le signer de nouveau.

Configurer la politique d'exécution de scripts Powershell

Par GPO :

Computer Configuration\Policies\Administrative Templates\Windows Components\Windows PowerShell\turn on Script Execution

Création du template de certificat dans la CA

Il est nécessaire de générer un nouveau template de cetificat afin de signer vos scripts « Code Signing ». Ouvrir une console MMC et importer la Snapp-in « Certification Authority » correspondant à la CA de votre entreprise.

Certificate Templates –> New –> Certificate Template to Issue

Dans la liste des templates de certificats, sélectionner le template « Code signing ». Il est possible d’éditer au préalable de template « Code signing » afin d’augmenter la durée de validité des certificats générés (12 mois par défaut).

Le modèle de certificat est maintenant disponible dans le magasin des templates de votre CA.

Création du certificat utilisateur pour signer les scripts :

Ouvrir une console MMC avec l’utilisateur souhaitant signer les scripts, ajouter la Snapp-in « certificates » de l’utilisateur courant.

De préférence réaliser cette demande depuis la machine d’où vous souhaitez signer vos scripts, cela évitera d’exporter le certificat vers et de l’importer sur d’autre machines.

Dans le magasin personnel, faire une demande de nouveau certificat « Request New Certificate… ».

Sélectionner « Code Signing » comme type de certificat. Il est possible d’éditer les propriétés du certificats, notamment pour renseigner un « frendly name », puis lancer l’enrollement.

Après quelques secondes, le nouveau certificat est créé.

Récupérer le certificat généré

A la suite de la création de certificat, ouvrir une console MMC avec l’utilisateur souhaitant signer les scripts, ajouter la Snapp-in « certificates » de l’utilisateur courant. Dans le magasin certificats personnel, le nouveau certificat est disponible. Réaliser un clic droit sur celui-ci, « All tasks » –> Export.

Réaliser l’export du certificat au format « DER… ».

Le nouveau certificat est désormais prêt, il peut être importé sur n’importe quelle machines qui devra signer un script.

Signer un script

Depuis une machine avec le certificat utilisateur est importé, ouvrir une console Powershell en administrateur.

#Liste les certificats de l'utilisateurs disponible pour signer du code :
Get-ChildItem cert:currentuser\my\ -CodeSigningCert | Select-Object *

#Selectionne le certificat souhaité en se basant sur la Thumbprint :
$cert=(Get-ChildItem cert:currentuser\my\ -CodeSigningCert | ?{$_.Thumbprint -eq "938DA3ED66EE14D6DDD00431EB28034CFCC3012C"})

#Signe le script avec le certificat précedement séléctionné :
Set-AuthenticodeSignature -FilePath "D:\HelloWorld.ps1" -Certificate $cert

Documentation de la commande Set-AuthenticodeSignature :

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-authenticodesignature?view=powershell-6

Le script est désormais signé.

Vérifier la signature d’un script

Il est possible de vérifier l’état de la signature d’un script via la commande Powerhell « Get-AuthenticodeSignature ».

Get-AuthenticodeSignature "D:\HelloWorld.ps1" -Verbose | Format-List

Supprimer l’avertissement lors de l’exécution :

Bien que les scripts soient désormais signés, lors de l’exécution, il subsiste toujours un message d’avertissement « Do you want to run software from this untrusted publisher?… », ce message stipule que l’utilisateur (Administrator dans ce cas ci) n’est pas reconnu par le système.

Il est nécessaire d’ajouter le certificat utilisateur (le certificat qui a signé le script) dans le magasin « Trusted Publishers » de la machine qui exécute le script.

Il y a deux possibilités pour réaliser cette action :

Import manuel du certificat :

Ouvrir une console MMC et importer la Snapp-In « Certificates » de la machine. Se rendre dans le magasin « Trested Publishers » et importer le certificat.

Import par GPO du certificat

Créer une nouvelle GPO et importer le certificat dans le magasin « Trested Publishers » :

 

Résultat après import :

Get-ChildItem cert:LocalMachine\TrustedPublisher\

Et lors de l’exécution du script, celui-ci s’exécute sans erreur.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *