Mehr Sicherheit mit der Windows PowerShell durch das signieren von Scripten

Mit der PowerShell ein Zertifikat ausstellen um damit Scripte selbst zu signieren

Die Windows PowerShell ist prinzipiell sehr auf Sicherheit bedacht. Aus diesem Grund darf man Scripte auch nicht einfach ausführen. Es gibt die ExecutionPolicies, mit welchen festgelegt wird, wann ein Script ausgeführt werden darf. Für die Konfiguration dieser Richtlinie gibt es, wie in der Tabelle ersichtlich, verschiedene Möglichkeiten.

OptionBeschreibung
UnrestrictedSkripte werden ausgeführt. Bei Skripten nicht vertrauenswürdiger Quellen erfolgt eine Abfrage
RemoteSignedAlle Skripte fremder Quellen müssen digital von einem vertrauenswürdigen Herausgeber signiert sein. Lokale Skripte werden ausgeführt
AllSignedJedes Skript muss von einem vertrauenswürdigen Herausgeber signiert sein.
restrictedStandardwert; es werden keine Skripte ausgeführt. Die PowerShell kann nur interaktiv verwendet werden
bypassSkripte werden ohne Blockierung, Nachfragen oder Warnungen ausgeführt.

Klar sollte sein, dass die unsicherste Variante unrestricted ist und die sicherste Variante AllSigned ist. Aus diesem Grund möchte ich in diesem Tutorial mal zeigen, wie man PowerShell Scripte signiert. Da ich allerdings ein selbst signiertes Zertifikat verwende, muss ich die Policy auf RemoteSigned einstellen. Das bedeutet alle Scripte die man anschließend ausführen möchte sei es jetzt fremde oder selbsterstellte, müssen passend signiert sein. Als Erstes muss man von seiner Zertifizierungsstelle ein Zertifikat anfordern. Solle man keine Zertifizierungsstelle zur Verfügung haben, so bietet die Windows PowerShell auch die Möglichkeit eigene Zertifikate zu erstellen. Allerdings ist dies dann natürlich kein öffentliches Zertifikat. Für Testzwecke aber sehr gut geeignet. Das nötige Cmdlet hierfür ist  New-SelfSignedCertificate

New-SelfSignedCertificate -CertStoreLocation 'Cert:\CurrentUser\My' -Subject "CN=TestCodeSigning" -TextExtension "2.5.29.37={text}1.3.6.1.5.5.7.3.3"
Ein Windows PowerShell Script selbst signieren

Details zu den einzelnen verschiedenen Argumenten mit dessen Optionen und Einstellungen können auf der  Technet Seite nachgelesen werden.

Nach der Erstellung des Zertifikats kann man sich diese auflisten lassen. Anschließend liest man das Zertifikat aus (per [0] und legt es in eine Variable ($cert). Genau aus dieser Variable heraus nimmt man zu guter Letzt das  Zertifikat um sein Script zu signieren.

dir Cert:\CurrentUser\My
$cert = @(dir "Cert:\CurrentUser\My\")[0]
Set-AuthenticodeSignature .\testscript.ps1 $cert
Windows PowerShell vollständig signiertes Script

Ein signiertes Script erkennt man anschließend daran, dass am Ende eine lange Zahlenreihe steht. Diese beginnt mit “SIG # Beginn signature Block”. Da hier in meinem Beispiel ein selbsterstelltes Zertifikat verwendet wurde, muss die Executionpolicy auf RemoteSigned gestellt werden. Andernfalls müsste das Zertifikat zu den vertrauenswürdigen hinzugefügt werden.

4 Kommentare

  1. Der Code kann nicht signiert werden. Das angegebene Zertifikat ist fuer die Codesignatur nicht geeignet.

    • Hallo Peter, seltsam. Ich habe es gerade nochmal getestet und es hat funktioniert. Verwendest du einen Windows Server oder ein Windows 10 System. Gruß Markus

Kommentare sind deaktiviert.