Freigeben über


Schlüsselbasierte Authentifizierung in OpenSSH für Windows

Die meisten Authentifizierungen in Windows-Umgebungen erfolgen mit einem Benutzername-Kennwort-Paar. Dies eignet sich gut für Systeme in einer gemeinsamen Domäne. Wenn Sie domänenübergreifend arbeiten, z. B. zwischen lokalen und in der Cloud gehosteten Systemen, wird diese Art der Authentifizierung anfällig für Brute-Force-Eindringlinge.

Im Vergleich dazu verwenden Linux-Umgebungen häufig öffentliche/private Schlüsselpaare, um die Authentifizierung zu fördern, die keine erratenden Kennwörter erfordert. 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 , um öffentliche Schlüsseldateien während der anfänglichen Verwendung eines Servers sicher zu kopieren.

Dieses Dokument enthält eine Übersicht über die Verwendung dieser Tools unter Windows, um mit der Verwendung der schlüsselbasierten Authentifizierung mit Secure Shell (SSH) zu beginnen. Wenn Sie mit der SSH-Schlüsselverwaltung nicht vertraut sind, empfehlen wir Dringend, das NIST-Dokument IR 7966 mit dem Titel "Sicherheit der interaktiven und automatisierten Zugriffsverwaltung mit Secure Shell (SSH)" zu überprüfen.

Schlüsselpaare

Schlüsselpaare verweisen auf die Dateien für öffentliche und private Schlüssel, die von bestimmten Authentifizierungsprotokollen verwendet werden.

Die SSH-Authentifizierung für öffentliche Schlüssel verwendet asymmetrische Kryptografiealgorithmen, um zwei Schlüsseldateien zu generieren– eine private und die andere öffentliche. Jede private Schlüsseldatei entspricht einem Kennwort und sollte unter allen Umständen geschützt bleiben. 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 ist das, was auf dem SSH-Server platziert wird und freigegeben werden kann, ohne den privaten Schlüssel zu beeinträchtigen.

Der SSH-Server und der Client können die schlüsselbasierte Authentifizierung verwenden, um den öffentlichen Schlüssel für einen Benutzernamen zu vergleichen, der mit dem privaten Schlüssel bereitgestellt wird. 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. Weitere Informationen finden Sie unter "Benutzerschlüsselgenerierung". Der Benutzer wird während der Authentifizierung zur Eingabe der Passphrase aufgefordert. Die Passphrase in Kombination mit dem Vorhandensein des privaten Schlüssels wird auf dem SSH-Client verwendet, um den Benutzer zu authentifizieren.

Wichtig

Eine Remotesitzung, die über die schlüsselbasierte Authentifizierung geöffnet wird, verfügt nicht über zugeordnete Benutzeranmeldeinformationen. Daher kann die Sitzung keine ausgehende Authentifizierung als Benutzer durchführen. Dieses Verhalten ist beabsichtigt.

Generierung des Hostschlüssels

Öffentliche Schlüssel verfügen über bestimmte Anforderungen an die Zugriffssteuerungsliste (Access Control List, ACL), die unter Windows nur dem Zugriff auf Administratoren und den Systembenutzer entsprechen. Wenn der sshd Dienst zum ersten Mal verwendet wird, wird das Schlüsselpaar für den Host automatisch generiert.

Wichtig

Sie müssen OpenSSH-Server installieren, bevor Sie die Befehle in diesem Artikel ausführen können. Weitere Informationen finden Sie unter "Erste Schritte mit OpenSSH für Windows".

Standardmäßig müssen Sie sshd manuell starten. Führen Sie die folgenden Befehle aus einer PowerShell-Eingabeaufforderung mit erhöhten Rechten auf Ihrem Server aus, um sie automatisch zu konfigurieren, wenn der Server neu gestartet wird:

# Set the sshd service to be started automatically.
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Start the sshd service.
Start-Service sshd

Da dem Dienst kein Benutzer zugeordnet sshd 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. Sie können zum Generieren von Schlüsseldateien verwenden ssh-keygen.exe und die folgenden Algorithmen für die Schlüsselgenerierung angeben:

  • Digitaler Signaturalgorithmus (Digital Signature Algorithm, DSA)
  • Rivest–Shamir–Adleman (RSA)
  • Algorithmus für digitale Signaturen mit elliptischen Kurven (ECDSA)
  • Ed25519

Wenn Sie keinen Algorithmus angeben, wird Ed25519 verwendet. Es sollten ein starker Algorithmus und eine sichere Schlüssellänge verwendet werden, wie ECDSA in diesem Beispiel.

Um Schlüsseldateien mithilfe des ECDSA-Algorithmus zu generieren, führen Sie den folgenden Befehl in einem PowerShell- oder Eingabeaufforderungsfenster auf Ihrem Client aus:

ssh-keygen -t ecdsa

Die Ausgabe des Befehls sollte wie die folgenden Zeilen aussehen, mit der Ausnahme, dass username sie 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):

An der Eingabeaufforderung können Sie die EINGABETASTE auswählen, um den Standarddateipfad zu akzeptieren, oder Sie können einen Pfad oder Dateinamen für die generierten Schlüssel angeben.

