Comment signer un script PowerShell (et l’exécuter efficacement)

Avez-vous besoin de vous assurer que personne ne modifie vos scripts et les présente comme étant originaux ? Si c’est le cas, alors vous devez apprendre à signer des scripts PowerShell. La signature ajoute l’identité de l’éditeur au script afin que les utilisateurs puissent décider s’ils font confiance à la source du script.

Dans cet article, apprenez comment vous assurer que seuls les scripts de confiance sont exécutés dans votre environnement en apprenant à signer des scripts PowerShell.

Prérequis

Si vous souhaitez suivre les exemples de cet article, vous avez besoin des éléments suivants.

  • A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
  • Windows PowerShell 5.1 ou PowerShell 6+. Les exemples de cet article utiliseront PowerShell v7.1.3.
  • A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Write-Host "Script Execution - OK"

Obtention d’un certificat de signature de code

Avant d’apprendre à signer un script PowerShell, vous devez d’abord obtenir un certificat de signature de code. Dans le monde Microsoft, les certificats de signature de code sont également appelés certificats Authenticode.

A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.

L’endroit où vous obtenez un certificat de signature de code dépend de l’endroit où vous avez l’intention de déployer ou de distribuer vos scripts signés. Et comme toujours, le coût est également un facteur important.

  • Global / Public – Vous aurez besoin d’un certificat dont l’émetteur est une autorité de certification (CA) mondialement reconnue. Des exemples de telles AC sont GeoTrust et DigiCert. Ces certificats ne sont pas gratuits. Par exemple, un certificat Authenticode de DigiCert vous coûtera 474 $ par an à la date de rédaction de cet article.
  • Internal / Local Intranet – Si vous avez un serveur d’autorité de certification (CA) interne, vous pouvez demander et télécharger un certificat de signature depuis votre serveur CA interne.
  • Personal / Development – Pour des tests personnels ou un usage de développement, un certificat auto-signé devrait suffire. C’est ce type de certificat de signature que vous utiliserez dans cet article.

Création d’un certificat auto-signé pour la signature de code

Vous avez lu dans la section précédente que, pour apprendre à signer un script PowerShell, vous avez d’abord besoin d’un certificat de signature de code. Comme vous ne ferez que des tests personnels dans ce tutoriel, un certificat auto-signé suffira. Mais où le trouver?

Comme son nom l’indique, auto-signé signifie que votre ordinateur local émettra un certificat de signature de code à lui-même. Pour générer un certificat auto-signé, suivez ces étapes.

1. Ouvrez PowerShell en tant qu’administrateur sur votre ordinateur.

2. Copiez la commande ci-dessous et exécutez-la dans PowerShell. Cette commande utilise la cmdlet New-SelfSignedCertificate pour créer un nouveau certificat de signature de code. Le nom du certificat est ATA Authenticode dans le magasin de certificats personnels de l’ordinateur local.

La cmdlet New-SelfSignedCertificate ne prend en charge que la création de certificats dans le magasin de certificats personnels de l’utilisateur actuel (cert:\CurrentUser\My) ou dans le magasin de certificats personnels de l’ordinateur local (cert:\LocalMachine\My). Les certificats dans cert:\LocalMachine\My sont disponibles dans tout l’ordinateur.

La commande stocke également l’objet de certificat dans la variable $authenticode pour une utilisation ultérieure.

# Générer un certificat Authenticode auto-signé dans le magasin de certificats personnels de l'ordinateur local.
 $authenticode = New-SelfSignedCertificate -Subject "ATA Authenticode" -CertStoreLocation Cert:\LocalMachine\My -Type CodeSigningCert

3. Ensuite, pour que votre ordinateur fasse confiance au nouveau certificat que vous avez créé, ajoutez le certificat auto-signé au magasin de certificats de Autorité de certification racine de confiance et Éditeurs approuvés de confiance de l’ordinateur. Pour ce faire, copiez le code ci-dessous et exécutez-le dans PowerShell.

# Ajoutez le certificat Authenticode auto-signé au magasin de certificats racine de l'ordinateur.
## Créez un objet pour représenter le magasin de certificats LocalMachine\Root.
 $rootStore = [System.Security.Cryptography.X509Certificates.X509Store]::new("Root","LocalMachine")
## Ouvrez le magasin de certificats racine en lecture et en écriture.
 $rootStore.Open("ReadWrite")
## Ajoutez le certificat stocké dans la variable $authenticode.
 $rootStore.Add($authenticode)
## Fermez le magasin de certificats racine.
 $rootStore.Close()
 
# Ajoutez le certificat Authenticode auto-signé au magasin de certificats des éditeurs de confiance de l'ordinateur.
## Créez un objet pour représenter le magasin de certificats LocalMachine\TrustedPublisher.
 $publisherStore = [System.Security.Cryptography.X509Certificates.X509Store]::new("TrustedPublisher","LocalMachine")
