Set-ExecutionPolicy pour gérer les stratégies d’exécution PowerShell

Avez-vous déjà téléchargé un script PowerShell, l’avez exécuté, et rencontré le message d’erreur infâme ci-dessous? Si c’est le cas, vous avez besoin de la cmdlet Set-ExecutionPolicy et de ce tutoriel !

PowerShell Script Execution Disabled Error

Dans ce post, vous allez apprendre sur les politiques d’exécution PowerShell et comment les gérer avec la cmdlet Set-ExecutionPolicy. À la fin de ce post, vous saurez non seulement exécuter des scripts, mais aussi comment utiliser les politiques d’exécution !

Ce tutoriel a été écrit en gardant à l’esprit Windows PowerShell, et toutes les démonstrations ont été effectuées avec Windows PowerShell. Les politiques d’exécution ne sont pas propres à Windows PowerShell, et elles fonctionnent de manière très similaire dans PowerShell 6+. Mais, si vous travaillez avec PowerShell 6+, vous pouvez trouver de petites différences de comportement.

What est une Politique d’Exécution?

Si vous avez déjà rencontré l’erreur décrite ci-dessus, vous avez rencontré une politique d’exécution. Les politiques d’exécution PowerShell sont un mécanisme de sécurité pour protéger votre système contre l’exécution de scripts malveillants. Les politiques d’exécution ne vous empêchent pas d’exécuter du code PowerShell dans la console en tant que shell mais l’exécution de scripts.

Microsoft dit qu’une politique d’exécution n’est pas techniquement une mesure « sécuritaire » mais plutôt une porte que vous pouvez ouvrir et fermer. Après tout, vous pouvez contourner facilement une politique d’exécution définie, comme vous le verrez plus tard.

Les politiques d’exécution sont basées sur la confiance. Si vous faites confiance à un script, il y a de fortes chances qu’il ne soit pas malveillant. Les politiques d’exécution ne préviennent généralement pas l’exécution de tous les scripts. Leur objectif principal (surtout lorsqu’elles sont configurées de manière plus stricte) est de s’assurer que vous faites confiance au script que vous exécutez signé de manière cryptographique avec un certificat.

Étendues des politiques d’exécution

Comme vous l’avez appris, les politiques d’exécution restreignent l’exécution des scripts, mais PowerShell peut exécuter des scripts dans de nombreux contextes différents. PowerShell exécute des scripts dans le contexte de l’utilisateur connecté ou dans le contexte machine global, via des tâches planifiées s’exécutant en tant que SYSTEM ou dans le cadre d’une seule console PowerShell ouverte.

Pour accommoder tous ces contextes, PowerShell propose cinq contextes ou étendues différentes que vous pouvez définir pour une politique d’exécution.

  • MachinePolicy – Cette étendue est limitée à un seul ordinateur. Elle affecte tous les utilisateurs qui se connectent à cet ordinateur, et un objet de stratégie de groupe Active Directory la définit. Lorsqu’elle est définie, elle a priorité sur toutes les autres étendues.
  • LocalMachine. Ceci est la portée par défaut qui affecte tous les utilisateurs de l’ordinateur et qui est stockée dans la sous-clé de registre HKEY_LOCAL_MACHINE. Lorsque vous définissez une stratégie d’exécution à l’aide de Set-ExecutionPolicy, cette portée est la valeur par défaut.

La stratégie d’exécution pour LocalMachine est stockée dans la clé de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.

  • UserPolicy – La portée UserPolicy affecte uniquement un seul utilisateur sur un ordinateur, et un objet de stratégie de groupe Active Directory la définit. Vous ne pouvez pas modifier cette stratégie avec Set-ExecutionPolicy.
  • CurrentUser. La portée CurrentUser définit la stratégie d’exécution uniquement pour l’utilisateur actuel et est stockée sous la ruche de registre HKEY_CURRENT_USER. Vous ne pouvez pas modifier cette stratégie avec Set-ExecutionPolicy.

La stratégie d’exécution pour CurrentUser est stockée dans la clé de registre HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.

  • Process – Cette portée définit la stratégie d’exécution pour une seule session PowerShell pour un seul utilisateur. La portée de stratégie d’exécution Process est la plus granulaire que vous puissiez définir. Contrairement aux autres stratégies d’exécution, cette stratégie est enregistrée dans une variable d’environnement appelée PSExecutionPolicyPreference plutôt que dans le registre.

