Anleitungen für ScriptSignierung - auf jeden Fall umsetzen!

Hallo Community,

wie einige von euch schon wissen, gibt es im APC die Möglichkeit, PowerShell-Skripte zu signieren.

Wir möchten erneut betonen, wie wichtig es ist, diese Funktion zu nutzen. Deshalb möchte ich hier kurz erläutern, warum:

Damit unsere Pakete auch Benutzerdaten installieren können oder eine alte Version bei einer Update-Installation sauber deinstalliert werden kann, werden die PowerShell-Pakete immer lokal auf dem Rechner gespeichert. In der Regel befinden sich diese unter folgendem Pfad:
C:\ProgramData\neo42Pkgs\<Hersteller>\<Softwarename>\<Version>\neo42-Install.

Falls in Zukunft entschieden wird, dass nur noch signierte PowerShell-Skripte im Unternehmen ausgeführt werden dürfen, liegen auf allen Clients unsignierte Skripte – was nachträglich nicht mehr geändert werden kann.

Mögliche Gründe für die Einführung dieser Richtlinie gibt es viele… Vielleicht sieht es eine neue ISO Zertifizierung vor oder die Cyberversicherung verlangt diesen Schritt. Natürlich trägt diese Einstellung auch zur IT-Sicherheit bei und sollte allein deshalb schon beleuchtet werden.

Daher ist es äußerst wichtig, dem vorzubeugen und das Skript-Signing in den Pipelines zu aktivieren.

Um die Einrichtung zu erleichtern, haben wir zwei Dokumente erstellt. Eines beschreibt die Empfehlungen zur Powershell-Scriptsignierung, das Andere ist eine Anleitung zur praktischen Umsetzung.

Ihr findet die Dokumente unter portal.neo42.de – relativ weit unten auf der Seite.
Oder hier über die Direktlinks:
Empfehlungen zur Powershell-Scriptsignierung
Dokumentation zur Umsetzung

Schaut sie euch an und setzt es um. Bei Fragen stehen wir euch selbstverständlich gerne zur Verfügung.

Viele Grüße
Michael

4 „Gefällt mir“

Hallo,
erstmal vielen Dank für die Anleitung!

Beim Erstellen des Script Signings im Application Package Center bekomme ich diesen Error, nachdem ich das Zertifikat, Password und Timestamp Server URL angegeben habe:

image

image

Zertifikat und Password sind korrekt, als Zeitserver habe ich den vorgegebenen und auch diverse andere ausprobiert. NTP Zugriff sollte eigentlich generell klappen.

Irgend eine Idee oder gibt es ein Log indem ich mehr Details zum Problem finde?

Viele Grüße

Hallo FLX,
ist der externe Zeitserver erreichbar?
Viele Grüße
Michael

Hallo Michael,

sorry, der Zeitserver war tatsächlich von unserer Firewall blockiert und somit nicht erreichbar. SkriptSigning funktioniert jetzt problemlos.

Auf der Hilfe-Seite von digicert findet man auch noch das Kommando um die Erreichbarkeit des Zeitservers zu testen: https://knowledge.digicert.com/solution/troubleshooting-timestamping-problems

2 „Gefällt mir“

Hi, jetzt habe ich mal kurz eine Frage als Certifikatsneuling :smiley:

Ich habe anhand der Zertifikatsvorlage nun ein Zertifikat auf dem MMS Server erstellt.

Habe dann

  1. den privaten Schlüssel exportiert, dieser wird in die Pipelines eingebunden
  2. den öffentlichen Schlüssel exportiert, dieser wird über GPO verteilt

Jetzt meine Frage. Mein Zertifikat das ich erstellt habe, hat ja eine Dauer von X.

Was passiert nun wenn das Zertifikat abläuft? Sind dann meine vorhandenen signierten Scripte verfallen…

Ich erneure mein Zertifikat am MMS Server gegen die CA.
Anschließend exportiere ich wieder privaten und öffentlichen Schlüssel? Diese werden dann in den MMS und in der GPO verteilt.
Aber was ist dann mit den Paketen die ich davor erstellt und signiert habe?
Sorry den Zusammenhang hab ich noch net erfasst, weil an den Paketen ändert sich ja der Hash nicht durch den Vorgang?!

Danke und Sorry

Hallo Roland,

sehr gute Frage, die sich schnell beantworten lässt.

Das Zertifikat muss zum Zeitpunkt der Signierung gültig sein. Aus diesem Grund wird der Zeitserver angegeben. Dieser verifiziert, dass das Zertifikat zum Zeitpunkt der Signierung gültig war. Sollte das Zertifikat in Zukunft ablaufen, bleiben also die signierten Scripte dennoch gültig.

Natürlich ist es ratsam sich einen Reminder zu stellen, damit das CodeSigning Zertifikat im MMS rechtzeitig erneuert wird.

