Signature de code PowerShell
Introduction
PowerShell est actuellement le principal outil de scripting de Microsoft. Le risque d’écriture et de déploiement de scripts malveillants doit être pris sérieusement en compte.
Afin d’éviter tout risque, la stratégie d’exécution par défaut appliquée par Microsoft sur ses systèmes d’exploitation est paramétrée pour n’exécuter aucun script.
Si ce paramétrage minimise effectivement les risques encourus, il ne répond pas à la question : comment exécuter des scripts PowerShell de façon sécurisée ?
La réponse est de les signer numériquement et de n’autoriser que l’exécution de scripts Powershell signés.
Dans cette optique, un certificat de signature est déployé automatiquement pour chaque développeur. L’applet PowerShell Set-AuthenticodeSignature permet ensuite de signer le code à l’aide du certificat obtenu.
L’applet PowerShell complémentaire Get-AuthenticodeSignature permet de vérifier la signature d’un script ainsi que les paramètres associés (Signataire, dates de validités…).
Niveaux de restriction d’exécution de script PowerShell
Il existe six niveaux d’exécution des scripts PowerShell :
-
Restricted : aucun script ne peut être exécuté. PowerShell ne peut être utilisé qu’en mode interactif (par défaut).
-
AllSigned : le niveau le plus sécurisé. Les scripts doivent être signés par un éditeur approuvé pour être exécuté localement ou à distance (le plus sécurisé).
-
RemoteSigned : les scripts téléchargés doivent être signés par un éditeur approuvé pour être exécutés.
-
Unrestricted : exécute tous les scripts. Demande l’autorisation de l’utilisateur avant l’exécution de scripts non signés téléchargés.
-
Bypass : exécution de tous les scripts sans avertissement (le plus risqué).
-
Undefined : supprime la stratégie d’exécution appliquée localement sauf si elle est définie par une stratégie de groupe.
-
Default : réapplique la stratégie par défaut.
Le niveau d’exécution peut être modifié localement à l’aide de l’applet PowerShell Set-ExecutionPolicy.
Par exemple :
Set-ExecutionPolicy AllSigned
Il est cependant recommandé de changer le niveau d’exécution...
Méthodologie de signature de code
La méthodologie de signature de code PowerShell est la suivante :
-
Interdire, par stratégie de groupe, tout script PowerShell non signé.
-
Personnaliser le modèle Signature de code et autoriser l’autorité de certification à distribuer ce nouveau modèle.
-
Demander un certificat basé sur le nouveau modèle.
-
Signer les scripts PowerShell avec le certificat obtenu.
Une simple applet PowerShell (Set-AuthenticodeSignature) est suffisante pour signer en code PowerShell !
-
Déployer l’éditeur par stratégie de groupe sur les ordinateurs du domaine.
-
Tester la signature de code et la révocation du certificat.
Ces étapes sont mises en pratique de façon détaillée dans la section Atelier de ce chapitre !
Éditeurs approuvés
Les « éditeurs approuvés » sont des certificats qui n’incluent que la clé publique du signataire du code. Ils permettent la validation de la signature et de l’intégrité du code PowerShell signé.
Ces certificats doivent être déployés sur les postes clients de l’entreprise à l’aide d’une stratégie de groupe.
La signature de code PowerShell permet de vérifier, avant exécution, qu’un code a bien été signé par une personne de confiance (authentification) et que le code n’a pas été modifié (intégrité). L’exécution de scripts PowerShell dans l’entreprise est ainsi totalement sécurisée.
L’intégrité du code est vérifiée à l’aide d’algorithmes de Hash (Md5, Sha…). Lors de la signature, une première valeur de Hash est calculée sur le script. Cette même valeur de Hash est recalculée et comparée à la valeur d’origine avant toute exécution. Si les valeurs correspondent, le script est exécuté (script non modifié), sinon l’exécution est refusée.
Durée de validité des scripts
Tant que le certificat utilisé pour signer un script n’est pas révoqué ou n’a pas expiré, les scripts s’exécutent. Examinons en détail les processus de révocation de certificat de signature du code ainsi que ceux de renouvellement.
1. Révocation du certificat de signature
Dans le cas où l’on souhaiterait, suivant une politique de sécurité très stricte, révoquer les certificats de signature de code des développeurs qui quittent l’entreprise, cela impliquerait d’émettre un nouveau certificat et de signer à nouveau les scripts PowerShell à l’aide du nouveau certificat.
Afin que la révocation soit totalement opérationnelle, il sera nécessaire de :
-
Publier une nouvelle liste de révocation.
-
Éventuellement, d’actualiser la liste de révocation locale sur l’ordinateur à l’aide des commandes :
> certutil -f -urlcache * delete
> certutil -setreg chain\ChainCacheResyncFiletime @now
Reportez-vous au chapitre Révocation de certificat dans l’entreprise pour plus d’informations et de mise en pratique complète sur le thème de la révocation des certificats de signature PowerShell.
2. Renouvellement de certificat de signature de code
Lorsque le certificat utilisé...
Horodatage numérique
On peut souhaiter qu’un code reste exécutable, même dans le cas où le certificat l’ayant signé expire.
Cela permet de s’assurer de la pérennité d’exécution des scripts dans l’entreprise sans avoir délivré de nouveaux certificats et sans devoir signer à nouveau tous les codes PowerShell.
Une possibilité serait de configurer le modèle pour une durée de vie plus élevée que celle du modèle par défaut. Cette solution n’est pas complètement satisfaisante puisque techniquement la durée d’un certificat ne peut jamais dépasser la durée du certificat de l’autorité de certification qu’il a émis. Plus clairement, si la durée de vie du certificat de l’autorité de certification est de dix ans, les modèles de certificats de signature de code ne pourront pas disposer d’une durée de vie supérieure.
Il est cependant possible d’utiliser le concept d’horodatage numérique pour prolonger l’exécution du code signé. Le concept d’horodatage numérique permet à la signature numérique d’être valide même après l’expiration du certificat lui-même.
Comment est-ce que cela fonctionne ?
L’horodatage représente...
Atelier : Signature de code PowerShell
1. Objectif
La société Corp souhaite sécuriser les exécutions de script PowerShell dans l’entreprise. Seuls les scripts PowerShell signés par un éditeur d’entreprise validé seront autorisés.
Dans cet atelier pratique, nous allons personnaliser le modèle de signature de code, obtenir un certificat basé sur ce modèle et l’utiliser pour signer nos scripts PowerShell. Nous déploierons automatiquement le certificat éditeur sur tous les ordinateurs du domaine à l’aide d’une stratégie du groupe. Nous testerons également l’impact d’une modification du script et de la révocation du certificat de signature de code.
Les ordinateurs virtuels utilisés dans cet atelier sont les suivants :
-
S1 : contrôleur de domaine
-
S2 : autorité de certification racine entreprise (CorpRootCa)
-
W10 : client Active Directory
2. Obtenir un certificat de signature de code
Créer un nouveau modèle de certificats Signature de code
Connectez-vous sur le serveur s2 en tant que Corp\Admin.
Ouvrez la console de gestion Autorité de certification.
Développez CorpRootEntCA.
Faites un clic droit sur Modèles de certificats et sélectionnez le menu Gérer.
La console de gestion Modèles de certificats s’affiche.
Faites un clic droit sur le modèle Signature de code et sélectionnez le menu Dupliquer le modèle.
Sélectionnez l’onglet Compatibilité, développez la liste déroulante Autorité de certification, sélectionnez Windows Server 2016 et cliquez sur le bouton OK pour accepter les modifications résultantes.
Développez la liste déroulante Destinataire du certificat, sélectionnez Windows 10 / Windows Server 2016 et cliquez le bouton OK pour accepter les modifications résultantes.
Sélectionnez l’onglet Général, saisissez Corp Signature du code dans la zone Nom complet.
Sélectionnez l’onglet Sécurité, ajoutez le compte Corp\Admin puis cochez les autorisations Lecture et Inscrire pour cet utilisateur.
Sélectionnez l’onglet Traitement de la demande et cochez les cases Autoriser l’exportation...