Types de stratégies d’exécution

Les politiques d’exécution ont différents « niveaux de sécurité ». Ces niveaux dictent à quel point la politique d’exécution est stricte. Par exemple, vous pouvez avoir une politique d’exécution en place qui ne fait essentiellement rien ; elle est désactivée, mais, d’un autre côté, une politique d’exécution peut désactiver complètement l’exécution de script.

Couvrons chacune des façons dont vous pouvez configurer le niveau de sécurité d’une politique d’exécution, du moins restrictif au plus restrictif.

Non restreint

La politique la moins restrictive est celle qui n’a aucun effet ; c’est Non restreint. Les politiques d’exécution Non restreintes sont essentiellement désactivées. Les utilisateurs peuvent exécuter tous les scripts, quel que soit le niveau de confiance, lorsque la politique d’exécution est Non restreinte.

Contournement

Comme le type Non restreint, une politique d’exécution définie sur Contournement, ne bloque rien.

Bien que le Contournement et le Non restreint aient un effet similaire, le type de politique d’exécution Contournement n’est pas techniquement un type du tout. Il ignore complètement une politique d’exécution définie.

Indéfini

Bien que peu utilisé, vous pouvez essentiellement supprimer une politique d’exécution en la définissant sur Indéfini. Lorsque vous définissez une politique d’exécution sur Indéfini, PowerShell supprime complètement toutes les politiques d’exécution attribuées de la portée attribuée.

Sur les ordinateurs non-Windows, la politique d’exécution est toujours définie sur Non restreinte et ne peut pas être modifiée.

Lorsque toutes les portées sont définies sur Indéfini, PowerShell traite essentiellement toutes les portées comme Restreintes.

Signé à distance

Comme vous l’avez lu précédemment, les stratégies d’exécution concernent la confiance acquise grâce à une signature numérique des scripts. PowerShell prend également en compte la provenance de ce script. A-t-il été créé sur votre ordinateur local ou par une personne aléatoire sur Internet ?

Les scripts créés ailleurs que sur votre ordinateur local ne doivent pas être intrinsèquement fiables. C’est pourquoi PowerShell propose la stratégie d’exécution RemoteSigned. La stratégie d’exécution RemoteSigned impose que tous les scripts écrits ailleurs que sur votre ordinateur local soient signés de manière cryptographique.

Vous pouvez outrepasser cette stratégie d’exécution dans une certaine mesure pour les fichiers téléchargés depuis Internet à l’aide de la cmdlet Unblock-File. Vous trouverez plus d’informations sur ce comportement un peu plus loin dans la section Comment fonctionne la stratégie RemoteSigned.

Pour Windows Server, la stratégie par défaut est RemoteSigned.

AllSigned

Si vous souhaitez vous assurer que tous les scripts PowerShell sont signés de manière cryptographique, définissez la stratégie d’exécution sur AllSigned. Comme pour la stratégie RemoteSigned, cette stratégie d’exécution va plus loin en imposant que tous les scripts soient signés avant d’être exécutés.

Même si vous avez défini la stratégie d’exécution AllSigned, vous pouvez toujours contourner la stratégie d’exécution en la contournant, comme vous le découvrirez plus tard.

Restricted

La politique d’exécution la plus restrictive est Restreinte. Lorsqu’une politique d’exécution est Restreinte, aucun script ne peut être exécuté, qu’il soit de confiance ou non. Cette politique désactive essentiellement complètement l’exécution de scripts.

De plus, contrairement aux types moins restrictifs, le type Restreinte garantit que les fichiers de formatage PowerShell et de configuration (PS1XML), les fichiers de script de module (PSM1) et les profils PowerShell ne peuvent pas être exécutés.

Tous les clients Windows sont, par défaut, configurés avec une politique d’exécution Restreinte.

Techniquement, Microsoft définit une septième politique d’exécution appelée Par défaut, mais le type est essentiellement un autre label pour RemoteSigned (Serveur Windows) et Restreint (Clients Windows).

Fonctionnement de la politique RemoteSigned

Un scénario particulier à souligner est le fonctionnement de la politique d’exécution RemoteSigned. Cette politique d’exécution (comme vous l’avez appris) empêche l’exécution de scripts qui ont été créés ailleurs que sur votre ordinateur local.

Mais comment PowerShell sait-il que le script a été créé ailleurs ? Par le biais des flux de données.

Compréhension et interrogation des flux de données NTFS

