Delen via


Verificatie op basis van sleutels in OpenSSH voor Windows

De meeste verificatie in Windows-omgevingen wordt uitgevoerd met een combinatie van gebruikersnaam en wachtwoord, die goed werkt voor systemen die een gemeenschappelijk domein delen. Wanneer u in meerdere domeinen werkt, zoals tussen on-premises en in de cloud gehoste systemen, wordt dit type verificatie kwetsbaar voor beveiligingsaanvallen.

Ter vergelijking: Linux-omgevingen gebruiken vaak openbare/persoonlijke sleutelparen om verificatie te stimuleren waarvoor het gebruik van radenbare wachtwoorden niet nodig is. OpenSSH bevat hulpprogramma's ter ondersteuning van verificatie op basis van sleutels, met name:

  • ssh-keygen voor het genereren van beveiligde sleutels.
  • ssh-agent en ssh-add voor het veilig opslaan van privésleutels.
  • scp en sftp- om openbare-sleutelbestanden veilig te kopiëren tijdens het eerste gebruik van een server.

Dit document bevat een overzicht van het gebruik van deze hulpprogramma's in Windows voor het gebruik van verificatie op basis van sleutels met SSH (Secure Shell). Als u niet bekend bent met SSH-sleutelbeheer, raden we u ten zeerste aan NIST-document IR 7966, getiteld Beveiliging van interactief en geautomatiseerd toegangsbeheer met behulp van SSH-(Secure Shell).

Sleutelparen

Sleutelparen verwijzen naar de openbare en persoonlijke sleutelbestanden die worden gebruikt door bepaalde verificatieprotocollen.

Verificatie met openbare SSH-sleutels maakt gebruik van asymmetrische cryptografische algoritmen om twee sleutelbestanden te genereren: één persoonlijke en de andere openbare. Elk privésleutelbestand is het equivalent van een wachtwoord en moet onder alle omstandigheden beveiligd blijven. Als iemand uw persoonlijke sleutel verkrijgt, kan hij of zij zich aanmelden bij elke SSH-server waar u toegang toe hebt. De openbare sleutel is wat op de SSH-server wordt geplaatst en kan worden gedeeld zonder de persoonlijke sleutel in gevaar te brengen.

De SSH-server en -client kunnen verificatie op basis van sleutels gebruiken om de openbare sleutel te vergelijken voor een gebruikersnaam die is opgegeven met de persoonlijke sleutel. Als de openbare sleutel aan de serverzijde niet kan worden gevalideerd met de persoonlijke sleutel aan de clientzijde, mislukt de verificatie.

Meervoudige verificatie kan worden geïmplementeerd met sleutelparen door een wachtwoordzin in te voeren wanneer het sleutelpaar wordt gegenereerd. Zie generatie van gebruikerssleutelsvoor meer informatie. De gebruiker wordt tijdens de verificatie gevraagd om de wachtwoordzin. De wachtwoordzin in combinatie met de aanwezigheid van de persoonlijke sleutel wordt gebruikt op de SSH-client om de gebruiker te verifiëren.

Belangrijk

Een externe sessie die wordt geopend via verificatie op basis van sleutels, heeft geen gebruikersreferenties. Als gevolg hiervan is de sessie niet in staat om als gebruiker uitgaande verificatie te verrichten. Dit gedrag is standaard.

Genereren van hostsleutels

Openbare sleutels hebben specifieke ACL-vereisten (Toegangsbeheerlijst) die in Windows gelijk zijn aan alleen toegang tot beheerders en de systeemgebruiker. De eerste keer dat de sshd-service wordt gebruikt, wordt het sleutelpaar voor de host automatisch gegenereerd.

Belangrijk

U moet OpenSSH Server installeren voordat u de opdrachten in dit artikel kunt uitvoeren. Zie Aan de slag met OpenSSH voor Windowsvoor meer informatie.

Standaard moet u sshd handmatig starten. Voer de volgende opdrachten uit vanaf een PowerShell-prompt met verhoogde bevoegdheid op uw server om deze zo te configureren dat deze automatisch wordt gestart wanneer de server opnieuw wordt opgestart:

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

# Start the sshd service.
Start-Service sshd

Omdat er geen gebruiker is gekoppeld aan de sshd-service, worden de hostsleutels opgeslagen onder C:\ProgramData\ssh.

Genereren van gebruikerssleutels

Als u verificatie op basis van sleutels wilt gebruiken, moet u eerst openbare/persoonlijke sleutelparen genereren voor uw client. U kunt ssh-keygen.exe gebruiken om sleutelbestanden te genereren en u kunt de volgende algoritmen voor het genereren van sleutels opgeven:

  • Digital Signature Algorithm (DSA)
  • Rivest–Shamir–Adleman (RSA)
  • Elliptic Curve Digital Signature Algorithm (ECDSA)
  • Ed25519

Als u geen algoritme opgeeft, wordt Ed25519 gebruikt. In dit voorbeeld moet een sterk algoritme en sleutellengte worden gebruikt, zoals ECDSA.

Als u sleutelbestanden wilt genereren met behulp van het ECDSA-algoritme, voert u de volgende opdracht uit in een PowerShell- of opdrachtpromptvenster op uw client:

ssh-keygen -t ecdsa

De uitvoer van de opdracht moet eruitzien als de volgende regels, behalve dat username wordt vervangen door uw gebruikersnaam:

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

Bij de prompt kunt u Enter selecteren om het standaardbestandspad te accepteren, of u kunt een pad of bestandsnaam opgeven voor de gegenereerde sleutels.

