Dela via


Nyckelbaserad autentisering i OpenSSH för Windows

De flesta autentiseringar i Windows-miljöer görs med ett par med användarnamn och lösenord, vilket fungerar bra för system som delar en gemensam domän. När du arbetar över domäner, till exempel mellan lokala och molnbaserade system, blir den här typen av autentisering sårbar för råstyrkeintrång.

Som jämförelse använder Linux-miljöer vanligtvis offentliga/privata nyckelpar för att driva autentisering som inte kräver användning av gissningsbara lösenord. OpenSSH innehåller verktyg som hjälper dig att stödja nyckelbaserad autentisering, särskilt:

  • ssh-keygen för att generera säkra nycklar.
  • ssh-agent och ssh-add för säker lagring av privata nycklar.
  • scp och sftp för att på ett säkert sätt kopiera offentliga nyckelfiler under den första användningen av en server.

Det här dokumentet innehåller en översikt över hur du använder dessa verktyg i Windows för att börja använda nyckelbaserad autentisering med Secure Shell (SSH). Om du inte är bekant med SSH-nyckelhantering rekommenderar vi starkt att du läser NIST-dokument-IR 7966, med titeln Säkerhet för interaktiv och automatiserad åtkomsthantering med secure shell (SSH).

Nyckelpar

Nyckelpar refererar till de offentliga och privata nyckelfiler som används av vissa autentiseringsprotokoll.

Autentisering med offentlig SSH-nyckel använder asymmetriska kryptografiska algoritmer för att generera två nyckelfiler – en privat och en offentlig. Varje privat nyckelfil motsvarar ett lösenord och bör vara skyddad under alla omständigheter. Om någon hämtar din privata nyckel kan de logga in som du till alla SSH-servrar som du har åtkomst till. Den offentliga nyckeln är det som placeras på SSH-servern och kan delas utan att äventyra den privata nyckeln.

SSH-servern och klienten kan använda nyckelbaserad autentisering för att jämföra den offentliga nyckeln för ett användarnamn som anges mot den privata nyckeln. Om den offentliga nyckeln på serversidan inte kan verifieras mot den privata nyckeln på klientsidan misslyckas autentiseringen.

Multifaktorautentisering kan implementeras med nyckelpar genom att ange en lösenfras när nyckelparet genereras. Mer information finns i generering av användarnycklar. Användaren uppmanas att ange lösenfrasen under autentiseringen. Lösenfrasen i kombination med förekomsten av den privata nyckeln används på SSH-klienten för att autentisera användaren.

Viktigt!

En fjärrsession som öppnas via nyckelbaserad autentisering har inte associerade användarautentiseringsuppgifter. Som ett resultat kan sessionen inte utföra utgående autentisering som användaren. Det här beteendet är avsiktligt.

Generering av värdnyckel

Offentliga nycklar har specifika krav för åtkomstkontrollistor (ACL) som i Windows endast motsvarar att tillåta åtkomst till administratörer och systemanvändaren. Första gången tjänsten sshd används genereras nyckelparet för värden automatiskt.

Viktigt!

Du måste installera OpenSSH Server innan du kan köra kommandona i den här artikeln. Mer information finns i Komma igång med OpenSSH för Windows.

Som standard måste du starta sshd manuellt. Om du vill konfigurera att den ska startas automatiskt varje gång servern startas om kör du följande kommandon från en upphöjd PowerShell-prompt på servern:

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

# Start the sshd service.
Start-Service sshd

Eftersom det inte finns någon användare som är associerad med sshd tjänsten lagras värdnycklarna under C:\ProgramData\ssh.

Generering av användarnyckel

Om du vill använda nyckelbaserad autentisering måste du först generera offentliga/privata nyckelpar för klienten. Du kan använda ssh-keygen.exe för att generera nyckelfiler och du kan ange följande algoritmer för nyckelgenerering:

  • Algoritm för digital signatur (DSA)
  • Rivest–Shamir–Adleman (RSA)
  • Elliptisk kurva digital signaturalgoritm (ECDSA)
  • ED25519

Om du inte anger någon algoritm används Ed25519. En stark algoritm och nyckellängd bör användas, till exempel ECDSA i det här exemplet.

Om du vill generera nyckelfiler med hjälp av ECDSA-algoritmen kör du följande kommando i ett PowerShell- eller kommandotolkfönster på klienten:

ssh-keygen -t ecdsa

Utdata från kommandot bör se ut som följande rader förutom att username ersätts med ditt användarnamn:

Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):

