PowerShell-Module in einem eigenen Unternehmens-Repository verwalten

Zum Schutz gegen Schadsoftware können Organisationen eigene PowerShell-Modul-Repositories mit solchen PowerShell-Modulen erstellen, die geprüft und freigegeben sind.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 3 Min.
Von
  • Dr. Holger Schwichtenberg
Inhaltsverzeichnis

Zum Schutz gegen Schadsoftware können Organisationen eigene PowerShell-Modul-Repositories mit solchen PowerShell-Modulen erstellen, die geprüft und freigegeben sind.

Die Windows PowerShell ermöglicht inzwischen, Zusatzmodule aus Internetquellen wie der PowerShell Gallery oder Chocolatey herunterladen. Gerade in Zeiten, in denen immer mehr Schadsoftware im Internet kursiert und Unternehmen zunehmend Opfer von Ransomware werden, ist das Herunterladen ausführbarer Dateien in vielen Unternehmen verboten (so in unserem Unternehmen) und damit auch der Zugang zu Online-Repositories wie der PowerShell Gallery und Chocolatey.

Es besteht die Möglichkeit, auf Basis von NuGet in einem Netzwerkpfad ein eigenes, privates Firmen-Repository für explizit (von einer dafür beauftragten Person oder Gruppe) geprüfte PowerShell-Module einzurichten.

Für die Einrichtung eines eigenen Repository sind folgende Schritte notwendig:

  1. Man richtet auf einem Server ein Verzeichnis mit einer Freigabe ein. Hier gibt man den Benutzern bzw. Benutzergruppen, die Module bereitstellen dürfen, Schreibrechte und den Nutzern nur Leserechte

    md t:\PowerShellFirmenRepository

    New-SmbShare -Path t:\PowerShellFirmenRepository -Name PowerShellFirmenRepository
    -read itv\clientadmins -FullAccess itv\TechnischerLeiter

  2. Der Bereitsteller der Module legt das Repository bei sich an. Das muss nicht auf dem Server passieren. Er kann dafür jeden Client nutzen, der Schreibzugang zu der Freigabe aus Schritt 1 hat.

    Register-PSRepository -Name FirmenRepository -SourceLocation \\Server123\PowerShellFirmenRepository -InstallationPolicy Trusted

  3. Er veröffentlicht mit Publish-Module Module aus seinem Modulverzeichnis in diesem Repository. Hier werden beispielhaft die PowerShell Community Extensions (PSCX) und die PowerShell-Erweiterungen von www.IT-Visions.de im Firmen-Repository veröffentlicht.

    Publish-Module -name PSCX -Repository FirmenRepository

    Publish-Module -name ITVisions_PowerShell_Extensions -Repository FirmenRepository

In dem Repository-Dateisystemordner findet man dann für jedes veröffentlichte Modul eine NuGet-Datei (.nupkg). Da der Name der NuGet-Datei die Versionsnummer des Moduls mit enthält, kann ein Modul in mehreren Versionen vorhanden sein (siehe Abbildung).

Eigenes PowerShell-Modul-Repository mit zwei Modulen, eins davon in zwei Versionen

Die Nutzer dieses Repository brauchen nur Leserechte auf die Dateisystemfreigabe. Sie richten das Firmen-Repository genauso ein wie der Bereitsteller:

Register-PSRepository -Name FirmenRepository -SourceLocation \\Server123\PowerShellFirmenRepository -InstallationPolicy Trusted  

Danach können kann er in dem Firmen-Repository suchen und von dort Module installieren:

# Alle Module auflisten
Find-Module -Repository FirmenRepository
# Alle Versionen eines Moduls auflisten
Find-Module -RepositoryFirmenRepository -nameITVisions_PowerShell_Extensions
-AllVersions | FT Name, Version, Description
# Modul installieren
Install-Module -name ITVisions_PowerShell_Extensions-Repository FirmenRepository

Bei der erstmaligen Ausführung von Register-PSRepository kann es zu einer Meldung kommen, dass der NuGet-Provider installiert oder aktualisiert werden muss. Wenn eine automatische Installation nicht möglich ist (z.B. aufgrund von Firewall-Beschränkungen), dann kann man den Provider auf einem berechtigten System herunterladen mit Install-PackageProvider -Name NuGet -Force -Scope Currentuser und dann die Datei Microsoft.PackageManagement.NuGetProvider.dll manuell auf die Nutzer-Systeme kopieren in C:\Program Files\PackageManagement\ProviderAssemblies\nuget\(version) oder C:\Users\(xy)\AppData\Local\PackageManagement\ProviderAssemblies\nuget\(version). ()