Wie man ein PowerShell-Skript signiert (und es effektiv ausführt)

Müssen Sie sicherstellen, dass niemand Änderungen an Ihren Skripten vornimmt und sie als Original ausgibt? Wenn ja, müssen Sie lernen, PowerShell-Skripte zu signieren. Durch die Signierung wird die Identität des Herausgebers dem Skript hinzugefügt, sodass Benutzer entscheiden können, ob sie der Quelle des Skripts vertrauen möchten.

In diesem Artikel erfahren Sie, wie Sie sicherstellen können, dass nur vertrauenswürdige Skripte in Ihrer Umgebung ausgeführt werden, indem Sie lernen, PowerShell-Skripte zu signieren.

Voraussetzungen

Wenn Sie die Beispiele in diesem Artikel befolgen möchten, benötigen Sie Folgendes.

  • A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
  • Windows PowerShell 5.1 oder PowerShell 6+. Die Beispiele in diesem Artikel verwenden PowerShell v7.1.3.
  • A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Write-Host "Script Execution - OK"

Erwerb eines Code-Signaturzertifikats

Bevor Sie lernen, wie Sie PowerShell-Skripte signieren, müssen Sie zunächst ein Code-Signaturzertifikat erhalten. In der Microsoft-Welt werden Code-Signaturzertifikate auch als Authenticode-Zertifikate bezeichnet.

A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.

Wo Sie ein Code-Signaturzertifikat erhalten, hängt davon ab, wo Sie Ihre signierten Skripte bereitstellen oder verteilen möchten. Und wie immer spielt auch der Preis eine große Rolle.

  • Global / Öffentlich – Sie benötigen ein Zertifikat, dessen Aussteller ein weltweit vertrauenswürdiges Certificate Authority (CA) ist. Beispiele für solche CAs sind GeoTrust und DigiCert. Diese Zertifikate sind nicht kostenlos. Zum Beispiel kostet ein DigiCert Authenticode-Zertifikat zum Zeitpunkt dieses Schreibens 474 US-Dollar pro Jahr.
  • Intern / Lokales Intranet – Wenn Sie einen internen Zertifizierungsstellen (CA)-Server haben, können Sie ein Signaturzertifikat von Ihrem internen CA-Server anfordern und herunterladen.
  • Persönlich / Entwicklung – Für persönliche Tests oder Entwicklungsanwendungen ist ein selbstsigniertes Zertifikat ausreichend. Diese Art von Signaturzertifikat wird in diesem Artikel verwendet.

Erstellung eines selbstsignierten Zertifikats für die Codesignierung

Sie haben im vorherigen Abschnitt gelesen, dass Sie für das Signieren von PowerShell-Skripten zunächst ein Codesignaturzertifikat benötigen. Da Sie in diesem Tutorial nur persönliche Tests durchführen, genügt ein selbstsigniertes Zertifikat. Aber woher bekommen Sie es?

Wie der Name schon sagt, bedeutet selbstsigniert, dass Ihr lokaler Computer ein Codesignaturzertifikat für sich selbst ausstellt. Befolgen Sie diese Schritte, um ein selbstsigniertes Zertifikat zu generieren.

1. Öffnen Sie PowerShell als Administrator auf Ihrem Computer.

2. Kopieren Sie den folgenden Befehl und führen Sie ihn in PowerShell aus. Dieser Befehl verwendet das New-SelfSignedCertificate-Cmdlet, um ein neues Codesignaturzertifikat zu erstellen. Der Name des Zertifikats lautet ATA Authenticode im Zertifikatspeicher des lokalen Computers.

Das New-SelfSignedCertificate-Cmdlet unterstützt nur das Erstellen von Zertifikaten im persönlichen Zertifikatspeicher des aktuellen Benutzers (cert:\CurrentUser\My) oder im persönlichen Zertifikatspeicher des lokalen Computers (cert:\LocalMachine\My). Zertifikate im cert:\LocalMachine\My sind computerweit verfügbar.

Der Befehl speichert auch das Zertifikatobjekt in der Variable $authenticode für die Verwendung im nächsten Schritt.

# Erzeugen Sie ein selbstsigniertes Authenticode-Zertifikat im persönlichen Zertifikatspeicher des lokalen Computers.
 $authenticode = New-SelfSignedCertificate -Subject "ATA Authenticode" -CertStoreLocation Cert:\LocalMachine\My -Type CodeSigningCert