Lorsque vous créez un fichier sur un système de fichiers NTFS, NTFS applique un attribut de flux de données alternatif (ADS) au fichier. Un ADS a deux attributs de fichier : $Data et zone.Identifier. PowerShell utilise l’attribut zone.Identifier pour identifier si un fichier de script PowerShell a été créé ailleurs.

Contrairement à d’autres attributs comme Compressé ou Lecture seule, les attributs ADS sont cachés dans l’Explorateur de fichiers. Cependant, en utilisant PowerShell, vous pouvez inspecter ces flux de données.

Exécutez la commande Get-Item en utilisant le chemin vers le script et le paramètre Stream comme indiqué ci-dessous. Dans cet exemple, Hello World.ps1 a été écrit sur l’ordinateur local. Remarquez que le seul attribut attribué à la propriété Stream est $DATA. Il n’y a aucun attribut ADS.

Get-Item '.\Hello World.ps1' -Stream *
ADS Stream output for local file

Maintenant, exécutez la même commande sur un script téléchargé depuis Internet. Remarquez maintenant que Get-Item renvoie un autre objet complètement avec un Stream de Zone.Identifier.

ADS Stream output for PowerShell file downloaded from internet

Une fois que vous savez qu’un fichier a un ADS, vous pouvez alors utiliser la commande Get-Content pour découvrir la zone. La zone définit d’où vient le fichier.

Get-Content .\Get-CertDetails.ps1 -Stream zone.identifier

Get-Content renverra une valeur ZoneId qui représente la zone d’origine du fichier.

Zone ID Value

Les valeurs possibles de zone sont:

Zone ID Zone
------- ---------------------
0       My Computer
1       Local Intranet Zone
2       Trusted sites Zone
3       Internet Zone
4       Restricted Sites Zone

Précédence de la stratégie d’exécution

Comme mentionné précédemment, de nombreuses stratégies d’exécution différentes existent simultanément. Toutes ces stratégies d’exécution, lorsqu’elles sont combinées, dictent les paramètres de votre session actuelle. Lorsque vous avez plusieurs stratégies d’exécution en cours, vous devez avoir une préférence.

La préférence de la stratégie est l’ordre dans lequel PowerShell applique différentes stratégies définies à différentes étendues. Certaines stratégies d’exécution ont une priorité plus élevée que d’autres.

Lorsque vous exécutez Get-ExecutionPolicy -List, vous trouverez toutes les stratégies d’exécution actuellement en vigueur, classées par ordre de priorité croissante. Par exemple, puisque MachinePolicy a une priorité plus faible, les stratégies LocalMachine et CurrentUser auront la priorité sur celle-ci.

Get-ExecutionPolicy cmdlet output

Travailler avec les stratégies d’exécution

Après avoir compris le contexte des stratégies d’exécution, voyons maintenant comment travailler avec elles ! Pour travailler avec les stratégies d’exécution de PowerShell, vous disposez de deux commandes à votre disposition : Get-ExecutionPolicy pour découvrir les stratégies actuellement définies et Set-ExecutionPolicy pour définir de nouvelles stratégies.

Obtention des stratégies actuellement assignées

Avant de pouvoir commencer à modifier les stratégies d’exécution, vous devez savoir avec quoi vous travaillez. Pour cela, vous disposez de la commande Get-ExecutionPolicy. Cette commande énumère toutes les stratégies actuellement assignées sur un ordinateur.

Lorsque vous exécutez directement la commande Get-ExecutionPolicy dans une console PowerShell sans paramètres, elle affiche la stratégie d’exécution définie pour votre session PowerShell actuelle.

Get-ExecutionPolicy cmdlet output

Pour voir la stratégie d’exécution définie pour une étendue, spécifiez le paramètre Scope en utilisant le nom de l’étendue pour laquelle vous souhaitez voir les résultats.

Get-ExecutionPolicy -Scope Process
Get-ExecutionPolicy -Scope LocalMachine
Get-ExecutionPolicy cmdlet with scope parameter output

Pour afficher toutes les étendues et leurs stratégies d’exécution, utilisez le paramètre List comme indiqué ci-dessous.

Get-ExecutionPolicy -list
Get-ExecutionPolicy cmdlet displaying all scopes

Modification des stratégies d’exécution

