Signieren von PowerShell-Skripten

I ❤️ PowerShell. Es ist ein wirklich nützliches Tool für die Automatisierung von Aufgaben, die Sie mehrfach ausführen. Aber es kann auch eine klaffende Sicherheitslücke sein, wenn man es zulässt.

Mit der PowerShell können Sie fast alles auf Ihrem Computer verwalten, so dass jemand, der in der Lage ist, bösartige Skripte in Ihren Umgebungen auszuführen, eine Menge Schaden anrichten kann.

Vormals nur auf Windows beschränkt, kann die PowerShell seit Version 6 und jetzt mit der Veröffentlichung von PowerShell 7.0 auch auf Linux und MacOS eingesetzt werden. In diesem Artikel geht es jedoch um Ausführungsrichtlinien, die in Nicht-Windows-Umgebungen nicht geändert werden können, so dass Linux-/MacOS-Benutzer keinen Nutzen daraus ziehen können (sorry).

Ausführungsrichtlinien

Eine Möglichkeit, die Ausführung von Skripts in Ihren Windows-Umgebungen einzuschränken, ist die Verwendung der Ausführungsrichtlinien von PowerShell. Mit diesen Richtlinien können Sie die Skripte einschränken, die in der Umgebung ausgeführt werden können. Die verfügbaren Optionen von am wenigsten sicher bis am sichersten sind:

Umgehung

Nichts wird blockiert.

Eingeschränkt (gilt immer auf Nicht-Windows-Computern)

Gleich wie ByPass, aber der Benutzer wird vor der Ausführung von Skripts aus dem Internet gefragt.

RemoteSigned (Standard für Windows Server)

Skripte, die aus dem Internet heruntergeladen wurden, können nur ausgeführt werden, wenn sie signiert sind. Auf dem Rechner geschriebene Skripte können ausgeführt werden

AllSigned

Alle Skripte müssen signiert sein, bevor sie ausgeführt werden

Restricted (Standard für Windows Clients)

Verhindert die Ausführung von Skripten. Es können nur einzelne Befehle ausgeführt werden.

Ausführen von Skripts

Sie möchten also Ihre eigenen PowerShell-Skripts auf Ihrem Server ausführen. Aber Sie erhalten eine PSSecurityException wie die folgende.

PS C:\Users\Administrator\Downloads> .\wibble.ps1.\wibble.ps1 : File .\wibble.ps1 cannot be loaded. The file.\wibble.ps1 is not digitally signed. You cannot run this script on the current system.For more information about running scripts and setting execution policy, see about_Execution_Policies athttp://go.microsoft.com/fwlink/?LinkID=135170.At line:1 char:1+ .\wibble.ps1+ ~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) , PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
Vollbildmodus betreten Vollbildmodus verlassen

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die Ausführungsrichtlinie mit dem Befehl Set-ExecutionPolicy zu ändern und die Sicherheit des Computers zu verringern. Dies ist im Allgemeinen eine schlechte Idee.

Persönlich würde ich niemals etwas weniger sicheres als RemoteSigned auf einem Server verwenden, sondern idealerweise AllSigned.

Was ist eine Skript-Signatur?

Vermutlich wollen Sie die Sicherheit des Rechners aufrechterhalten und keine Schwachstelle öffnen, also bleibt Ihnen nur die Möglichkeit, Ihre Skripte zu signieren.

Ein Skript zu signieren bedeutet, dass jemand, der Zugriff auf den privaten Schlüssel für ein Code Signing-Zertifikat hat, einen Signaturblock am Ende der Skriptdatei hinzugefügt hat.

function Get-Wibble { return "Wibble"}# SIG # Begin signature block# vpnIUpm2XxLRhU1no0iuA62xKxYzR6m95z9Ax21ppeTC9NoRd8ocoSGr1zAd# qlMOlz4lZoVWR4ZmtdCgzde1dVxzv4jjHb6ziDiY2o05UXswD2bl6XaOrUpd# Li0Qjg3d3y2r1nrpO8hos906bgXQswysvouegUJcpt8ftmqBKfEYNeBgnBFm# SIG # End signature block
Vollbildmodus aufrufen Vollbildmodus beenden

(Nur ein Beispiel. Der Signaturblock ist normalerweise viel länger)

Der Signaturblock enthält einen Hash des Skripts, der mit dem privaten Schlüssel verschlüsselt wurde. Beim Versuch, das Skript auszuführen, wird dieser mit dem öffentlichen Schlüssel entschlüsselt und mit dem tatsächlichen Hashwert verglichen. Wenn er übereinstimmt, können wir bestätigen, dass das Skript nicht manipuliert wurde, da sich der Hash ändern würde, sobald dies geschieht.

Selbstsignierende Zertifikate