3. Als nächstes, um Ihren Computer dazu zu bringen, dem neuen von Ihnen erstellten Zertifikat zu vertrauen, fügen Sie das selbstsignierte Zertifikat dem Stammzertifizierungsstelle und Vertrauenswürdige Herausgeber Zertifikatspeicher des Computers hinzu. Kopieren Sie dazu den folgenden Code und führen Sie ihn in PowerShell aus.

# Fügen Sie das selbstsignierte Authenticode-Zertifikat dem Stammzertifikatsspeicher des Computers hinzu.
## Erstellen Sie ein Objekt, um den Zertifikatsspeicher LocalMachine\Root zu repräsentieren.
 $rootStore = [System.Security.Cryptography.X509Certificates.X509Store]::new("Root","LocalMachine")
## Öffnen Sie den Stammzertifikatsspeicher zum Lesen und Schreiben.
 $rootStore.Open("ReadWrite")
## Fügen Sie das im $authenticode-Variablen gespeicherte Zertifikat hinzu.
 $rootStore.Add($authenticode)
## Schließen Sie den Stammzertifikatsspeicher.
 $rootStore.Close()
 
# Fügen Sie das selbstsignierte Authenticode-Zertifikat dem Zertifikatsspeicher für vertrauenswürdige Herausgeber des Computers hinzu.
## Erstellen Sie ein Objekt, um den Zertifikatsspeicher LocalMachine\TrustedPublisher zu repräsentieren.
 $publisherStore = [System.Security.Cryptography.X509Certificates.X509Store]::new("TrustedPublisher","LocalMachine")
## Öffnen Sie den Zertifikatsspeicher für vertrauenswürdige Herausgeber zum Lesen und Schreiben.
 $publisherStore.Open("ReadWrite")
## Fügen Sie das im $authenticode-Variablen gespeicherte Zertifikat hinzu.
 $publisherStore.Add($authenticode)
## Schließen Sie den Zertifikatsspeicher für vertrauenswürdige Herausgeber.
 $publisherStore.Close()

Es gibt drei Hauptgründe, die selbstsignierten Zertifikate in drei verschiedenen Zertifikatsspeichern zu installieren.

  • Das Zertifikat, das Sie im Personal-Zertifikatsspeicher erstellt haben, wird als Code-Signaturzertifikat verwendet.
  • Das Kopieren desselben Zertifikats in den Vertrauenswürdige Herausgeber-Speicher stellt sicher, dass Ihr lokaler Computer dem Herausgeber, der das Skript signiert hat, vertraut. PowerShell überprüft das Zertifikat in diesem Speicher, um die Signatur eines Skripts zu validieren.
  • Schließlich gewährleistet das Hinzufügen des selbstsignierten Zertifikats zu den Vertrauenswürdigen Stammzertifizierungsstellen, dass Ihr lokaler Computer den Zertifikaten in den Speichern Persönlich und Vertrauenswürdige Herausgeber vertraut.

4. Um zu bestätigen, dass das Zertifikat mit dem Betreff ATA Authenticode in den Zertifikatspeichern Persönlich, Stamm und Vertrauenswürdige Herausgeber vorhanden ist, führen Sie die folgenden Befehle in PowerShell aus.

# Bestätigen, ob das selbstsignierte Authenticode-Zertifikat im Zertifikatsspeicher des Computers Persönlich vorhanden ist
 Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
# Bestätigen, ob das selbstsignierte Authenticode-Zertifikat im Zertifikatsspeicher des Computers Stamm vorhanden ist
 Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
# Bestätigen, ob das selbstsignierte Authenticode-Zertifikat im Zertifikatsspeicher des Computers Vertrauenswürdige Herausgeber vorhanden ist
 Get-ChildItem Cert:\LocalMachine\TrustedPublisher | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
Confirming the creation of the new self-signed certificate

5. Um das Zertifikat stattdessen in einer GUI anzuzeigen, öffnen Sie das Zertifikate-Snap-In und suchen Sie nach dem von Ihnen erstellten Zertifikat im Ordner Zertifikate innerhalb der Zertifikatsspeicher Persönlich, Vertrauenswürdige Stammzertifizierungsstellen, und Vertrauenswürdige Herausgeber.

Viewing certificates in the Microsoft Management Console (MMC)

Wie man PowerShell-Skripte signiert