I prompten kan du välja Retur för att acceptera standardsökvägen för filen, eller så kan du ange en sökväg eller ett filnamn för dina genererade nycklar.

Därefter uppmanas du att använda en lösenfras för att kryptera dina privata nyckelfiler. I allmänhet rekommenderar vi inte att du använder en tom lösenfras eftersom lösenfrasen fungerar med nyckelfilen för att tillhandahålla tvåfaktorautentisering. Men i det här exemplet kan du lämna lösenfrasen tom.

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]-----+

Nu har du ett offentligt/privat ECDSA-nyckelpar på den angivna platsen. .pub-filen är den offentliga nyckeln och filen utan tillägg är den privata nyckeln:

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

En privat nyckelfil motsvarar ett lösenord och bör skyddas på samma sätt som du skyddar ditt lösenord. Du kan använda ssh-agent för att lagra dina privata nycklar på ett säkert sätt i en Windows-säkerhetskontext som är associerad med ditt Windows-konto. Om du vill konfigurera ssh-agent tjänsten att starta automatiskt varje gång datorn startas om och för att lagra ssh-add den privata nyckeln kör du följande kommandon i en upphöjd PowerShell-prompt på servern:

# 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

När du har lagt till nyckeln i ssh-agent tjänsten på klienten ssh-agent hämtar tjänsten automatiskt den lokala privata nyckeln och skickar den till din SSH-klient.

Viktigt!

Vi rekommenderar att du säkerhetskopierar din privata nyckel till en säker plats och sedan tar bort den från det lokala systemet när du har lagt till den i ssh-agent tjänsten. Den privata nyckeln kan inte hämtas från agenten när en stark algoritm används, till exempel ECDSA i det här exemplet. Om du förlorar åtkomsten till den privata nyckeln måste du skapa ett nytt nyckelpar och uppdatera den offentliga nyckeln på alla system som du interagerar med.

Distribuera den offentliga nyckeln

Om du vill använda användarnyckeln som du skapade tidigare måste du placera innehållet i den offentliga nyckeln (\.ssh\id_ecdsa.pub) på servern i en textfil. Namnet och platsen för filen beror på om användarkontot är medlem i den lokala administratörsgruppen eller ett standardanvändarkonto. Följande avsnitt omfattar både standardanvändare och administrativa användare.

Standardanvändare

Du måste placera innehållet i den offentliga nyckeln (\.ssh\id_ecdsa.pub) på servern i en textfil som heter authorized_keysI C:\Users\username\.ssh\. Du kan kopiera den offentliga nyckeln med hjälp av verktyget OpenSSH-säker scp filöverföring eller genom att använda PowerShell för att skriva nyckeln till filen.

Du kan använda följande kod för att kopiera den offentliga nyckeln till servern. Ersätt med ditt användarnamn på den sista raden username . Först uppmanas du att ange ett lösenord för användarkontot för servern.

# 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

Administrativ användare

Du måste placera innehållet i den offentliga nyckeln (\.ssh\id_ecdsa.pub) på servern i en textfil som heter administrators_authorized_keysI C:\ProgramData\ssh\. Du kan kopiera den offentliga nyckeln med hjälp av verktyget OpenSSH-säker scp filöverföring eller genom att använda PowerShell för att skriva nyckeln till filen. ACL:en för den här filen måste konfigureras för att endast tillåta åtkomst till administratörer och systemanvändaren.

Du kan använda följande kod för att kopiera den offentliga nyckeln till servern och konfigurera ACL:en. Ersätt med ditt användarnamn på den sista raden username . Först uppmanas du att ange ett lösenord för användarkontot för servern.

Anmärkning

I det här exemplet visas stegen för att skapa administrators_authorized_keys filen. Den här filen gäller endast för administratörskonton. Du måste använda den i stället för den användarspecifika filen på användarens profilplats.

# 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 icke-engelska lokaliserade versioner av operativsystemet måste skriptet ändras för att återspegla gruppnamn i enlighet med detta. Om du vill förhindra fel som kan uppstå när du beviljar behörigheter till gruppnamn kan du använda säkerhetsidentifieraren (SID) i stället för gruppnamnet. Du kan hämta SID genom att köra Get-LocalGroup | Select-Object Name, SID. När du använder SID i stället för gruppnamnet måste det föregås av en asterisk (*). I följande exempel använder gruppen Administratörer 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"""

De här stegen slutför konfigurationen som krävs för att använda nyckelbaserad autentisering med OpenSSH i Windows. När du har kört dessa PowerShell-kommandon kan du ansluta till sshd servern från någon klient som har den privata nyckeln.