logo rss

Comment créer et exécuter des scripts PowerShell Auto-Signés

PowerShell logo

Par défaut, PowerShell peut restreindre l’exécution des scripts en fonction de la stratégie d’exécution configurée. Même si l’option -ExecutionPolicy Bypass permet de contourner temporairement ces restrictions, ce n’est pas l’approche la plus sécurisée.

Dans ce guide, nous allons configurer Windows afin d’autoriser uniquement les scripts PowerShell signés, créer un certificat auto-signé de signature de code, l’utiliser pour signer un script PowerShell, importer le certificat dans les magasins de certificats appropriés, puis vérifier la signature du script avant son exécution.

GPO pour autoriser uniquement les scripts signés

  • Ouvrir l'éditeur des stratégies de groupe :
Ouvrez la boîte de dialogue Exécuter et tapez gpedit.msc pour accéder à l'éditeur de stratégie de groupe de Windows.
  • Accédez à Configuration ordinateur > Modèles d’administration > Composants Windows > Windows PowerShell :
Capture d'écran de l'Éditeur de stratégie de groupe locale montrant l'option Activer l'exécution des scripts dans Windows PowerShell
  • Éditer la stratégie Activer l'exécution des scripts :
Fenêtre de configuration de la stratégie d'exécution des scripts dans l'Éditeur de stratégie de groupe locale, avec l'option Activer et Autoriser uniquement les scripts signés sélectionnées

Création du certificat

Pour signer nos scripts nous avons besoin d'un certificat. Nous allons voir ici comment en créer un auto-signé.

  • Ouvrir une console Windows PowerShell en administrateur :
Windows menu showing the Run as administrator option for PowerShell
  • Attribuer un nom à notre nouveau certificat dans la variable $CertificateName :
PS C:\Users\Administrator\Desktop> $CertificateName = "STD Certificate"
  • Définir l'endroit ou l'on souhaite créer le certificat :
PS C:\Users\Administrator\Desktop> $OutPutPFXFilePath = "C:\Users\administrator\Desktop\MyNewSigningCertificate.pfx"
  • Définir un mot de passe à notre fichier PFX :
PS C:\Users\Administrator\Desktop> $MyStrongPassword = ConvertTo-SecureString -String "MyPassword" -Force -AsPlainText
  • Enfin, créer le certificat avec une durée de vie de 10 ans et une taille de clé de 4096 bits :
PS C:\Users\Administrator\Desktop> New-SelfSignedCertificate -subject $CertificateName -Type CodeSigning -NotAfter (Get-Date).AddYears(10) -KeyLength 4096 | Export-PfxCertificate -FilePath $OutPutPFXFilePath -password $MyStrongPassword

Signer le script

  • Charger le certificat :
PS C:\Users\Administrator\Desktop> $MyCertFromPfx = Get-PfxCertificate -FilePath 'C:\Users\administrator\Desktop\MyNewSigningCertificate.pfx'
Enter password : ********
  • Signer le script :
PS C:\Users\Administrator\Desktop> Set-AuthenticodeSignature -PSPath 'C:\Users\administrator\Desktop\script.ps1' -Certificate $MyCertFromPfx

💡 Note : Le statut Valid confirme que le script a bien été signé. Le certificat utilisé pour la signature doit néanmoins être approuvé sur chaque ordinateur sur lequel le script sera exécuté.

Sortie de la commande PowerShell pour la signature d'un script avec Set-AuthenticodeSignature

Importer le Certificat

Pour être correctement reconnu, le certificat auto-signé à besoin d'être importé sur les ordinateurs sur lesquels nous voulons exécuter nos scripts PowerShell. Il faudra donc entrer les commandes suivants avec les droits administrateurs sur les machines cibles.

Définir les variables

  • Renseigner le mot de passe du fichier PFX et le chemin vers le certificat :
PS C:\Users\Administrator\Desktop> $MyStrongPassword = ConvertTo-SecureString -String "MyPassword" -Force -AsPlainText
PS C:\Users\Administrator\Desktop> $CertPath = "C:\Users\administrator\Desktop\MyNewSigningCertificate.pfx"

Importer vers le magasin Autorités de certification racines de confiance

  • Importer le certificat vers le magasin local d'Autoritésde certification racines de confiance :
PS C:\Users\Administrator\Desktop> Import-PfxCertificate -FilePath $CertPath "cert:\LocalMachine\Root" -Password $MyStrongPassword
Vue des autorités de certification racines de confiance dans la console MMC, avec le certificat STD Certificate mis en surbrillance

Importer vers le magasin Éditeurs approuvés

  • Importer le certificat vers le magasin local des Éditeurs approuvés :
PS C:\Users\Administrator\Desktop> Import-PfxCertificate -FilePath $CertPath "cert:\LocalMachine\TrustedPublisher" -Password $MyStrongPassword
Certificat STD Certificate affiché dans le dossier Éditeurs de confiance de la console MMC

Vérifier la signature

  • Nous pouvons vérifier si le script est correctement signé avec la commande Get-AuthenticodeSignature :
PS C:\Users\Administrator\Desktop> Get-AuthenticodeSignature 'C:\Users\administrator\Desktop\script.ps1'
Commande PowerShell pour valider la signature d'un script avec un statut valide
  • Si le script a été modifié après avoir été signé, HashMismacth apparaitra et le script ne poura être executé :
Commande PowerShell affichant une erreur de concordance de hachage lors de la validation de la signature du script

Références