PowerShell-ExecutionPolicy setzen, Scripts signieren und ausführen

    Unsignierte Scripts werden von PowerShell nicht ausgeführtIn der Voreinstellung ist PowerShell kompromisslos auf Sicherheit getrimmt: Man kann generell keine Scripts ausführen, nur die Shell interaktiv benutzen. Damit soll verhindert werden, dass Schadcode ausgeführt und ein Computer oder Benutzerkonto dadurch kompromittiert wird. Je nach Erfordernis will man diese Einstellung ändern, um PowerShell-Scripts ausführen zu können, etwa selbst entwickelte. Um dies zu können, muss man die Tore seines Systems nicht sperrangelweit öffnen, sondern wählt eine Lösung, die sicher und dennoch handhabbar ist.

    Man signiert PowerShell-Scripts, die man selbst erstellt hat oder denen man vertraut, und verbietet die Ausführung unsignierter Scripts.

    Richtlinien für die Ausführung: Get-ExecutionPolicy und Set-ExecutionPolicy

    Ob und welche PowerShell-Scripts auf einem System ausgeführt werden können, legt eine Richtlinie fest. Über das Kommando Get-ExecutionPolicy in einem PowerShell-Fenster erfährt man, welche gültig ist. Ändern kann man sie, und zwar nur mit Administratorrechten, mittels des Befehls Set-ExecutionPolicy oder per Gruppenrichtlinie für die Domäne. Die möglichen Werte für ExecutionPolicy sind folgende:

    Wert Auswirkung
    Restricted Es werden keine Konfigurationsdateien geladen und keine Scripts ausgeführt (Standard)
    AllSigned Signierte Scripts und Konfigurationsdateien von einem vertrauenswürdigen Herausgeber werden ausgeführt. Auch lokal erstellte Scripts müssen signiert sein.
    RemoteSigned Aus dem Internet heruntergeladenen Scripts und Konfigurationsdateien müssen von einem vertrauenswürdigen Herausgeber signiert sein.
    Unrestricted Alle Konfigurationsdateien und alle Scripts werden ausgeführt. Bei nicht signierten Scripts aus dem Internet muss man jede Ausführung am Prompt bestätigen
    Bypass Keinerlei Blockade, keine Warnungen oder Prompts.
    Undefined Entfernt die gerade zugewiesene Richtlinie (nur für lokal zugewiesene Richtlinien, nicht für GPO-applizierte)

    Eigene Scripts signieren

    Bei der Zertifizierungsstelle besorgt man sich ein Zertifikat für die CodesignaturUm eigene Scripts ausführen zu können, jedoch trotzdem die Sicherheit zu behalten, dass unsignierter oder nach der Signatur veränderter Code nicht ausgeführt werden kann, eignet sich als ExecutionPolicy am besten AllSigned. Um sie sinnvoll zu verwenden, muss man eigene Scripts und solche, denen man vertraut, fortan signieren. Dazu fordert man von seiner Zertifizierungsstelle zunächst ein Zertifikat mit dem Zweck Codesignatur an. Mittels des Kommandos

    Get-ChildItem cert:\CurrentUser\My -codesigning

    prüft man dessen Vorhandensein in der PowerShell-Umgebung. Signieren kann man sein Script dann per

    Set-AuthenticodeSignature ‹Script.ps1› @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

    Mit dem Zertifikat signiert man eigene und zu vertrauenden Scriptswozu im Gegensatz zu einer globalen Richtlinienänderung keine Administratorrechte nötig sind. Direkt nach der Installation des Codesignatur-Zertifikats muss man noch einmal am Prompt bestätigen, dass man dem Herausgeber vertraut. Damit wird das Zertifikat in den Speicher für die Vertrauenswürdigen Herausgeber kopiert und man kann fortan damit signierte Scripts ohne weitere Nachfragen ausführen.

    1 Kommentar

    Bild von Daniel
    Daniel sagt:
    26. September 2017 - 9:21

    Danke für die Anleitung. Auf die Powershell Befehle zum Signieren wäre ich im Leben nicht gekommen. Was man vielleicht noch erwähnen sollte ist, dass man sich das Zertifikat von der Zertifizierungsstelle für die Codesignatur über die mmc als Benutzer holen muss, und nicht über den Computer. Hilfreich wäre evtl. auch noch der Pfad in der GPO um die Einstellungen für die Scripts anzupassen. (Computerkonfiguration - Richtlinien - Administrative Vorlagen -Windows Komponenten - Windows Powershell - Skriptausführung aktivieren).