Wenn Ihre Skripte nur von Rechnern in Ihrer Organisation ausgeführt werden sollen, können Sie die Zertifikate höchstwahrscheinlich selbst signieren. Die Alternative ist, $$$ auszugeben und jedes Jahr ein Code Signing-Zertifikat zu kaufen.

Selbstsignierung bedeutet, dass Sie das Zertifikat selbst generieren und die Skripte damit signieren.

So erstellen Sie ein selbstsignierendes Zertifikat

PowerShell verfügt über den sehr nützlichen New-SelfSignedCertificate-Befehl zur Erstellung selbstsignierter Zertifikate. Wir können sie dann exportieren und in verschiedenen Speichern ablegen.

Standardmäßig erstellt der Befehl ein Zertifikat, das nach 1 Jahr abläuft. Sie können dies mit dem Parameter -NotAfter ändern und das Datum angeben, an dem das Zertifikat ablaufen soll.

Um ein Zertifikat zu erstellen, starten Sie eine PowerShell-Sitzung und führen Sie Folgendes aus

$CertificateName = Read-Host "Input your certificate name"$OutputPFXPath = "$CertificateName.pfx"$OutputCERPath = "$CertificateName.cer"$Password = Get-Credential -UserName Certificate -Message "Enter a secure password:"$certificate = New-SelfSignedCertificate -subject $CertificateName -Type CodeSigning -CertStoreLocation "cert:\CurrentUser\My"$pfxCertificate = Export-PfxCertificate $certificate -FilePath $OutputPFXPath -password $Password.passwordExport-Certificate -Cert $certificate -FilePath $OutputCERPathImport-PfxCertificate $pfxCertificate -CertStoreLocation cert:\CurrentUser\Root -Password $password.passwordWrite-Output "Private Certificate '$CertificateName' exported to $OutputPFXPath"Write-Output "Public Certificate '$CertificateName' exported to $OutputCERPath"
Vollbildmodus aufrufen Vollbildmodus beenden

Dadurch wird das Zertifikat erstellt und in zwei separate Dateien mit den Erweiterungen .pfx und .cer exportiert.

PFX

Das PFX-Zertifikat muss auf den Rechnern installiert werden, auf denen die Signierung erfolgt. In unserem Fall ist das jeder unserer Entwickler-Rechner.

Es sollte im cert:\CurrentUser\Root-Speicher installiert werden, auch bekannt als der „Trusted Root Certification Authorities“-Speicher.

Diese Datei sollte an einem sicheren Ort aufbewahrt werden. Das Passwort sollte dann separat gesichert werden (verwenden Sie einen Passwort-Manager). Wenn ein bösartiger Akteur in den Besitz beider Dateien gelangt, kann er seine bösartigen Skripte so signieren, als ob er Sie wäre.

CER

Die CER-Zertifikatsdatei müssen Sie auf den Computern installieren, auf denen die Skripte ausgeführt werden. Für die Installation ist kein Passwort erforderlich, aber sie kann nicht zum Signieren von Skripten verwendet werden. Sie enthält nur den öffentlichen Schlüssel, der zum Entschlüsseln der Signatur verwendet wird.

Da sie den privaten Schlüssel nicht enthält, kann dieses Zertifikat frei an alle Umgebungen verteilt werden, in denen die Skripte ausgeführt werden.

Dieses Zertifikat muss in zwei Zertifikatspeichern auf den Rechnern installiert werden, auf denen die Skripte ausgeführt werden; die Speicher cert:\LocalMachine\Root und cert:\LocalMachine\TrustedPublisher.

Signieren eines Skripts

Die Funktion Set-AuthenticodeSignature wird zum Signieren der Skripte bereitgestellt. Wir müssen den Pfad zum Skript und das Zertifikat aus dem Speicher übergeben. Wir haben eine Wrapper-Funktion geschrieben, die die Skripte signieren kann.

function Set-ScriptSignatures { param ( $pathToScripts = "." ) $certificateName = "PowerShell Signing Certificate" $scripts = Get-ChildItem -Path "$pathToScripts\*" -Include *.ps1, *.psm1 -Recurse $certificate = @(Get-ChildItem cert:\CurrentUser\My -codesign | Where-Object { $_.issuer -like "*$certificateName*" } ) foreach ($script in $scripts) { Write-Host "Signing $script" Set-AuthenticodeSignature $script -Certificate $certificate }}
Vollbildmodus aufrufen Vollbildmodus beenden

Die Variable $certificateName sollte den Namen enthalten, der beim Erstellen des Zertifikats verwendet wurde.

Sie können die Funktion verwenden, indem Sie einen Pfad zu dem Verzeichnis angeben, das die Skripte enthält, und sie durchläuft eine Schleife, in der alle Skripte signiert werden.

Wenn Sie die Skripte auf dem Zielcomputer installiert haben, sollten Sie nun in der Lage sein, die Skripte ohne Probleme auszuführen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.