Schlüsselbasierte Authentifizierung in OpenSSH für Windows
Gilt für Windows Server 2022, Windows Server 2019, Windows 10 (Build 1809 und höher)
Die meisten Authentifizierungen in Windows-Umgebungen erfolgen mit einem Benutzername-Kennwort-Paar. Dies eignet sich gut für Systeme in einer gemeinsamen Domäne. Bei domänenübergreifenden Arbeiten wie beispielsweise zwischen lokalen und in der Cloud gehosteten Systemen kann dies zu Sicherheitslücken und Anfälligkeit für Brute-Force-Angriffe führen.
Im Vergleich dazu verwenden Linux-Umgebungen für die Authentifizierung häufig Paare aus einem öffentlichen und einem privaten Schlüssel, die keine leicht zu erratenden Kennwörter erfordern. OpenSSH enthält Tools zur Unterstützung der schlüsselbasierten Authentifizierung, insbesondere:
- ssh-keygen zum Generieren sicherer Schlüssel
- ssh-agent und ssh-add zum sicheren Speichern privater Schlüssel
- scp und sftp zum sicheren Kopieren öffentlicher Schlüssel bei der erstmaligen Verwendung eines Servers
Dieses Dokument bietet eine Übersicht über die Verwendung dieser Tools unter Windows für die schlüsselbasierte Authentifizierung mit SSH. Wenn Sie mit der SSH-Schlüsselverwaltung nicht vertraut sind, empfehlen wir Ihnen dringend, das NIST-Dokument IR 7966 mit dem Titel „Sicherheit der interaktiven und automatisierten Zugriffsverwaltung mit Secure Shell (SSH)“ zu lesen.
Informationen zu Schlüsselpaaren
Schlüsselpaare verweisen auf die Dateien für öffentliche und private Schlüssel, die von bestimmten Authentifizierungsprotokollen verwendet werden.
Bei der SSH-Authentifizierung mit öffentlichem Schlüssel werden asymmetrische Kryptografiealgorithmen verwendet, um zwei Schlüsseldateien (privat und öffentlich) zu generieren. Die Dateien des privaten Schlüssels entsprechen einem Kennwort und sollten unter allen Umständen gut geschützt werden. Wenn jemand Ihren privaten Schlüssel erhält, kann sich diese Person bei jedem beliebigen SSH-Server anmelden, auf den Sie Zugriff haben. Der öffentliche Schlüssel wird auf dem SSH-Server abgelegt und ggf. freigegeben, ohne dass dabei der private Schlüssel kompromittiert wird.
Die schlüsselbasierte Authentifizierung ermöglicht es dem SSH-Server und -Client, den öffentlichen Schlüssel für einen bereitgestellten Benutzernamen mit dem privaten Schlüssel zu vergleichen. Wenn der serverseitige öffentliche Schlüssel nicht anhand des clientseitigen privaten Schlüssels überprüft werden kann, schlägt die Authentifizierung fehl.
Die mehrstufige Authentifizierung kann mit Schlüsselpaaren implementiert werden, indem eine Passphrase eingegeben wird, wenn das Schlüsselpaar generiert wird (siehe Generierung des Benutzerschlüssels unten). Der Benutzer wird während der Authentifizierung zur Eingabe der Passphrase aufgefordert. Die Passphrase wird zusammen mit dem privaten Schlüssel auf dem SSH-Client zur Authentifizierung des Benutzers verwendet.
Wichtig
Eine über schlüsselbasierte Authentifizierung geöffnete Remote-Sitzung verfügt nicht über zugeordnete Benutzeranmeldeinformationen und kann daher als Benutzer keine ausgehende Authentifizierung durchführen. Dies ist beabsichtigt.
Generierung des Hostschlüssels
Öffentliche Schlüssel weisen bestimmte ACL-Anforderungen auf, die unter Windows nur den Zugriff auf Administratoren und das System erlauben. Bei der ersten Verwendung von SSHD wird das Schlüsselpaar für den Host automatisch generiert.
Wichtig
Der OpenSSH-Server muss zuerst installiert werden. Weitere Informationen finden Sie unter Erste Schritte mit OpenSSH.
Standardmäßig ist der SDSD-Dienst so konfiguriert, dass er manuell gestartet wird. Führen Sie die folgenden Befehle an einer PowerShell-Eingabeaufforderung mit erhöhten Rechten auf Ihrem Server aus, um ihn bei jedem Neustart des Servers zu starten:
# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic
# Now start the sshd service
Start-Service sshd
Da dem SSHD-Dienst kein Benutzer zugeordnet ist, werden die Hostschlüssel unter „C:\ProgramData\ssh“ gespeichert.
Generierung des Benutzerschlüssels
Sie müssen für den Client zunächst Schlüsselpaare aus öffentlichen und privaten Schlüsseln generieren, um die schlüsselbasierte Authentifizierung verwenden zu können. ssh-keygen.exe wird verwendet, um Schlüsseldateien zu generieren, und die Algorithmen DSA, RSA, ECDSA oder Ed25519 können angegeben werden. Wenn kein Algorithmus angegeben ist, wird RSA verwendet. Es sollten ein starker Algorithmus und eine sichere Schlüssellänge verwendet werden, wie ECDSA in diesem Beispiel.
Führen Sie zum Generieren von Schlüsseldateien mit dem ECDSA-Algorithmus den folgenden Befehl von einer PowerShell- oder CMD-Eingabeaufforderung auf Ihrem Client aus:
ssh-keygen -t ecdsa
Die Ausgabe des Befehls sollte die folgende Ausgabe anzeigen (wobei „Benutzername“ durch Ihren Benutzernamen ersetzt wird):
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
Sie können die EINGABETASTE drücken, um die Standardeinstellung zu übernehmen, oder einen Pfad und/oder Dateinamen angeben, in dem die Schlüssel generiert werden sollen. An diesem Punkt werden Sie aufgefordert, eine Passphrase zum Verschlüsseln der Dateien für den privaten Schlüssel zu verwenden. Die Passphrase kann leer sein, ist jedoch nicht empfehlenswert. Zusammen mit der Schlüsseldatei kann mit der Passphrase die zweistufige Authentifizierung bereitgestellt werden. In diesem Beispiel wird die Passphrase leer gelassen.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME
The key's randomart image is:
+--[ECDSA 256]--+
| . |
| o |
| . + + . |
| o B * = . |
| o= B S . |
| .=B O o |
| + =+% o |
| *oo.O.E |
|+.o+=o. . |
+----[SHA256]-----+
Jetzt verfügen Sie über ein öffentliches/privates ECDSA-Schlüsselpaar an dem angegebenen Speicherort. Die PUB-Dateien sind öffentliche Schlüssel, und Dateien ohne Erweiterung sind private Schlüssel:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/3/2021 2:55 PM 464 id_ecdsa
-a---- 6/3/2021 2:55 PM 103 id_ecdsa.pub
Beachten Sie, dass die Dateien des privaten Schlüssels dem Kennwort entsprechen und daher auf dieselbe Weise geschützt werden müssen wie Ihr Kennwort. Verwenden Sie „ssh-agent“, um die privaten Schlüssel innerhalb eines sicheren Windows-Sicherheitskontexts zu speichern, der Ihrem Windows-Konto zugeordnet ist. Führen Sie die folgenden Befehle an einer PowerShell-Eingabeaufforderung mit erhöhten Rechten aus, um den Dienst „ssh-agent“ bei jedem Neustart ihres Computers zu starten und „ssh-add“ zum Speichern des privaten Schlüssels zu verwenden:
# By default the ssh-agent service is disabled. Configure it to start automatically.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic
# Start the service
Start-Service ssh-agent
# This should return a status of Running
Get-Service ssh-agent
# Now load your key files into ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ecdsa
Nachdem Sie den Schlüssel dem „ssh-agent“ auf Ihrem Client hinzugefügt haben, ruft der „ssh-agent“ automatisch den lokalen privaten Schlüssel ab und übergibt ihn an Ihren SSH-Client.
Wichtig
Es wird dringend empfohlen, dass Sie den privaten Schlüssel an einem sicheren Speicherort verwahren und aus dem lokalen System löschen, nachdem Sie ihn zu „ssh-agent“ hinzugefügt haben. Der private Schlüssel kann nicht vom Agent abgerufen werden, vorausgesetzt, ein starker Algorithmus wurde verwendet, wie ECDSA in diesem Beispiel. Wenn Sie keinen Zugriff mehr auf den privaten Schlüssel haben, müssen Sie ein neues Schlüsselpaar erstellen und den öffentlichen Schlüssel auf allen Systemen aktualisieren, mit denen Sie interagieren.
Bereitstellen des öffentlichen Schlüssels
Der Inhalt Ihres öffentlichen Schlüssels (\.ssh\id_ecdsa.pub) muss auf dem Server in einer Textdatei abgelegt werden. Name und Speicherort der Datei hängen davon ab, ob das Benutzerkonto Mitglied der lokalen Administratorgruppe oder ein Standardbenutzerkonto ist. In den folgenden Abschnitten werden sowohl Standard- als auch Verwaltungsbenutzer behandelt.
Standardbenutzer
Der Inhalt Ihres öffentlichen Schlüssels (\.ssh\id_ecdsa.pub) muss auf dem Server in einer Textdatei namens authorized_keys
in C:\Users\username\.ssh\ abgelegt werden. Sie können Ihren öffentlichen Schlüssel mit dem sicheren Dateiübertragungsprogramm OpenSSH SCP oder mit PowerShell kopieren, um den Schlüssel in die Datei zu schreiben.
Im folgenden Beispiel wird der öffentliche Schlüssel auf den Server kopiert (wobei „username“ durch Ihren Benutzernamen ersetzt wird). Sie müssen zunächst das Kennwort für das Benutzerkonto für den Server verwenden.
# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"
# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell
Administrator
Der Inhalt Ihres öffentlichen Schlüssels (\.ssh\id_ecdsa.pub) muss auf dem Server in einer Textdatei namens administrators_authorized_keys
in C:\ProgramData\ssh\ abgelegt werden. Sie können Ihren öffentlichen Schlüssel mit dem sicheren Dateiübertragungsprogramm OpenSSH SCP oder mit PowerShell kopieren, um den Schlüssel in die Datei zu schreiben. Die Zugriffssteuerungsliste für diese Datei muss so konfiguriert werden, dass der Zugriff nur für Administratoren und das System zugelassen wird.
Im folgenden Beispiel wird der öffentliche Schlüssel auf den Server kopiert und die Zugriffssteuerungsliste konfiguriert (wobei „username“ durch Ihren Benutzernamen ersetzt wird). Sie müssen zunächst das Kennwort für das Benutzerkonto für den Server verwenden.
Hinweis
Dieses Beispiel zeigt die Schritte zum Erstellen der Datei administrators_authorized_keys
. Dies gilt nur für Administratorkonten und muss anstelle der benutzerspezifischen Datei innerhalb des Speicherorts des Benutzerprofils verwendet werden.
# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""
# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell
Für nicht-englischsprachige Versionen des Betriebssystems muss das Skript angepasst werden, um die entsprechenden Gruppennamen zu verwenden. Um Fehler bei der Erteilung von Berechtigungen für Gruppennamen zu vermeiden, kann an deren Stelle die Security Identifier (SID) verwendet werden. Die SID kann durch Ausführen von Get-LocalGroup | Select-Object Name, SID
abgerufen werden. Wenn Sie die SID anstelle des Gruppennamens verwenden, muss ihr ein Sternchen (*) vorangestellt werden. In dem folgenden Beispiel verwendet die Gruppe Administratoren die SID S-1-5-32-544
:
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""
Mit diesen Schritten wird die Konfiguration vervollständigt, die für die Verwendung der schlüsselbasierten Authentifizierung mit OpenSSH unter Windows erforderlich ist. Nachdem die PowerShell-Beispielbefehle ausgeführt wurden, kann der Benutzer von jedem Client aus, der über den privaten Schlüssel verfügt, eine Verbindung mit dem SSHD-Host herstellen.