PDQ Deploy mit „Powershell Code Signing“ nutzen

Heute zeige ich euch wie ihr PDQ Deploy in eurer Domäne mit signierten Powershell Scripten nutzen könnt.

Oftmals wird die PowerShell Execution Policy von Administratoren auf unrestricted gestellt. Dabei kann ein gewisses Risiko bestehen, da ab diesem Moment sämtliche Skripte ausgeführt werden können.  Um dieses Sicherheitsrisiko zu minimieren, können Zertifikate erstellt werden und als vertrauenswürdigen Herausgeber in der Domäne definiert werden. Über die Gruppenrichtlinie werden anschließend nur signierte Scripte zugelassen und die Sicherheit enorm erhöht.

Die Erstellung eines „Code Signing“ Zertifkates und seine Verteilung in der Domäne erfordert etwas Vorarbeit. Alle notwendigen Schritte sind auf der folgenden Seite gut dokumentiert: http://www.powershellpraxis.de/index.php/zertifikate-pki/psskripte-signieren

Nachdem wir unser „Code Signing“ Zertifikat beantragt haben, erstellen wir als nächstes eine neue GPO in der wir die Powershell Execution Policy auf „Allow only signed scripts“ stellen:

Computer Configuration –> Policies –> Administrative Templates –> Windows Components –> Windows PowerShell

Nach einem „gpupdate /force“ auf dem DC und einem entsprechenden Client können wir die Einstellung testen:

Das Script wird nicht ausgeführt da es keine digitale Signatur aufweist.

Vorsichtshalber testen wir den korrekten Erhalt unseres Zertifikates in der Powershell:

Nun bauen wir uns ein paar kleine „Helferlein“ in unser Powershell Profil ein:

$Zertifikat = dir cert:\currentuser\my -recurse –codesign

function SignScript
{
 Param
 (
 [string]$Script
 
 )
 
 Set-AuthenticodeSignature $Script $Zertifikat
 
}

function SignDeployment
{
 
 $Zertifikat = dir cert:\currentuser\my -recurse –codesign
 $Pfad=Get-ChildItem \\Server\Deployment -Filter *.ps1 -Recurse | % { $_.FullName }
 $Pfad | ForEach-Object {
 Set-AuthenticodeSignature $_ $Zertifikat
 
}
 
}

Damit haben wir nun zwei Möglichkeiten:

  1. signieren von einzelnen Scripten über SignScript Pfad (z.B. SignScript C:\Temp\Test.ps1)
  2. signieren aller Powershell Datein in unserem Deployment Share

Wir nutzen die Funktion SignScript zum signieren unserer Testdatei:

Das Testscript verfügt nun über einen Signaturcode und kann damit ausgeführt werden:

Wird nun der Signaturcode oder das Script selbst geändert wird das Script nicht ausgeführt.

Nun können unserer Scripte sicher ausgeführt werden, funktionieren aber noch nicht in PDQ Deploy.

Den Grund dafür wollen wir uns nun einmal ansehen:

Bei der Ausführung eines Paketes in PDQ Deploy wird standardmäßig unter C:\Windows\ArminArsenal ein Arbeitsverzeichnis angelegt. Bei der Ausführung einer Powershell Datei wird diese über die „Error Handling Wrapper“ Datei verarbeitet.

Seit Oktober 2017 ist diese Datei nun mit einem gültigen Zertifikat versehen welches validiert werden kann:

Das Zertifikat ist somit zwar gültig, es erfolgt aber immer noch eine Abfrage ob dem Herausgeber vertraut wird:

Eine Verteilung eines entsprechenden Paketes scheitert:

Um das Problem zu lösen führen wir erneut die Error Handling Wrapper Datei aus und beantworten die Abfrage mit A:

Nun laden wir uns in einer MMC unsere aktuellen Zertifikate, am besten führt ihr die Schritte direkt in dem entsprechenden Powershell Fenster durch:

mmc –> Hinzufügen –> Zertifikate –> Eigenes Benutzerkonto

Dort finden wir nun das PDQ Zertifikat da wir die Ausführung mit A akzeptiert haben:

Wir exportieren das Zertifikat nun:

Anschließend importieren wir das PDQ Zertifikat und falls noch nicht geschehen unser „Code Signing“ Zertifikat in unsere Powershell GPO so dass alle Domain Member den Zertifikaten vertraut:

Nach einem „gpupdate /force“ oder der obligatorischen Wartezeit funktionieren nun auch signierte Powershell Scripte per Deploy.

Once more thanks PDQ.com for making our admin lifes so much better and safer 🙂

Print Friendly, PDF & Email