Als Microsoft im August 2016 sagte, dass PowerShell ein Open-Source-Projekt werden würde, das unter Windows, Linux und macOS laufen würde, gab es eine interessante Falte im Zusammenhang mit PowerShell Remoting.Microsoft sagte, dass dieser PowerShell-Kern Remoting über Secure Shell (SSH) sowie Web Services-Management (WS-MAN) unterstützen würde. Sie könnten immer die Powershell-SSH-Binärdateien verwenden, aber die Ankündigung angegeben SSH-Unterstützung wäre ein integraler Bestandteil von Powershell sein. Dies eröffnete die Möglichkeit, die Remoteverwaltung von Windows- und Linux-Systemen mit denselben Technologien problemlos durchzuführen.
- Eine kurze Geschichte von Powershell Remoting
- Einführung von SSH auf PowerShell Core
- Installieren von OpenSSH
- Installieren der optionalen OpenSSH-Funktion
- OpenSSH von GitHub herunterladen
- OpenSSH konfigurieren
- Verwenden von PowerShell SSH remoting
- Verwenden der SSH-schlüsselbasierten Authentifizierung
- WS-MAN oder SSH Remoting?
Eine kurze Geschichte von Powershell Remoting
Microsoft eingeführt Remoting in Powershell Version 2.0 in Windows 7 und Windows Server 2008 R2, die dramatisch verändert die Landschaft für Windows-Administratoren. Sie konnten Remotedesktopsitzungen für Server erstellen, aber PowerShell-Remoting ermöglichte die gleichzeitige Verwaltung einer großen Anzahl von Servern.
Remoting in Windows PowerShell basiert auf WS-MAN, einem offenen Standard der Distributed Management Task Force. Da das WS-MAN-basierte Remoting jedoch Windows-orientiert ist, mussten Sie eine andere Technologie verwenden, normalerweise SSH, um Linux-Systeme zu verwalten.
Einführung von SSH auf PowerShell Core
SSH ist ein Protokoll zur Verwaltung von Systemen über ein möglicherweise ungesichertes Netzwerk. SSH arbeitet im Client-Server-Modus und ist der De-facto-Standard für die Remote-Verwaltung in Linux-Umgebungen.
PowerShell Core verwendet OpenSSH, eine Abzweigung von SSH 1.2.12, die unter einer Open-Source-Lizenz veröffentlicht wurde. OpenSSH ist wahrscheinlich die beliebteste SSH-Implementierung.
Der für die Verwendung von WS-MAN Remoting erforderliche Code wird als Teil des Windows-Betriebssystems installiert. Sie müssen OpenSSH manuell installieren.
Installieren von OpenSSH
Wir haben uns daran gewöhnt, Software unter Windows mit den Assistenten zu installieren, aber die Installation von OpenSSH erfordert mehr Hintergrundinformationen und mehr Arbeit vom Administrator. Ohne manuelle Eingriffe können viele Probleme auftreten.
Der Installationsprozess für OpenSSH unter Windows hat sich im Laufe der Zeit verbessert, aber es ist immer noch nicht so einfach, wie es sein sollte. Das Arbeiten mit der Konfigurationsdatei lässt zu wünschen übrig.
Bei der Installation von PowerShell SSH gibt es zwei Optionen:
- Unter Windows 10 1809, Windows Server 1809, Windows Server 2019 und höher ist OpenSSH als optionale Funktion verfügbar.
- In früheren Windows-Versionen können Sie OpenSSH von GitHub herunterladen und installieren.
Stellen Sie sicher, dass Ihr System über die neuesten Patches verfügt, bevor Sie OpenSSH installieren.
Installieren der optionalen OpenSSH-Funktion
Sie können die optionale OpenSSH-Funktion mit PowerShell installieren. Überprüfen Sie zunächst Ihr System mit dem folgenden Befehl:
Get-WindowsCapability -Online | where Name -like '*SSH*'
Abbildung 1 zeigt, dass die OpenSSH-Client-Software vorinstalliert ist.
Sie müssen Windows PowerShell für die Installation verwenden, es sei denn, Sie laden das WindowsCompatibility-Modul für PowerShell Core herunter. Anschließend können Sie das Deployment Image Servicing and Management-Modul aus Windows PowerShell importieren und die Befehle in PowerShell Core ausführen.
Installieren Sie die Server-Funktion:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Path :
Online : True
RestartNeeded : False
Die SSH-Dateien werden im C:\Windows\System32\OpenSSH ordner.
OpenSSH von GitHub herunterladen
Laden Sie zunächst die neueste Version von GitHub herunter. Die neueste Version der Installationsanweisungen finden Sie unter diesem Link.
Nachdem der Download abgeschlossen ist, entpacken Sie die ZIP-Datei C:\Program Ordner Files\OpenSSH. Ändern Sie den Standort in C:\Program Files\OpenSSH, um die SSH-Dienste zu installieren:
.\install-sshd.ps1
SetServiceObjectSecurity SUCCESS
ChangeServiceConfig2 SUCCESS
ChangeServiceConfig2 SUCCESS
OpenSSH konfigurieren
Führen Sie nach der Installation von OpenSSH einige zusätzliche Konfigurationsschritte durch.
Stellen Sie sicher, dass der OpenSSH-Ordner in der Umgebungsvariablen system path enthalten ist:
- C:\Windows\System32\OpenSSH \ wenn als optionale Windows-Funktion installiert
- C:\Program Files\OpenSSH\ wenn über den OpenSSH-Download installiert
Stellen Sie die beiden Dienste so ein, dass sie automatisch gestartet werden:
Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic
Wenn Sie OpenSSH mit der optionalen Funktion installiert haben, erstellt Windows eine neue Firewallregel, um den eingehenden Zugriff von SSH über Port 22 zu ermöglichen. Wenn Sie OpenSSH aus dem Download installiert haben, erstellen Sie die Firewallregel mit diesem Befehl:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22
Starten Sie den sshd-Dienst, um die SSH-Schlüssel zu generieren:
Start-Service sshd
Die SSH-Schlüssel und die Konfigurationsdatei befinden sich in C:\ProgramData\ssh , welches ein versteckter Ordner ist. Die von SSH verwendete Standard-Shell ist die Windows-Befehlsshell. Dies muss in PowerShell geändert werden:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\6\pwsh.exe" -PropertyType String -Force
Wenn Sie nun über SSH eine Verbindung zum System herstellen, wird PowerShell Core gestartet und ist die Standard-Shell. Sie können auch die Standard-Shell Windows Powershell machen, falls gewünscht.
Es gibt einen Fehler in OpenSSH unter Windows. Es funktioniert nicht mit Pfaden mit Leerzeichen, z. B. dem Pfad zur ausführbaren PowerShell Core-Datei! Die Problemumgehung besteht darin, einen symbolischen Link zu erstellen, der einen Pfad erstellt, den OpenSSH verwenden kann:
New-Item -ItemType SymbolicLink -Path C:\pwsh -Target 'C:\Program Files\PowerShell\6'
Deaktivieren Sie in der Datei sshd_config die folgenden Zeilen:
PubkeyAuthentication yes
PasswordAuthentication yes
Fügen Sie diese Zeile vor anderen Subsystemzeilen:
Subsystem powershell C:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile
Dies weist OpenSSH an, PowerShell Core auszuführen.
Kommentieren Sie die Zeile aus:
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
Nachdem Sie die Änderungen an der Datei sshd_config gespeichert haben, starten Sie die Dienste neu:
Restart-Service sshd
Start-Service ssh-agent
Sie müssen den sshd-Dienst nach jeder Änderung der Konfigurationsdatei neu starten.
Verwenden von PowerShell SSH remoting
Remoting über SSH ist dem Remoting über WS-MAN sehr ähnlich. Sie können direkt mit Invoke-Command auf das Remote-System zugreifen:
Invoke-Command -HostName W19DC01 -ScriptBlock {Get-Process}
richard@MANTICORE@w19dc01's password:
Sie erhalten eine Eingabeaufforderung für das Passwort, die während der Eingabe nicht angezeigt wird.
Wenn Sie sich zum ersten Mal über SSH mit dem Remote-System verbunden haben, wird eine ähnliche Meldung angezeigt:
The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?
Geben Sie yes ein und drücken Sie die Eingabetaste.
Sie können eine Remoting-Sitzung erstellen:
$sshs = New-PSSession -HostName W19FS01
richard@MANTICORE@w19fs01's password:
Und dann verwenden:
Invoke-Command -Session $sshs -ScriptBlock {$env:COMPUTERNAME}
W19FS01
Sie können eine OpenSSH-Remoting-Sitzung mit Enter-PSSession auf die gleiche Weise wie eine WS-MAN-Sitzung eingeben. Sie können eine vorhandene Sitzung eingeben oder den Parameter HostName in Enter-PSSession verwenden, um die interaktive Sitzung zu erstellen.
Sie können eine SSH-basierte Sitzung nicht trennen; das ist eine WS-MAN-Technik.
Sie können WS-MAN- und SSH-Sitzungen verwenden, um mehrere Computer zu verwalten, wie in Abbildung 2 gezeigt.
Die Sitzungsinformationen zeigen die verschiedenen Transportmechanismen – WS-MAN bzw. SSH – und den Endpunkt, der von jeder Sitzung verwendet wird.
Wenn Sie sich Abbildung 2 genau ansehen, werden Sie feststellen, dass in der SSH-Sitzung keine Eingabeaufforderung für das Kennwort angezeigt wurde, da das System mit einer SSH-schlüsselbasierten Authentifizierung eingerichtet wurde.
Verwenden der SSH-schlüsselbasierten Authentifizierung
Öffnen Sie eine PowerShell-Sitzung mit erhöhten Rechten. Ändern Sie den Speicherort in den .ssh-Ordner in Ihrem Benutzerbereich:
Set-Location -Path ~\.ssh
Generieren Sie das Schlüsselpaar:
ssh-keygen -t ed25519
Fügen Sie die Schlüsseldatei in den SSH-Agenten auf dem lokalen Computer ein:
ssh-add id_ed25519
Sobald Sie den privaten Schlüssel in SSH-agent hinzugefügt haben, sichern Sie den privaten Schlüssel an einem sicheren Ort und löschen Sie den Schlüssel von der lokalen Maschine.
Kopieren Sie die id_ed25519.pub-Datei in die .ssh-Ordner für das passende Benutzerkonto auf dem Remote-Server. Sie können bei Bedarf ein solches Konto erstellen:
$pwd = Read-Host -Prompt 'Password' -AsSecureString
Password: ********
New-LocalUser -Name Richard -Password $pwd -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member Richard
Kopieren Sie auf dem Remote-Computer den Inhalt der Schlüsseldatei in die Datei authorized_keys:
scp id_ed25519.pub authorized_keys
Für die Datei authorized_keys müssen die Berechtigungen geändert werden:
- Öffnen Sie den Datei–Explorer, klicken Sie mit der rechten Maustaste auf authorized_keys und navigieren Sie zu Eigenschaften – Sicherheit – Erweitert
- Klicken Sie auf Vererbung deaktivieren.
- Wählen Sie Vererbte Berechtigungen in explizite Berechtigungen für dieses Objekt konvertieren aus.
- Entfernen Sie alle Berechtigungen mit Ausnahme des SYSTEMS und Ihres Benutzerkontos. Beide sollten die volle Kontrolle haben.
Sie sehen Verweise auf die Verwendung des OpenSSHUtils-Moduls zum Festlegen der Berechtigungen, aber es gibt einen Fehler in der Version aus der PowerShell-Galerie, der die Datei authorized_keys unbrauchbar macht.
Starten Sie den sshd-Dienst auf dem Remotecomputer neu.
Sie können nun eine Verbindung zum Remote-Computer herstellen, ohne ein Kennwort zu verwenden, wie in Abbildung 2 gezeigt.
Wenn Sie von einem Computer in der Domäne aus eine Verbindung zu einem Nicht-Domänencomputer herstellen, müssen Sie den Parameter UserName verwenden, nachdem Sie die Schlüsselpaar-Authentifizierung aktiviert haben:
$ss = New-PSSession -HostName W19ND01 -UserName Richard
Sie benötigen den Benutzernamen auf dem Remote-Computer, um mit Ihrem Domain-Benutzernamen übereinzustimmen. Sie werden nicht zur Eingabe eines Passworts aufgefordert.
WS-MAN oder SSH Remoting?
Sollten Sie WS-MAN oder SSH-basiertes Remoting verwenden? WS-MAN Remoting ist auf allen Windows-Systemen verfügbar und standardmäßig auf Windows Server 2012 und späteren Serverversionen aktiviert. WS-MAN Remoting hat einige Probleme, insbesondere das Double-Hop-Problem. WS-MAN benötigt auch zusätzliche Arbeit, um auf Nicht-Domänensysteme zuzugreifen.
SSH-Remoting ist nur in PowerShell Core verfügbar; Windows PowerShell ist auf WS-MAN-Remoting beschränkt. Die Installation und Konfiguration von SSH Remoting erfordert viel Arbeit. Die Dokumentation ist nicht so gut, wie es sein muss. Die Vorteile von SSH-Remoting bestehen darin, dass Sie problemlos auf Nicht-Domänen-Computer und Nicht-Windows-Systeme zugreifen können, auf denen SSH der Standard für den Remotezugriff ist.