Une fois que vous savez quelles politiques d’exécution sont actuellement attribuées, vous pouvez également les modifier. Pour modifier la politique sur un seul ordinateur, vous avez la commande Set-ExecutionPolicy à votre disposition. Mais, si vous êtes dans une organisation, vous voudrez modifier les politiques en masse. Si tel est le cas, vous avez toujours la stratégie de groupe si vous êtes dans un domaine Active Directory.

Utilisation de Set-ExecutionPolicy

Commençons par expliquer comment modifier les politiques avec la commande Set-ExecutionPolicy. Pour ce faire, ouvrez PowerShell en tant qu’administrateur.

Exécutez ensuite la commande Set-ExecutionPolicy avec un seul paramètre (ExecutionPolicy) en fournissant le nom de la politique d’exécution.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

PowerShell vous demandera alors si vous souhaitez modifier la politique d’exécution. Si c’est le cas, tapez Y ou A et appuyez sur Entrée.

Change Execution Policy

Certaines commandes PowerShell doivent exécuter plusieurs autres tâches pour fonctionner. Si dans l’exemple ci-dessus vous entrez Y, PowerShell peut vous demander de continuer pour chaque étape. Si vous appuyez sur A, il continuera pour toutes les étapes suivantes.

Exécution de Set-ExecutionPolicy sans invites

Par défaut, lorsque vous exécutez Set-ExecutionPolicy, il vous demandera si vous souhaitez changer la stratégie d’exécution. Vous pouvez ignorer cette invite en ajoutant le paramètre Force à votre commande. L’utilisation du paramètre Force supprimera toutes les invites de confirmation.

Set-ExecutionPolicy RemoteSigned -Force
Output of Set-ExecutionPolicy command when Force Parameter is used

Configuration de la stratégie d’exécution PowerShell via le Registre

Étant donné que la plupart des stratégies d’exécution sont stockées dans le registre (à l’exception de Process), vous pouvez également modifier les stratégies directement via le registre.

Pour modifier les stratégies d’exécution via le registre :

  1. Ouvrez l’Éditeur du Registre Windows (regedit) ou votre outil d’édition de registre préféré.

2. Accédez à la clé de registre de la portée de la stratégie d’exécution que vous souhaitez modifier.

MachineLocaleHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

UtilisateurActuelHKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

3. Cliquez avec le bouton droit sur la clé de registre et créez une nouvelle valeur de chaîne appelée ExecutionPolicy.

4. Double-cliquez sur la nouvelle valeur de chaîne ExecutionPolicy créée et saisissez le nom de la stratégie d’exécution souhaitée (Restreint, RemoteSigned, AllSigned, NonRestreint, ou Indéfini).

5. Créez une autre valeur de chaîne à la même clé appelée Path. La valeur de chaîne Path représente le chemin vers le moteur PowerShell. Assurez-vous que la valeur de Path est C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, qui pointe vers le moteur PowerShell de Windows.

Registry path for ExecutionPolicy in registry for current user

La stratégie d’exécution CurrentUser annule une stratégie LocalMachine. Si vous avez une stratégie CurrentUser définie dans le registre et que vous essayez de changer la stratégie d’exécution via Set-ExecutionPolicy, qui, par défaut, définit la stratégie au niveau de LocalMachine, PowerShell renverra une erreur indiquée ci-dessous.

Execution Policy Permission Denied

Définir la stratégie d’exécution PowerShell via la stratégie de groupe

Si vous êtes dans une organisation avec Active Directory, vous ne voudrez pas aller sur toutes vos machines Windows et exécuter la cmdlet Set-ExecutionPolicy. Au lieu de cela, vous pouvez gérer les stratégies en masse avec la stratégie de groupe.

Pour gérer les stratégies d’exécution via la GPO:

Créez l’objet de stratégie de groupe

  1. Ouvrez l’application de gestion de la stratégie de groupe sur un contrôleur de domaine ou sur votre poste de travail rejoint au domaine.
Group Policy Management Console

2. Développez Domains —> <votre forêt Active Directory> —> Group Policy Objects.

Select Group Policy Objects node

3. Faites un clic droit sur Group Policy Objects et cliquez sur New.

4. Donnez un nom à votre GPO. Dans ce tutoriel, la GPO est appelée PowerShell Execution Policy.

Create new Group Policy Object

5. Cliquez avec le bouton droit de la souris sur la GPO nouvellement créée et cliquez sur Edit.

6. Accédez à Configuration de l’ordinateur\Stratégies\Modèles d’administration\Composants Windows\Windows PowerShell.

