Signer vos scripts PowerShell


Présentation


Hey, Scripting Guy ! Quoi de mieux aujourd’hui que des scripts Powershell pour administrer votre infrastructure cliente et serveur ? Lors de vos premières expérimentations avec Powershell, vous avez peut-être rencontré ce message…

…et voulu le contrer en exécutant la commande suivante :

1
Set-ExecutionPolicy Unrestricted

C’est bien jolie pour les tests, mais qu’en est-il dans un environnement de production ?

Powershell dispose de 4 niveaux de politique d’exécution :

  • Restricted : Cette politique interdit tout simplement l’exécution de n’importe quel script. Elle peut être appliquée dans le cas où vous ne feriez pas du tout de Powershell ou dans les environnements plus sensibles.
  • AllSigned : Autorise l’exécution des scripts signés par un éditeur approuvé (ce que nous verrons juste après).
  • RemoteSigned : Les scripts téléchargés doivent être signés par un éditeur approuvé avant leur exécution.
  • Unrestricted : (le mal) Cette politique autorise l’exécution de tous les scripts Powershell, peu importe leur provenance. Ce mode représente une faille de sécurité non négligeable et n’est conseillé qu’en environnement de test.

Powershell est un outil très puissant, et peut être dévastateur si un script malveillant est lancé sur votre infrastructure. Laisser la Politique d’exécution de script en Unrestricted n’est absolument pas recommandé.
Mais alors que faire ? Placer votre politique d’exécution en AllSigned et signer vous-même vos scripts semblent être la meilleure solution. Bien évidemment, si une partie de votre infrastructure ne rencontre pas de scripts Powershell, vous pouvez appliquer la politique Restricted et donc limiter les risques.


Mise en place


Pré-requis :

  • 1x Contrôleur de domaine Active Directory (AD DS)
  • 1x Autorité de certification Active Directory (AD CS)
  • 1x Poste client Windows membre de votre domaine Active Directory
  • 1x Script à signer (placé dans le dossier « scripts » de votre sysvol)

Une fois votre autorité de certification installée et configurée, vérifiez l’existence du modèle de certificat « Signature du code ». Dans Outils d’administration > Autorité de certification > Modèles de certificats. Si « Signature du code » n’est pas présent, faites un clique droit sur « Modèles de certificats » > Nouveau > Modèle de certificats à délivrer > Sélectionnez « Signature du code » > Ok. Il apparaît désormais dans la liste.

Tout est en place, nous pouvons commencer.

Etape 1 : Faire une demande de certificat de type « Signature du code »

Ici nous allons faire une demande de certificat de type « Signature du code », permettant la « signature » de nos différents scripts.
Sur votre serveur assurant le rôle « Autorité de Certification Active Directory », en tant qu’Administrateur, ouvrez une console MMC Certificats. Puis dans personnel, faites une demande de certificat :

Faites une première fois Suivant > Sélectionnez la stratégie d’inscription à Active Directory > Sélectionnez le type « Signature de code » et allez dans les propriétés > Donnez un nom convivial à votre certificat et cochez la case « Permettre l’exportation de la clé privée » dans l’onglet clé privé > Validez et inscrivez votre certificat.

Etape 2 : Signature de mon script Powershell et lancement de celui-ci

Actuellement, ma politique d’exécution des scripts est paramétrée en « AllSigned », c’est à dire que seuls les scripts signés par mon autorité de certification sont autorisés à être exécutés.

Dans une console Powershell :

  • On stocke le chemin du certificat que nous venons de générer dans la variable $cert :
    1
    $cert = (dir Cert:\CurrentUser\My\ -CodeSigningCert)
  • On stocke le chemin du script à signer dans la variable $script_location :
    1
    $script_location = "C:\Windows\SYSVOL\sysvol\gmillour.lab\scripts\helloworld.ps1"
  • On lance la signature du script :
    1
    Set-AuthenticodeSignature $script_location $cert -TimestampServer https://timestamp.comodoca.com/authenticode

-TimestampServer : En résumé cette option permet de mettre un coup de tampon avec la date de signature. Cela permet d’indiquer au système, une fois le certificat expiré, que le script peut toujours être exécuté puisque le certificat était bien valide lors de la signature du script.

Vous obtenez le résultat suivant :

De plus, si vous éditez votre script, vous remarquerez la signature générée en fin de code.

Observons maintenant le comportement de Powershell au lancement du script.

On remarque qu’une confirmation nous est demandée. Si vous sélectionnez l’option « [T] Toujours exécuter », et si vous vous rendez dans votre MMC Certificats, que vous regardez dans les éditeurs approuvés, on remarque la présence du certificat utilisé pour la signature de notre script.

Etape 3 : Exportation du certificat et déploiement par GPO

Toujours dans votre MMC Certificats, rendez-vous dans Personnel\Certificats :

Enfin, pour permettre l’exécution du script sur les postes de votre parc, vous devez ajouter le certificat généré aux éditeurs approuvés des machines de votre parc. Pour cela, faisons une GPO !
Dans votre Gestionnaires des stratégies de groupe, créez un nouvel objet de stratégie, nommez-le et éditez-le. Rendez-vous dans :
Configuration Ordinateur
  |__ Stratégies
    |__Paramètre Windows
      |__Paramètres de sécurité
        |__ Stratégies de clé publique
          |__ Editeurs approuvés
Clique droit > Importer : Placez votre certificat dans le magasin des éditeurs approuvés :

Il ne vous reste qu’à l’appliquer où vous en avez besoin…and it works perfectly !
NB : C’est une GPO Ordinateur, un redémarrage est donc nécessaire. 😉
NB : N’oubliez pas de créer une GPO pour fixer la Politique d’Exécution sur AllSigned. Par défaut elle fixée à Restricted.
Configuration Ordinateur
  |__ Stratégies
    |__Modèles d’administration
      |__Composants Windows
        |__ Windows Powershell
          |__ Activer l’exécution des scripts > Activé : Autoriser uniquement les scripts signés.

[🏆 Success] Vous savez signer vos scripts Powershell avec une autorité de certification Active Directory.
Enjoy ! 🙂