Vervolgens wordt u gevraagd om een wachtwoordzin te gebruiken om uw persoonlijke sleutelbestanden te versleutelen. Over het algemeen wordt het niet aanbevolen om een lege wachtwoordzin te gebruiken, omdat de wachtwoordzin met het sleutelbestand werkt om tweeledige verificatie te bieden. Maar voor dit voorbeeld kunt u de wachtwoordzin leeg laten.

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

U hebt nu een openbaar/persoonlijk ECDSA-sleutelpaar op de opgegeven locatie. Het PUB-bestand is de openbare sleutel en het bestand zonder extensie is de persoonlijke sleutel:

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

Een persoonlijke-sleutelbestand is het equivalent van een wachtwoord en moet op dezelfde manier worden beveiligd als u uw wachtwoord beveiligt. U kunt ssh-agent gebruiken om uw persoonlijke sleutels veilig op te slaan in een Windows-beveiligingscontext die is gekoppeld aan uw Windows-account. Als u de ssh-agent-service zo wilt configureren dat deze automatisch wordt gestart wanneer uw computer opnieuw wordt opgestart en ssh-add wilt gebruiken om de persoonlijke sleutel op te slaan, voert u de volgende opdrachten uit bij een PowerShell-prompt met verhoogde bevoegdheid op uw server:

# 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

Nadat u de sleutel aan de ssh-agent-service op uw client hebt toegevoegd, haalt de ssh-agent service automatisch de lokale persoonlijke sleutel op en geeft deze door aan uw SSH-client.

Belangrijk

U wordt aangeraden een back-up te maken van uw persoonlijke sleutel naar een veilige locatie en deze vervolgens te verwijderen uit het lokale systeem nadat u deze hebt toegevoegd aan de ssh-agent-service. De privésleutel kan niet worden opgehaald uit de sleutelbeheeragent wanneer een sterk algoritme, zoals ECDSA in dit voorbeeld, wordt gebruikt. Als u geen toegang meer hebt tot de persoonlijke sleutel, moet u een nieuw sleutelpaar maken en de openbare sleutel bijwerken op alle systemen waarmee u communiceert.

De openbare sleutel implementeren

Als u de gebruikerssleutel wilt gebruiken die u eerder hebt gemaakt, moet u de inhoud van uw openbare sleutel (\.ssh\id_ecdsa.pub) op de server in een tekstbestand plaatsen. De naam en locatie van het bestand zijn afhankelijk van of het gebruikersaccount lid is van de lokale beheerdersgroep of een standaardgebruikersaccount. In de volgende secties worden zowel standaardgebruikers als gebruikers met beheerdersrechten behandeld.

Standaardgebruiker

U moet de inhoud van uw openbare sleutel (\.ssh\id_ecdsa.pub) op de server plaatsen in een tekstbestand dat de naam authorized_keys draagt binnen de map C:\Users\username\.ssh\. U kunt uw openbare sleutel kopiëren met behulp van het OpenSSH-scp hulpprogramma voor beveiligde bestandsoverdracht of met behulp van PowerShell om de sleutel naar het bestand te schrijven.

U kunt de volgende code gebruiken om de openbare sleutel naar de server te kopiëren. Vervang in de laatste regel username door uw gebruikersnaam. In eerste instantie wordt u gevraagd een wachtwoord in te voeren voor het gebruikersaccount voor de server.

# 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

Gebruiker met beheerdersrechten

U moet de inhoud van uw openbare sleutel (\.ssh\id_ecdsa.pub) op de server plaatsen in een tekstbestand met de naam administrators_authorized_keys in de map C:\ProgramData\ssh\. U kunt uw openbare sleutel kopiëren met behulp van het OpenSSH-scp hulpprogramma voor beveiligde bestandsoverdracht of met behulp van PowerShell om de sleutel naar het bestand te schrijven. De ACL op dit bestand moet worden geconfigureerd om alleen toegang tot beheerders en de systeemgebruiker toe te staan.

U kunt de volgende code gebruiken om de openbare sleutel naar de server te kopiëren en de ACL te configureren. Vervang in de laatste regel username door uw gebruikersnaam. In eerste instantie wordt u gevraagd een wachtwoord in te voeren voor het gebruikersaccount voor de server.

Notitie

In dit voorbeeld ziet u de stappen voor het maken van het administrators_authorized_keys-bestand. Dit bestand is alleen van toepassing op beheerdersaccounts. U moet het gebruiken in plaats van het gebruikersspecifieke bestand binnen de profiellocatie van de gebruiker.

# 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

Voor niet-Engelse gelokaliseerde versies van het besturingssysteem moet het script worden gewijzigd om de groepsnamen dienovereenkomstig weer te geven. Als u fouten wilt voorkomen die kunnen optreden wanneer u machtigingen verleent voor groepsnamen, kunt u de beveiligings-id (SID) gebruiken in plaats van de groepsnaam. U kunt de SID ophalen door Get-LocalGroup | Select-Object Name, SIDuit te voeren. Wanneer u de SID gebruikt in plaats van de groepsnaam, moet deze worden voorafgegaan door een sterretje (*). In het volgende voorbeeld gebruikt de groep Administrators de 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"""

Met deze stappen voltooit u de configuratie die is vereist voor het gebruik van verificatie op basis van sleutels met OpenSSH in Windows. Nadat u deze PowerShell-opdrachten hebt uitgevoerd, kunt u verbinding maken met de sshd host vanaf elke client met de persoonlijke sleutel.