Jetzt, da Sie Ihr Codesignaturzertifikat erstellt und in die drei Zertifikatsspeicher installiert haben, können Sie es verwenden, um Ihr Beispiel-PowerShell-Skript zu signieren. Wenn Sie Skripte signieren müssen, ist das Hauptwerkzeug der Set-AuthenticodeSignature-Cmdlet.

Um das PowerShell-Skript zu signieren, führen Sie den folgenden Code in PowerShell aus. Der erste Befehl ruft das Codesignaturzertifikat aus dem lokalen Maschinenzertifikatspeicher ab. Der zweite Befehl fügt dem PowerShell-Skript eine digitale Signatur hinzu.

# Das Codesignaturzertifikat aus dem Zertifikatsspeicher des lokalen Computers mit dem Namen *ATA Authenticode* abrufen und es in der Variable $codeCertificate speichern.
$codeCertificate = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}

# Das PowerShell-Skript signieren
# PARAMETER:
# FilePath - Gibt den Dateipfad des zu signierenden PowerShell-Skripts an, z.B. C:\ATA\myscript.ps1.
# Certificate - Gibt das Zertifikat an, das beim Signieren des Skripts verwendet werden soll.
# TimeStampServer - Gibt den vertrauenswürdigen Zeitstempelserver an, der einen Zeitstempel zur digitalen Signatur Ihres Skripts hinzufügt. Das Hinzufügen eines Zeitstempels stellt sicher, dass Ihr Code nicht abläuft, wenn das Signaturzertifikat abläuft.
Set-AuthenticodeSignature -FilePath C:\ATA\myscript.ps1 -Certificate $codeCertificate -TimeStampServer *<http://timestamp.digicert.com>*

Die meisten vertrauenswürdigen Zertifizierungsstellen verfügen über einen Zeitstempel-Server, den Sie auf den Websites der Anbieter finden können. Zum Beispiel lautet der Zeitstempel-Server von DigiCert http://timestamp.digicert.com und Comodo hat http://timestamp.comodoca.com.

Nachdem Sie das Skript signiert haben, sollten Sie eine ähnliche Ausgabe wie im folgenden Screenshot sehen.

How to Sign PowerShell Scripts

Überprüfung der digitalen Signatur eines PowerShell-Skripts

Bisher haben Sie ein PowerShell-Skript mit dem selbstsignierten Zertifikat signiert, das Sie erstellt haben. Aber wie wissen Sie, ob das Skript tatsächlich eine digitale Signatur hat?

Öffnen des Codes

Eine Möglichkeit, die digitale Signatur eines Skripts zu bestätigen, besteht darin, das Skript zu öffnen und den Code in einem Texteditor anzuzeigen. Wie im folgenden Beispiel hat das signierte Skript einen Signaturblock am Ende des Codes. Der Signaturblock beginnt mit # SIG # Begin signature block und endet mit # SIG # End signature block.

Viewing the digital signature in the script’s content

Durch Löschen des Signaturblocks aus dem Code des Skripts wird das Skript wieder als nicht signiert zurückgesetzt.

Öffnen der Dateieigenschaften des Skripts

Eine weitere Möglichkeit, die digitale Signatur des Skripts zu überprüfen, besteht darin, die Dateieigenschaften des Skripts im Windows Explorer zu öffnen. Dazu gehen Sie wie folgt vor:

  1. Im Windows Explorer navigieren Sie zum Speicherort des PowerShell-Skripts. In diesem Beispiel befindet sich das Skript unter C:\ATA\myscript.ps1.
  2. Klicken Sie mit der rechten Maustaste auf das Skript und wählen Sie Eigenschaften.
  3. In dem Eigenschaftenfenster des Dateis klicken Sie auf den Tab Digitale Signaturen, und Sie sollten eine digitale Signatur unter der Signaturliste sehen.
Viewing the digital signature in the script’s file properties

Verwenden Sie Get-AuthenticodeSignature

Wären Sie überrascht, dass Sie auch die Signatur eines Skripts innerhalb von PowerShell überprüfen können? Wahrscheinlich nicht. Das Cmdlet, das Sie aufrufen können, um die Signatur einer Datei abzurufen, lautet Get-AuthenticodeSignature.

Um die digitale Signatur des Skripts zu erhalten, führen Sie den folgenden Befehl aus. Dieser Befehl ruft die Signatur der Datei C:\ATA\myscript.ps1 ab. Das Cmdlet Select-Object -Property * zeigt alle Details der Signatur an.

