2016-01-08 5 views
7

Ich arbeite an einem Projekt, bei dem wir Remote-Bereitstellung von Software mithilfe eines Konfigurationsmanagements durchführen, von dem ein Teil PowerShell-Skripts an Windows-Server übermittelt, die dann ausgeführt werden, um Teile unserer Einrichtung und/oder Konfiguration auszuführen.PowerShell-Skript auf Nicht-Windows-Plattform signieren?

Die aktuelle Bereitstellungsmethode schreibt die Skripts auf die Festplatte, schließt jedoch nicht das Dateihandle. Dies wurde getan, um das Skript "sicherer" zu machen, indem es verhindert, dass irgendein anderer Prozess die Datei manipuliert, bevor sie ausgeführt wird. Um das Skript auszuführen, muss PowerShell es von stdin lesen, da es kein Skript ausführt, wenn es keinen exklusiven Zugriff erhalten kann. Der Aufruf sieht in etwa so aus:

powershell.exe -Command - < C:\temp\some_name.ps1 

Dies hat eine Reihe von Nachteilen, vor allem, dass ich keine Parameter an das Skript übergeben kann. Darüber hinaus wird das Lesen großer Skripts von der Standardsprache mit schlechten Zeichen, Zeilenumbrüchen usw. funky.

Ich möchte die Skripts in einer traditionelleren Methode, z.

aber auch in dem Geist, sicherzustellen, dass nichts das Skript manipulieren kann, bevor es ausgeführt wird. Zu diesem Zweck möchte ich das Powershell-Skript signieren und Powershell mit der Ausführungsrichtlinie "AllSigned" ausführen.

Das Problem liegt darin, dass ich das Skript auf dem Zielserver nicht wirklich signieren kann, da es das gleiche Problem wie PowerShell beim Ausführen des Skripts hat ... Ich muss die exklusive Sperre freigeben, damit PowerShell die Datei signieren kann. aber es könnte manipuliert werden.

Ich entschied dann, dass, wenn ich das Skript auf dem Server, der es an die Zielmaschine liefert, das würde viel besser funktionieren würde. Unsere Software-Server für die Konfigurationsverwaltung sind jedoch alle Linux-Versionen, und ich habe mich ratlos bemüht, eine Möglichkeit zur Unterzeichnung von PowerShell-Skripten unter Linux zu finden. Mono hat Unterstützung für Authenticode, aber es gibt es nur für exes und dlls. Ich habe versucht, in die PowerShell .Net-Funktionen zu graben, fand aber, dass sie Cryptui.dll verwenden, das Windows-spezifisch ist.

An diesem Punkt greife ich für irgendwie kann ich die Signatur zu den Skripten hinzugefügt werden, oder sonst muss ich auf eine andere Art und Weise des Skripts ausführen, die nicht wirklich nativ ist. Wenn möglich, würde ich gerne in der Lage sein, die In-Memory-Signatur in einer String-Repräsentation des Skripts zu berechnen, aber ich werde eine dateibasierte Methode wählen, wenn das alles ist, was ich bekommen kann.

+0

Wir mussten Textdateien bei der Veröffentlichung signieren und eine VBox Windows VM verwenden (mit einem SHA hashed dateibasierten Volume beim Start kopiert), Spin auf der Build-Maschine und WinRb verwendet, um 'Set-AuthenticodeSignature' auf auszuführen die Dateien, heruntergefahren und die dateibasierte Volume-Kopie weggeworfen ... wirklich hässlich, aber es funktioniert wirklich gut ... schließlich wurde es mit einer benutzerdefinierten Version von "Osslsigncode" ersetzt – SushiHangover

+0

Ich habe in die Mono-Authenticode getaucht Klassen und ich denke, ich habe genug herausgefunden, um eine modifizierte Version zu machen, die auf Daten von stdin funktioniert. Ich dachte, ich würde meine Konfigurations-Management-Software die Mono-Exe aufrufen, die Zeichenfolge übergeben und dann für die signierte Version stdout lesen. Unsere Konfigurations-Management-Software läuft nativ in Ruby. Daher bin ich versucht zu versuchen, eine Ruby-Klasse mit der openssl-Bibliothek zu erstellen, um den Mono-Code zu replizieren. – AresonDeladious

+0

Konnten Sie Manipulationen nicht verhindern, indem Sie Ordner-Sicherheit verwenden, um andere Konten vor Schreibzugriff zu schützen, oder indem Sie das Skript auf einem Webserver hosten und dann mit 'iex ((New-Object System.Net.WebClient) ausführen).DownloadString ('https: //myServer/myScript.ps1')) '? Sie würden das nur in Ihrem Signatur-Skript benötigen, das dann das Skript zurückziehen und es wie erforderlich signieren könnte; Danach können Sie nach Ihrer Beschreibung verwenden. – JohnLBevan

Antwort

0

Was ist mit dem Kompilieren Ihres Skripts zu .exe?

ps2exe, oder sogar einige eingebaute .net-Anrufe können das für Sie tun.