Viele Grüße
Michael

1 „Gefällt mir“

Hi Michael,
vielen Dank für die Antwort.

Aber ich als Noob in Sachen Zertifikat hab doch noch ein paar Fragen.

Ich muss also mein Zertifkat im MMS erneuern, und den neuen Privaten key wieder im MMS Script einpflegen, damit neue Scripte signiert werden.

Muss ich auch den öffentlichen Schlüssel wieder exportieren und wieder über GPO verteilen? Damit die signierten Scripts mit dem alten und neuen privaten Keys signierten, Safe sind?

Was passiert wenn ich jetzt z.B. ein Script signiert habe und ein neues Zertifikat verwende also kein erneuern sondern ein neues ausstelle weil sich z.B die Vorlage geändert hat, oder der erneuerungszeitraum überschritten wurde?!

Sorry ich versteh hier nur Bahnhof. Ich kanns zwar technisch umsetzen, sehe aber die Zusammenhänge in der Zukunft noch net wirjklich :smiley:

Vielen Dank

Hi Roland,

wenn ein neues Codesigning Zertifikat ausgestellt wird, muss der öffentliche Schlüssel natürlich wieder verteilt werden.

Hi Danke für die Antwort also fasse ich kurz zusammen:

Neu

  1. Erstelle eine Zertifikatsvorlage
  2. Vordere ein Zertifikat mit dem APD User anhand der Vorlage an
  3. Exportiere den Privaten Schlüssel und für dem der Pipeline hinzu
  4. Öffentlicher Schlüssel wird über AD GPO oder andere Mechanismen verteilt

Ablauf

  1. Zertifikat verlängern über „dieses Zertifikat mit demselben Schlüssel erneuern“
  2. Exportieren den Privaten Schlüssel für die Pipeline
  3. öffentlicher Schlüssel wieder über GPO oder andere Mechanismen verteilen

Die alten Pakete sind weiterhin signiert mit dem alten privaten Schlüssel der über den Timestamp bei der Signierung unbegrenzt gültig ist oder nur in Verbindung mit dem neuen öffentlichen Schlüssel?
Das hab ich noch net ganz verstanden. Wenn doch ein Paket vor der Verlängerung signiert wurde ist dies ja anhand des Timestamp gültig auch wenn das Zertifikat ( öffentlicher Teil ) abläuft. Warum erneuere ich den öffentlichen Teil dann überhaupt und mache das nicht nur mit dem Privaten Schlüssel in den Pipelines?!

Sorry und vielen Dank

Hallo @rolandBB

Wenn das Zertifikat auf diesem Weg „verlängert“ wird, dann bleibt nur der private Teil gleich. Der öffentliche Teil ändert sich und muss neu verteilt werden.

Die alten Pakete behalten ihre gültige Signatur durch den Zeitstempel auch nach Ablauf des Zertifikats. Die Notwendigkeit das alte Zertifikat weiterhin zu verteilen hängt daran, dass PowerShell es benötigt, um dem Publisher zu vertrauen. Das neue Zertifikat muss verteilt werden, damit den Paketen die damit signiert werden auch vertraut wird.

Gruß
Marco

1 „Gefällt mir“

Hallo Roland,

ich habe das Ganze nochmal in meiner Umgebung nachgestellt.

  1. CodeSigning Zertifikat ausgestellt
  2. Skript signiert
  3. Skript auf einem Client mit angepasster ExecutionPolicy erfolgreich ausgeführt
  4. Das selbe Zertifikat mit „dieses Zertifikat mit demselben Schlüssel erneuern“ aktualisiert
  5. Das „neue“ Zertifikat wieder zum Signieren genutzt

Beim Ausführen des Skriptes kam nun folgende Meldung hoch:

Importiere ich nun den öffentlichen Schlüssel des „neuen“ Zertifikats, läuft dies ohne Probleme.

Hi,

hä? Ich veteile also immer den neuen öffentlichen Schlüssel nach der verlängerung, muss aber für die alten signirungen den alten öffentlichen zugänglich lassen? Dann baue ich mir ja eine ewige Liste mit abgelaufenen öffentliochen Schlüsseln auf?!

Da wir ja auch Geräte ausserhalb der Domain haben, sind wir am Überlegen ob wir hier ein öffentlich ausgestelltes Zertifikat erwerben, dass eine generelle Gültigkeit besitz unabhängig unserer Domain.

Ja richtig verstanden. Bei einer üblichen Gültigkeit von 2-3 Jahren ist das aber auch nach 10 Jahren noch eine überschaubare Liste.

Auch externe bzw. „gekaufte“ Code Signing Zertifikate muss man allerdings in den Trusted Publisher Store ablegen. Das die Zertifikate allgemein bekannt sind ändert nichts daran, dass der jeweilige Rechner ihm für die Ausführung von Skripten vertraut oder nicht.