## Ouvrez le magasin de certificats des éditeurs de confiance en lecture et en écriture.
 $publisherStore.Open("ReadWrite")
## Ajoutez le certificat stocké dans la variable $authenticode.
 $publisherStore.Add($authenticode)
## Fermez le magasin de certificats des éditeurs de confiance.
 $publisherStore.Close()

Il y a trois raisons principales d’installer les certificats auto-signés dans trois magasins de certificats différents.

  • Le certificat que vous avez créé dans le magasin de certificats Personnel est celui que vous utiliserez comme certificat de signature de code.
  • Copier le même certificat dans le magasin Éditeurs de confiance garantit que votre ordinateur local fera confiance à l’éditeur qui a signé le script. PowerShell vérifie la présence du certificat dans ce magasin pour valider la signature d’un script.
  • Enfin, ajouter le certificat auto-signé aux Autorités de certification racine de confiance garantit que votre ordinateur local fait confiance aux certificats des magasins Personnel et Éditeurs de confiance.

4. Pour confirmer que le certificat avec le sujet ATA Authenticode est dans les magasins de certificats Personnel, Racine et Éditeurs de confiance de l’ordinateur, exécutez les commandes ci-dessous dans PowerShell.

# Confirmer si le certificat Authenticode auto-signé existe dans le magasin de certificats Personnel de l'ordinateur
 Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
# Confirmer si le certificat Authenticode auto-signé existe dans le magasin de certificats Racine de l'ordinateur
 Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
# Confirmer si le certificat Authenticode auto-signé existe dans le magasin de certificats Éditeurs de confiance de l'ordinateur
 Get-ChildItem Cert:\LocalMachine\TrustedPublisher | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
Confirming the creation of the new self-signed certificate

5. Pour voir le certificat dans une interface graphique, ouvrez le module Compléments Certificats et recherchez le certificat que vous avez créé dans le dossier Certificats à l’intérieur des magasins de certificats Personnel, Autorités de certification racine de confiance, et Éditeurs de confiance.

Viewing certificates in the Microsoft Management Console (MMC)

Comment signer des scripts PowerShell

Maintenant que vous avez créé et installé votre certificat de signature de code dans les trois magasins de certificats, vous êtes prêt à l’utiliser pour signer votre script PowerShell d’exemple. Lorsque vous avez besoin de signer des scripts, la commande Set-AuthenticodeSignature est la vedette principale.

Pour signer le script PowerShell, exécutez le code ci-dessous dans PowerShell. La première commande récupère le certificat de signature de code du magasin de certificats personnel de la machine locale. La deuxième commande ajoute une signature numérique au fichier de script PowerShell.

# Obtenez le certificat de signature de code du magasin de certificats de l'ordinateur local avec le nom *ATA Authenticode* et stockez-le dans la variable $codeCertificate.
$codeCertificate = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}

# Signez le script PowerShell
# PARAMÈTRES :
# CheminDuFichier - Spécifie le chemin d'accès au script PowerShell à signer, par exemple C:\ATA\monscript.ps1.
# Certificat - Spécifie le certificat à utiliser lors de la signature du script.
# ServeurHorodatage - Spécifie le serveur d'horodatage de confiance qui ajoute un horodatage à la signature numérique de votre script. L'ajout d'un horodatage garantit que votre code ne sera pas expiré lorsque le certificat de signature expire.
Set-AuthenticodeSignature -FilePath C:\ATA\myscript.ps1 -Certificate $codeCertificate -TimeStampServer *<http://timestamp.digicert.com>*

La plupart des fournisseurs de certificats de confiance ont un serveur d’horodatage et vous pouvez les trouver sur les sites Web des fournisseurs. Par exemple, le serveur d’horodatage de DigiCert est http://timestamp.digicert.com et Comodo a http://timestamp.comodoca.com.

Après avoir signé le script, vous devriez voir une sortie similaire à la capture d’écran ci-dessous.

How to Sign PowerShell Scripts

Vérification de la signature numérique d’un script PowerShell

Jusqu’à présent, vous avez signé un script PowerShell en utilisant le certificat auto-signé que vous avez créé. Mais comment savez-vous si le script a bien une signature numérique?

Ouverture du code

Une façon de confirmer la signature numérique d’un script est d’ouvrir le script et de voir le code dans un éditeur de texte. Comme l’exemple ci-dessous, le script signé a un bloc de signature à la fin du code. Le bloc de signature commence par # SIG # Début du bloc de signature et se termine par # SIG # Fin du bloc de signature.

Viewing the digital signature in the script’s content

Supprimer le bloc de signature numérique du code du script le ramènera à sa version non signée.

Ouverture des propriétés du fichier du script