Als Nächstes werden Sie aufgefordert, eine Passphrase zum Verschlüsseln Ihrer privaten Schlüsseldateien zu verwenden. Im Allgemeinen wird die Verwendung einer leeren Passphrase nicht empfohlen, da die Passphrase mit der Schlüsseldatei funktioniert, um die zweistufige Authentifizierung bereitzustellen. In diesem Beispiel können Sie die Passphrase jedoch leer lassen.

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 am angegebenen Speicherort. Die PUB-Datei ist der öffentliche Schlüssel, und die Datei ohne Erweiterung ist der 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

Eine private Schlüsseldatei entspricht einem Kennwort und sollte auf die gleiche Weise geschützt werden, wie Sie Ihr Kennwort schützen. Sie können ihre ssh-agent privaten Schlüssel sicher in einem Windows-Sicherheitskontext speichern, der Ihrem Windows-Konto zugeordnet ist. Um den ssh-agent Dienst so zu konfigurieren, dass er bei jedem Neustart des Computers automatisch gestartet wird und zum Speichern des privaten Schlüssels verwendet ssh-add werden soll, führen Sie die folgenden Befehle an einer PowerShell-Eingabeaufforderung mit erhöhten Rechten auf Ihrem Server aus:

# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service.
Start-Service ssh-agent

# The following command should return a status of Running.
Get-Service ssh-agent

# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa

Nachdem Sie den ssh-agent Schlüssel zum Dienst auf Ihrem Client hinzugefügt haben, ruft der ssh-agent Dienst automatisch den lokalen privaten Schlüssel ab und übergibt ihn an Ihren SSH-Client.

Wichtig

Es wird empfohlen, Ihren privaten Schlüssel an einem sicheren Speicherort zu sichern und dann aus dem lokalen System zu löschen, nachdem Sie ihn dem ssh-agent Dienst hinzugefügt haben. Der private Schlüssel kann nicht vom Agent abgerufen werden, wenn ein starker Algorithmus verwendet wird, z. B. ECDSA in diesem Beispiel. Wenn Sie den Zugriff auf den privaten Schlüssel verlieren, 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

Um den zuvor erstellten Benutzerschlüssel zu verwenden, müssen Sie den Inhalt Des öffentlichen Schlüssels (\.ssh\id_ecdsa.pub) auf dem Server in eine Textdatei platzieren. Der Name und Speicherort der Datei hängen davon ab, ob das Benutzerkonto Mitglied der lokalen Administratorgruppe oder eines Standardbenutzerkontos ist. In den folgenden Abschnitten werden sowohl Standard- als auch Verwaltungsbenutzer behandelt.

Standardbenutzer

Sie müssen den Inhalt Ihres öffentlichen Schlüssels (\.ssh\id_ecdsa.pub) in eine Textdatei auf dem Server einfügen, die in C:\Users\username\.ssh\ gespeichert und authorized_keys genannt wird. Sie können Ihren öffentlichen Schlüssel mithilfe des Sicheren Dateiübertragungsprogramms OpenSSH scp oder mithilfe von PowerShell kopieren, um den Schlüssel in die Datei zu schreiben.

Sie können den folgenden Code verwenden, um den öffentlichen Schlüssel auf den Server zu kopieren. Ersetzen Sie username in der letzten Zeile durch Ihren Benutzernamen. Zunächst werden Sie aufgefordert, ein Kennwort für das Benutzerkonto für den Server einzugeben.

# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub

# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell

Administrator

Sie müssen den Inhalt Ihres öffentlichen Schlüssels (\.ssh\id_ecdsa.pub) auf dem Server in eine Textdatei mit dem Namen administrators_authorized_keys im Verzeichnis C:\ProgramData\ssh\ einfügen. Sie können Ihren öffentlichen Schlüssel mithilfe des Sicheren Dateiübertragungsprogramms OpenSSH scp oder mithilfe von PowerShell kopieren, um den Schlüssel in die Datei zu schreiben. Die ACL für diese Datei muss so konfiguriert werden, dass nur der Zugriff auf Administratoren und den Systembenutzer zulässig ist.

Sie können den folgenden Code verwenden, um den öffentlichen Schlüssel auf den Server zu kopieren und die ACL zu konfigurieren. Ersetzen Sie username in der letzten Zeile durch Ihren Benutzernamen. Zunächst werden Sie aufgefordert, ein Kennwort für das Benutzerkonto für den Server einzugeben.

Hinweis

Dieses Beispiel zeigt die Schritte zum Erstellen der Datei administrators_authorized_keys. Diese Datei gilt nur für Administratorkonten. Sie müssen sie anstelle der benutzerspezifischen Datei innerhalb des Profilspeicherorts des Benutzers verwenden.

# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub

# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell

Für nicht englische lokalisierte Versionen des Betriebssystems muss das Skript geändert werden, um Gruppennamen entsprechend widerzuspiegeln. Um Fehler zu vermeiden, die auftreten können, wenn Sie Gruppennamen Berechtigungen erteilen, können Sie anstelle des Gruppennamens die Sicherheits-ID (SID) verwenden. Sie können die SID abrufen, indem Sie Get-LocalGroup | Select-Object Name, SID ausführen. Wenn Sie die SID anstelle des Gruppennamens verwenden, muss ihm 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 Sie diese PowerShell-Befehle ausgeführt haben, können Sie von jedem Client mit dem privaten Schlüssel eine Verbindung mit dem sshd Host herstellen.