Navigate to the setting in Group Policy Object

7. Ouvrez le paramètre dans le volet droit de la fenêtre, ouvrez le paramètre Activer l’exécution de scripts.

Turn on Script Execution Policy

8. Dans la zone Activer l’exécution de scripts, sélectionnez l’option Activé. Vous pouvez maintenant sélectionner l’une des options ci-dessous:

9. Modifiez maintenant la Politique d’exécution selon votre souhait.

  • Autoriser uniquement les scripts signés – Autorise l’exécution de tous les scripts lorsqu’un éditeur de confiance les signe.
  • Autoriser les scripts locaux et les scripts signés à distance – Autorise l’exécution de scripts locaux mais les scripts téléchargés depuis Internet doivent être signés par un éditeur de confiance.
  • Autoriser tous les scripts – Autorise l’exécution de tous les scripts.
List Execution Policy

Attribuer l’objet de stratégie de groupe

Une fois la GPO créée, il est temps de l’attribuer à vos ordinateurs cibles. Pour cela, vous devez attribuer la GPO à une unité organisationnelle de l’annuaire Active Directory (OU).

Si, au lieu de créer une nouvelle GPO, vous avez modifié une GPO existante, cette GPO a probablement déjà été attribuée à une OU.

  1. Dans Gestion des stratégies de groupe, accédez à votre unité organisationnelle de choix en allant dans Domaines —> <votre forêt Active Directory> —> <Votre UO>.

2. Cliquez avec le bouton droit sur l’OU et sélectionnez Associer une GPO existante…

Link an Existing GPO…

3. Sélectionnez la GPO nouvellement créée (PowerShell Execution Policy) et cliquez sur OK.

Select the GPO

Vous devriez maintenant voir la GPO assignée à l’OU comme indiqué ci-dessous.

Link the Group Policy Object

À ce stade, vous pouvez soit attendre l’intervalle de rafraîchissement de la stratégie de groupe défini, soit exécuter la commande gpupdate sur un ordinateur cible pour forcer un rafraîchissement.

Verrouillage des modifications de la politique locale

Une fois qu’une GPO est en vigueur et modifie la stratégie d’exécution, les utilisateurs locaux ne peuvent plus modifier la politique via la console PowerShell locale. S’ils essaient, ils recevront une erreur, comme indiqué ci-dessous.

Error on trying to changing execution policy manually

Bypassing la politique d’exécution complètement

Comme mentionné précédemment, une politique d’exécution n’est pas nécessairement censée être une mesure de sécurité. Pourquoi ? Parce que vous pouvez la contourner complètement si vous le souhaitez de plusieurs façons différentes.

En utilisant le paramètre -ExecutionPolicy Bypass

Contrairement aux autres stratégies d’exécution, la stratégie Bypass est généralement définie non pas dans la console PowerShell mais transmise au moteur powershell.exe exécuté en tant qu’administrateur.

Par exemple, pour exécuter un script appelé Hello World.ps1 en sautant complètement toute stratégie d’exécution, invoquez powershell.exe, utilisez le paramètre Bypass et fournissez le chemin du fichier comme indiqué ci-dessous.

powershell.exe -executionpolicy bypass -file '.\Hello World.ps1'
ByPass Execution Policy using bypass execution policy

Lecture de scripts et exécution de code brut

Vous pouvez également contourner toute stratégie d’exécution en lisant d’abord le contenu d’un script, puis en passant ce contenu directement au moteur PowerShell. Ce faisant, chaque commande est exécutée individuellement et non pas comme un script entier en une seule fois.

Comme vous pouvez le voir ci-dessous, la stratégie d’exécution est définie sur Restreint, mais en lisant le script et en le passant à powershell.exe, il fonctionne toujours.

Cette approche est similaire à l’ouverture d’un script dans un éditeur PowerShell comme PowerShell ISE ou Visual Studio Code, en sélectionnant une ligne et en appuyant sur F8.

Get-Content '.\Hello World.ps1' | powershell.exe -noprofile
Alternative way to Bypass Execution Policy

Conclusion

À présent, vous devriez savoir tout ce qu’il y a à savoir sur les stratégies d’exécution PowerShell. Bien qu’elles ne soient pas techniquement une mesure de sécurité, vous devriez toujours les gérer dans votre organisation conformément aux politiques organisationnelles.

Source:
https://adamtheautomator.com/set-executionpolicy/