Une autre façon de vérifier la signature numérique du script est d’ouvrir les propriétés du fichier du script dans l’explorateur Windows. Pour ce faire:

  1. Explorateur Windows, accédez à l’emplacement du script PowerShell. Dans cet exemple, le script est dans C:\ATA\myscript.ps1.
  2. Cliquez avec le bouton droit sur le script et cliquez sur Propriétés.
  3. Dans la fenêtre des propriétés du fichier, cliquez sur l’onglet Signatures numériques, et vous devriez voir une signature numérique sous la Liste des signatures.
Viewing the digital signature in the script’s file properties

Utilisez la commande Get-AuthenticodeSignature

Seriez-vous surpris d’apprendre que vous pouvez également vérifier la signature d’un script à l’intérieur de PowerShell ? Probablement pas. La cmdlet que vous pouvez invoquer pour récupérer la signature d’un fichier est Get-AuthenticodeSignature.

Pour obtenir la signature numérique du script, exécutez la commande ci-dessous. Cette commande récupère la signature du fichier C:\ATA\myscript.ps1. La cmdlet Select-Object -Property * affiche tous les détails de la signature.

Get-AuthenticodeSignature -FilePath C:\\ATA\\myscript.ps1 | Select-Object -Property *

Après avoir exécuté la commande, vous devriez voir un résultat similaire à la capture d’écran ci-dessous. Comme vous pouvez le voir, la propriété SignerCertificate montre les détails du certificat de signature. Alors que la propriété TimerStamperCertificate montre le certificat du serveur de minutage.

Viewing the digital signature in PowerShell

Exécution d’un script PowerShell signé

À ce stade, vous avez signé un script PowerShell et confirmé que la signature numérique est présente. Mais, le test ultime pour savoir si vous avez suivi toutes les étapes correctement est d’exécuter le script et de confirmer qu’il s’exécute.

PowerShell dispose d’une fonctionnalité de sécurité qui protège les utilisateurs contre l’exécution involontaire de scripts. Cette fonctionnalité de sécurité est appelée Politiques d’exécution. Selon la politique d’exécution, PowerShell peut empêcher ou autoriser l’exécution de scripts.

Pour en savoir plus sur les différentes politiques d’exécution et leur impact sur l’exécution des scripts, consultez PowerShell Execution Policies: Understanding and Managing.

Pour exécuter un script PowerShell signé, suivez ces étapes.

Tout d’abord, modifiez la politique d’exécution en AllSigned pour garantir que seuls les scripts signés peuvent s’exécuter. Sans effectuer cette étape, vous ne pouvez pas tester avec précision si votre script signé fonctionne. Pour ce faire, invoquez la cmdlet Set-ExecutionPolicy en exécutant la commande ci-dessous dans PowerShell en tant qu’administrateur.

Set-ExecutionPolicy AllSigned

Ensuite, exécutez le script PowerShell signé.

C:\ATA\myscript.ps1

Le script devrait s’exécuter sans erreurs ni avertissements, comme vous pouvez le voir dans le résultat ci-dessous.

Running the signed script without errors

Mais, si par hasard le script n’était pas correctement signé ou pas signé du tout, vous obtiendrez une erreur similaire à l’image ci-dessous. Dans ce cas, reprenez vos étapes et essayez de signer à nouveau le script.

Running a script with errors regarding the digital signature

Et si vous avez finalement mis à jour votre script ? La signature numérique restera-t-elle valide ? La réponse est non. Toute modification apportée au script signé invalidera la signature numérique du script. L’exécution du script modifié échouera et entraînera une erreur.

Suivez ces étapes pour tester un script signé modifié.

1. Ouvrez le script signé myscript.ps1 dans un éditeur de code ou de texte.

2. Modifiez le code pour ajouter un caractère, comme un trait de soulignement dans cet exemple. Ne changez rien d’autre.

Editing the signed script

3. Enregistrez le script après avoir modifié le code.

4. Enfin, exécutez le script modifié dans PowerShell en exécutant la commande ci-dessous.

C:\ATA\myscript.ps1

Étant donné que vous avez modifié le script signé, l’exécution du script entraînera l’erreur indiquée ci-dessous. Vous devrez signer à nouveau le script pour mettre à jour et corriger sa signature numérique.

Running a signed script with a broken digital signature

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.

Conclusion

Dans cet article, vous avez appris pourquoi il peut être nécessaire de signer des scripts PowerShell en fonction des politiques d’exécution. Vous avez également appris à distinguer un script signé d’un script non signé. Enfin, vous avez appris à signer numériquement des scripts PowerShell et comment les tester et les exécuter.

Maintenant que vous savez comment signer des scripts PowerShell, allez-vous commencer à signer les scripts avant de les distribuer ou de les déployer ?

Source:
https://adamtheautomator.com/how-to-sign-powershell-script/