Get-AuthenticodeSignature -FilePath C:\\ATA\\myscript.ps1 | Select-Object -Property *

Nach Ausführung des Befehls sollten Sie ein ähnliches Ergebnis wie auf dem Bildschirmfoto unten sehen. Wie Sie sehen können, zeigt die Eigenschaft SignerCertificate die Details des Signierungszertifikats an. Während die Eigenschaft TimerStamperCertificate das Zertifikat des Zeitstempel-Servers anzeigt.

Viewing the digital signature in PowerShell

Ausführen eines signierten PowerShell-Skripts

Zu diesem Zeitpunkt haben Sie ein PowerShell-Skript signiert und bestätigt, dass die digitale Signatur vorhanden ist. Aber der ultimative Test, ob Sie alle Schritte korrekt ausgeführt haben, besteht darin, das Skript auszuführen und zu bestätigen, dass es läuft.

PowerShell verfügt über eine Sicherheitsfunktion, die Benutzer davor schützt, Skripte versehentlich auszuführen. Diese Sicherheitsfunktion wird als Execution Policies bezeichnet. Abhängig von der Ausführungsrichtlinie kann PowerShell das Ausführen von Skripten verhindern oder zulassen.

Um mehr über die verschiedenen Ausführungsrichtlinien und ihre Auswirkungen auf die Skriptausführung zu erfahren, siehe PowerShell Execution Policies: Understanding and Managing.

Um ein signiertes PowerShell-Skript auszuführen, befolgen Sie diese Schritte.

Zunächst ändern Sie die Ausführungsrichtlinie auf AllSigned, um sicherzustellen, dass nur signierte Skripte ausgeführt werden können. Ohne diesen Schritt können Sie nicht genau testen, ob Ihr signiertes Skript funktioniert. Führen Sie dazu das Set-ExecutionPolicy-Cmdlet aus, indem Sie den folgenden Befehl in PowerShell als Administrator ausführen.

Set-ExecutionPolicy AllSigned

Anschließend führen Sie das signierte PowerShell-Skript aus.

C:\ATA\myscript.ps1

Das Skript sollte fehlerfrei und ohne Warnungen ausgeführt werden, wie im untenstehenden Ergebnis ersichtlich.

Running the signed script without errors

Aber wenn das Skript aus irgendeinem Grund nicht korrekt signiert oder überhaupt nicht signiert wurde, erhalten Sie einen Fehler ähnlich dem Bild unten. In diesem Fall überprüfen Sie Ihre Schritte und versuchen Sie, das Skript erneut zu signieren.

Running a script with errors regarding the digital signature

Was ist, wenn Sie Ihr Skript schließlich aktualisiert haben? Wird die digitale Signatur immer noch gültig sein? Die Antwort lautet nein. Jede Änderung am signierten Skript macht die digitale Signatur ungültig. Das Ausführen des modifizierten Skripts schlägt fehl und führt zu einem Fehler.

Befolgen Sie diese Schritte, um ein modifiziertes signiertes Skript zu testen.

1. Öffnen Sie das signierte myscript.ps1 Skript in einem Code- oder Texteditor.

2. Ändern Sie den Code, um ein Zeichen hinzuzufügen, wie zum Beispiel einen Unterstrich in diesem Beispiel. Ändern Sie nichts anderes.

Editing the signed script

3. Speichern Sie das Skript nach der Code-Änderung.

4. Führen Sie schließlich das modifizierte Skript in PowerShell aus, indem Sie den folgenden Befehl ausführen.

C:\ATA\myscript.ps1

Da Sie das signierte Skript geändert haben, wird die Ausführung des Skripts zu dem unten gezeigten Fehler führen. Sie müssen das Skript erneut signieren, um die digitale Signatur zu aktualisieren und zu korrigieren.

Running a signed script with a broken digital signature

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.

Fazit

In diesem Artikel haben Sie erfahren, warum das Signieren von PowerShell-Skripten je nach Ausführungsrichtlinien notwendig sein kann. Sie haben auch gelernt, wie man zwischen einem signierten und einem nicht signierten Skript unterscheidet. Schließlich haben Sie gelernt, PowerShell-Skripte digital zu signieren und wie man sie testet und ausführt.

Jetzt, da Sie wissen, wie Sie PowerShell-Skripte signieren können, werden Sie damit beginnen, Skripte zu signieren, bevor Sie sie verteilen oder bereitstellen?

Source:
https://adamtheautomator.com/how-to-sign-powershell-script/