So erzwingen Sie, dass PowerShell kein interaktives Befehlsfenster zulässt

7

Ich bin ein Citrix- Administrator und möchte die allgemeine Benutzerpopulation auf unseren Servern daran hindern, PowerShell zum Ausführen eigener Skripts oder zur interaktiven Verwendung zu verwenden. Wir verbieten bereits die Verwendung der Eingabeaufforderung über das Gruppenrichtlinienobjekt , aber mit PowerShell ist dies im Grunde genommen nutzlos.

Ich habe festgestellt, dass Powershell.exe eine Befehlszeilenoption hat, mit -NoInteractiveder ein Benutzer ein Skript ausführen kann, die ihm jedoch keine interaktive Eingabeaufforderung bietet. Das Problem ist, dass ich keinen Weg gefunden habe, Powershell zu zwingen, auf diese Weise zu arbeiten. Ich bin sogar so weit gegangen, ein Startskript C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Microsoft.PowerShell_profile.ps1 zu erstellen, das nach dem -NoInteractiveParameter sucht, aber Benutzer können dies umgehen, indem sie einfach Powershell.exe mit dem -NoProfileParameter starten .

Das andere Problem ist, dass wir viele PowerShell-Skripte verwenden, um Anwendungen für Benutzer zu starten, und Teile des Anmeldeskripts in PowerShell geschrieben sind und im Benutzerkontext ausgeführt werden müssen, sodass ich die EXE-Datei nicht einfach mit einer ACL versehen kann. Ich brauche sie, um PowerShell verwenden zu können, nur nicht interaktiv. Letztendlich möchten wir die AllSignedAusführungsrichtlinie durchsetzen und alle Skripte signieren, damit ein Benutzer nur ein Skript ausführen kann, das wir (die Administratoren) erstellt und / oder abgemeldet haben.

Ich habe versucht, nach dieser Antwort zu googeln und habe festgestellt, dass viele Leute sie verwenden -NoInteractive, aber ich habe keine Instanz gefunden, in der jemand versucht hat, sie zu erzwingen. Irgendwelche Ideen?

SalamanderMN
quelle
Ich denke, Sie haben bereits einen Teil der Lösung. Das Signieren der Skripte und das Durchsetzen einer Richtlinie, um zu verhindern, dass nicht signierte Skripte ausgeführt werden, klingt nach einem guten Plan. Sie müssen jedoch noch die interaktive Nutzung abdecken.
Dominic Cronin

Antworten:

11

Ich denke, Sie verstehen die Verwendung des Schalters -NonInteractive falsch. Sie können weiterhin ausgeführt werden powershell -noninteractiveund eine interaktive Eingabeaufforderung erhalten. Der nicht interaktive Switch ist für automatisierte Skriptszenarien vorgesehen, in denen Powershell keine Eingabeaufforderung an den Benutzer senden und auf eine Antwort warten soll. Wenn Sie beispielsweise in einem nicht interaktiven PowerShell-Fenster Get-Credentialohne Parameter ausgeführt werden, schlägt dies sofort fehl, anstatt zur Eingabe eines Benutzernamens und eines Kennworts aufzufordern. Nicht interaktiv fungiert NICHT als Sicherheitsmechanismus.

Eine bessere Methode besteht darin, das zu schützen, was Sie schützen möchten, und nicht die Tools, mit denen ein Benutzer möglicherweise darauf zugreift.

jbsmith
quelle
Vielen Dank für den Hinweis. Ich habe dies getestet, indem ich "Powershell.exe -nointeractive" aus dem Feld "Ausführen" ausgeführt habe, und es würde sofort verschwinden, also nahm ich an, dass dies das Verhalten war. Es stellt sich heraus, dass es fehlgeschlagen ist, weil ich -NoInteractive anstelle von -NonInteractive verwendet habe. Gesichtspalme
SalamanderMN
Obwohl mein Problem bleibt. Ich muss noch einen Weg finden, um Powershell so einzuschränken, wie Microsoft die Einschränkung der Eingabeaufforderung entworfen hat. In einer Mehrbenutzerumgebung ist es relativ üblich, Benutzer vor Selbstverletzungen zu schützen. (insbesondere diejenigen, die nicht IT-versiert sind) Meine Benutzer haben keinen Grund, PowerShell zu verwenden, daher möchte ich es sperren.
SalamanderMN
2
Nun, ich kenne keinen Weg, besonders wenn Sie Powershell für Anmeldeskripte verwenden möchten. Machen Sie Ihre Benutzer nicht zu lokalen Administratoren, legen Sie keine richtigen ACLs für Dateien / Ordner fest, und ich sehe nicht, wo das Problem liegt. Wenn Sie einen IT-versierten Benutzer haben, können diese möglicherweise PowerShell verwenden, um ihre Arbeit zu beschleunigen. Wenn ein Benutzer die Berechtigung zum Löschen einer Datei hat, kann er dies unabhängig davon tun, ob er auf PowerShell zugreifen kann oder nicht. Wenn Sie es blockieren MÜSSEN, müssen Sie die Datei meiner Meinung nach mit einer ACL versehen und dann einen anderen Weg finden, um Ihre ps1-Skripte zu starten (Host der PS-Laufzeit in einer C # -App?).
Jbsmith
1

Ich glaube, ich habe eine Lösung, die funktionieren wird, obwohl sie nicht besonders hübsch ist. User jbsmith war auf dem richtigen Weg. Wenn ich die powershell.exe am Ende ACLing entfernen Ausführen von der Gruppe Benutzer - Berechtigungen, die sie vom Laufen ein interaktives Fenster stoppt. Für die PowerShell-Skripts, die die Benutzer über das Anmeldeskript ausführen müssen, können wir diese Skripte mithilfe von PowerGUI in eine EXE- Datei kompilieren. Dadurch können die Skripts ausgeführt werden, da dadurch die ausführbare PowerShell-Datei nicht aufgerufen wird.

Wir überlegen, ob wir diesen Schritt noch weiter gehen und ein AppLocker- Gruppenrichtlinienobjekt verwenden möchten, um PowerShell-Skripts nur auf diejenigen zu beschränken, die wir gesegnet haben. Natürlich können wir diese Einschränkungen nur für den durchschnittlichen Nicht-IT-Benutzer festlegen und unseren Administratoren ermöglichen, PowerShell weiterhin wie gewohnt zu verwenden. Dies erfordert einen gewissen Verwaltungsaufwand für die Wartung, sodass der AppLocker-Teil möglicherweise nicht zum Tragen kommt.

SalamanderMN
quelle