Vous trouverez ci-dessous une description des options disponibles pour l'exécution des fichiers de script PowerShell et des possibilités offertes par leur signature.
Pour le tester, un simple script PowerShell a été créé et exécuté sur un client Windows 10 fraîchement installé.

Dans la configuration par défaut d'un client Windows 10, l'exécution est empêchée car la politique d'exécution pour Windows PowerShell est définie sur „Restricted“, ce qui signifie qu'aucun script ne peut généralement être exécuté.
File C:\Users\rudi.INTRA\Desktop\HelloWorld.ps1 cannot be loaded because running scripts is disabled on this system.

La politique d'exécution de PowerShell
Connaissez-vous TameMyCerts? TameMyCerts est un add-on pour l'autorité de certification Microsoft (Active Directory Certificate Services). Il étend la fonction de l'autorité de certification et permet de Application de la réglementationIl s'agit d'un logiciel de gestion des certificats qui permet d'automatiser l'émission de certificats en toute sécurité. TameMyCerts est unique dans l'écosystème Microsoft, a déjà fait ses preuves dans d'innombrables entreprises du monde entier et est disponible sous une licence libre. Il peut téléchargé via GitHub et être utilisé gratuitement. Une maintenance professionnelle est également proposée.
Pour Windows PowerShell, il existe une politique d'exécution (en anglais „Execution Policy“) qui détermine le comportement concernant l'exécution des scripts. Celle-ci diffère selon la variante de système d'exploitation :
| Variante du système d'exploitation | Politique d'exécution définie par défaut |
|---|---|
| Clients Windows | Restricted |
| Serveur Windows | RemoteSigned |
Les réglages importants pour la suite expliqués brièvement :
| Réglage | Description |
|---|---|
| Restricted | Aucun script PowerShell, quel qu'il soit, ne doit être exécuté. |
| RemoteSigned | Les scripts PowerShell stockés localement peuvent être exécutés, même s'ils ne sont pas signés. Les scripts PowerShell stockés sur des emplacements réseau ne peuvent être exécutés que s'ils sont signés. |
| AllSigned | Les scripts PowerShell, qu'ils soient stockés localement ou sur des emplacements réseau, ne peuvent être exécutés que s'ils sont signés. |
Configurer manuellement la politique d'exécution
Notre objectif est que seuls les scripts signés puissent être exécutés. C'est pourquoi la commande suivante permet de définir la politique d'exécution sur „AllSigned“.
Set-ExecutionPolicy AllSigned

Configurer la politique d'exécution via les stratégies de groupe
Le même effet peut être obtenu via les stratégies de groupe en utilisant le paramètre suivant : Computer Configuration“ - „Administrative Templates“ - „Windows Components“ - „Windows PowerShell“ - „Turn on Script Execution“ - „Allow only signed scripts“.“

Signer numériquement le script
L'exécution du script échouera toujours, car il ne possède pas encore de signature numérique.
File C:\Users\rudi.INTRA\Desktop\HelloWorld.ps1 cannot be loaded. The file C:\Users\rudi.INTRA\Desktop\HelloWorld.ps1 is not digitally signed. You cannot run this script on the current system.


Certificat de signature de code
Pour signer un fichier de script, il faut un certificat avec la valeur Utilisation étendue des clés (EKU) pour la signature de code. Cette circonstance est considérée comme acquise pour la suite de l'article et n'est pas traitée en détail.

Effectuer la signature
Pour signer numériquement des scripts PowerShell, on peut utiliser la commande Set-AuthenticodeSignature.
Tout d'abord, le certificat de signature de code est identifié dans le magasin de certificats local et chargé dans une variable.
$SigningCertificate = (Get-ChildItem -Path Cert:\CurrentUser\My\26716942D0BDBB2D3825C2469C611C59AAE11DE6)
L'utilisation d'un horodatage (timestamp en anglais) est optionnelle mais très utile après RFC 3161. Si la signature de code est horodatée, la signature continue d'être reconnue comme valide même après l'expiration du certificat de signature. Dans cet exemple, le serveur d'horodatage de Sectigo, accessible au public, est utilisé.
$TimeStampingAuthority = 'http://timestamp.sectigo.com'
Toutes les informations sont maintenant disponibles et le script peut être signé.
Set-AuthenticodeSignature ` -FilePath .\HelloWorld.ps1 ` -Certificate $SigningCertificate ` -TimestampServer $TimeStampingAuthority

Si l'on regarde maintenant les propriétés du fichier de script, on constate qu'il dispose désormais d'une signature numérique.

Un coup d'œil sur les détails de la signature révèle en outre qu'il existe également une contre-signature (horodatage).

Si l'on ouvre le script avec un éditeur de texte, on voit que la signature numérique a été ajoutée au code du script sous forme codée en BASE64.

Inscription dans la mémoire des „éditeurs de confiance“ (ou non)
On pourrait alors penser que l'on peut enfin exécuter le script. Cependant, on remarque maintenant que l'on ne fait pas confiance à l'éditeur.
Do you want to run software from this untrusted publisher? File C:\Users\rudi.INTRA\Desktop\HelloWorld.ps1 is published by CN=Rudi Ratlos, OU=Benutzerkonten, OU=ADCSLabor Benutzer, DC=intra, DC=adcslabor, DC=de and is not trusted on your system. Only run scripts from trusted publishers.
On a alors l'option de ne pas l'exécuter, de l'exécuter une fois, de l'exécuter toujours ou de ne jamais l'exécuter.

La sélection de „Always run“ a pour effet d'importer le certificat de signature dans la liste des „éditeurs de confiance“ du magasin de certificats de l'utilisateur.

Annulation de la protection
Le fait que la politique d'exécution n'accepte que les scripts signés ne garantit en aucun cas qu'il ne sera pas possible d'exécuter des scripts non signés. Il existe de nombreuses possibilités de saper la directive d'exécution et d'exécuter malgré tout des scripts non signés.
Voici un exemple simple :
type .\HelloWorld.ps1 | powershell -

Liens complémentaires
Sources externes
- À propos des politiques d'exécution (Microsoft)
- Set-AuthenticodeSignature (Microsoft)
- Ajouter, supprimer ou visualiser un éditeur de confiance (Microsoft)
- Gérer les éditeurs de confiance (Microsoft)
- Use Policy pour distribuer des certificats (Microsoft)
- 15 façons de contourner la politique d'exécution de PowerShell (NetSPI LLC)
Les commentaires sont fermés.