Autenticazione basata su chiave in OpenSSH per Windows

Si applica a: Windows Server 2022, Windows Server 2019, Windows 10 (build 1809 e successive)

La maggior parte dell'autenticazione negli ambienti Windows viene eseguita con una coppia nome utente-password, che funziona bene per i sistemi che condividono un dominio comune. Quando invece si usano più domini, ad esempio sistemi locali e sistemi ospitati nel cloud, l'ambiente diventa vulnerabile alle intrusioni di forza bruta.

Per fare un confronto, gli ambienti Linux usano comunemente coppie di chiavi pubblica/privata per l'autenticazione, che non richiede l'uso di password facili da indovinare. OpenSSH include strumenti per supportare l'autenticazione basata su chiave, in particolare:

  • ssh-keygen per generare chiavi sicure
  • ssh-agent e ssh-add per archiviare le chiavi private in modo sicuro
  • scp e sftp per copiare i file di chiave pubblica in modo sicuro durante l'uso iniziale di un server

Questo documento fornisce informazioni generali su come usare questi strumenti in Windows per iniziare a usare l'autenticazione basata su chiave con SSH. Se non si ha familiarità con la gestione delle chiavi SSH, consigliamo di consultare il documento NIST IR 7966 dal titolo "Security of Interactive and Automated Access Management Using Secure Shell (SSH)" (Sicurezza relativa alla gestione degli accessi interattivi e automatici tramite Secure Shell (SSH)).

Informazioni sulle coppie di chiavi

Per coppie di chiavi si intendono file di chiave pubblica e privata usati da determinati protocolli di autenticazione.

L'autenticazione con chiave pubblica SSH usa algoritmi di crittografia asimmetrici per generare due file, uno di chiave privata e l'altro di chiave pubblica. I file di chiave privata equivalgono a una password e devono essere protetti in tutte le situazioni. Se qualcuno acquisisce la chiave privata dell'utente privato, potrà accedere a qualsiasi server SSH accessibile all'utente stesso. La chiave pubblica è l'elemento che viene inserito nel server SSH e può essere condivisa senza compromettere la chiave privata.

L'autenticazione basata su chiave consente al server e al client SSH di confrontare la chiave pubblica di un nome utente fornito con la chiave privata. Se non è possibile convalidare la chiave pubblica a lato server a fronte della chiave privata sul lato client, l'autenticazione non riesce.

È possibile implementare l'autenticazione a più fattori con coppie di chiavi inserendo una passphrase quando viene generata la coppia di chiavi (vedi generazione di chiavi utente più avanti). All'utente verrà richiesta la passphrase durante l'autenticazione. La passphrase viene utilizzata insieme alla presenza della chiave privata sul client SSH per autenticare l'utente.

Importante

Una sessione remota aperta tramite l'autenticazione basata su chiave non dispone di credenziali utente associate e pertanto non è in grado di eseguire l'autenticazione in uscita poiché questo è stato progettato.

Generazione di chiavi host

Le chiavi pubbliche hanno requisiti ACL specifici che, in Windows, equivalgono a consentire l'accesso solo agli amministratori e al sistema. Al primo uso di sshd, la coppia di chiavi per l'host verrà generata automaticamente.

Importante

È necessario prima installare OpenSSH Server. Vedere Introduzione ad OpenSSH.

Per impostazione predefinita, il servizio sshd è impostato per l'avvio manuale. Per avviarlo ogni volta che il server viene riavviato, eseguire i comandi seguenti da un prompt di PowerShell con privilegi elevati nel server:

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

# Now start the sshd service
Start-Service sshd

Poiché al servizio sshd non è associato alcun utente, le chiavi host vengono archiviate in C:\ProgramData\ssh.

Generazione di chiavi utente

Per usare l'autenticazione basata su chiavi, occorre prima generare alcune coppie di chiavi pubblica/privata per il client. ssh-keygen.exe viene usato per generare file chiave ed è possibile specificare gli algoritmi DSA, RSA, ECDSA o Ed25519. Se non viene specificato alcun algoritmo, viene utilizzato RSA. In questo esempio è consigliabile usare un algoritmo sicuro e una lunghezza della chiave, ad esempio Ed25519.

Per generare file di chiave usando l'algoritmo Ed25519, eseguire il comando seguente da un prompt di PowerShell o cmd nel client:

ssh-keygen -t ed25519

L'output del comando dovrebbe visualizzare l'output seguente (dove "username" viene sostituito dal nome utente):

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

È possibile premere Invio per accettare l'impostazione predefinita, oppure specificare un percorso e/o un nome file in cui si desidera che vengano generate le chiavi. A questo punto, ti verrà richiesto di usare una passphrase per crittografare i file di chiave privata. La passphrase può essere vuota, ma non è consigliata. La passphrase in combinazione con il file di chiave fornisce l'autenticazione a due fattori. Per questo esempio, la passphrase viene lasciata vuota.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ed25519.
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

The key's randomart image is:
+--[ED25519 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

A questo punto è presente una coppia di chiavi pubblica/privata ed25519 nella posizione specificata. I file con estensione pub sono chiavi pubbliche e i file senza estensione sono chiavi private:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 id_ed25519
-a----         6/3/2021   2:55 PM            103 id_ed25519.pub

Tieni presente che i file di chiave privata equivalgono a una password e devono essere protetti allo stesso modo. Usare ssh-agent per archiviare in modo sicuro le chiavi private in un contesto di sicurezza di Windows, insieme all'account di accesso di Windows. Per avviare il servizio ssh-agent ogni volta che il computer viene riavviato e usare ssh-add per archiviare la chiave privata, eseguire i comandi seguenti da un prompt di PowerShell con privilegi elevati nel server:

# 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_ed25519

Dopo aver aggiunto la chiave all'agente SSH nel client, ssh-agent recupererà automaticamente la chiave privata locale e la passerà al client SSH.

Importante

È consigliabile eseguire il backup della chiave privata in una posizione sicura, eliminandola successivamente dal sistema locale dopo averla aggiunta a ssh-agent. Non è possibile recuperare la chiave privata dall'agente che fornisce un algoritmo sicuro, ad esempio Ed25519 in questo esempio. Se non si è più in grado di accedere alla chiave privata, sarà necessario creare una nuova coppia di chiavi e aggiornare la chiave pubblica in tutti i sistemi con cui si interagisce.

Distribuzione della chiave pubblica

Per usare la chiave utente creata in precedenza, il contenuto della chiave pubblica (\.ssh\id_ed25519.pub) deve essere inserito nel server in un file di testo. Il nome e il percorso del file dipendono dal fatto che l'account utente sia membro del gruppo amministratori locale o di un account utente standard. Le sezioni seguenti illustrano sia gli utenti standard che gli utenti amministratori.

Utente standard

Il contenuto della chiave pubblica (\.ssh\id_ed25519.pub) deve essere inserito nel server in un file di testo denominato authorized_keys in C:\Users\username\.ssh\. È possibile copiare la chiave pubblica usando l'utilità openSSH scp secure file-transfer oppure usando PowerShell per scrivere la chiave nel file.

L'esempio seguente copia la chiave pubblica nel server (dove "username" viene sostituito dal nome utente). Sarà necessario usare inizialmente la password per l'account utente per il server.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.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

Utente amministrativo

Il contenuto della chiave pubblica (\.ssh\id_ed25519.pub) deve essere inserito nel server in un file di testo denominato administrators_authorized_keys in C:\ProgramData\.ssh\. È possibile copiare la chiave pubblica usando l'utilità openSSH scp secure file-transfer oppure usando PowerShell per scrivere la chiave nel file. L'ACL in questo file deve essere configurato per consentire l'accesso solo agli amministratori e al sistema.

L'esempio seguente copia la chiave pubblica nel server e configura l'ACL (dove "username" viene sostituito dal nome utente). Sarà necessario usare inizialmente la password per l'account utente per il server.

Nota

In questo esempio vengono illustrati i passaggi per la creazione del administrators_authorized_keys file. Questo vale solo per gli account amministratore e deve essere usato in luogo del file per utente all'interno del percorso del profilo utente.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.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

Per le versioni localizzate non in inglese del sistema operativo, lo script dovrà essere modificato in modo da riflettere i nomi dei gruppi di conseguenza. Per evitare errori durante la concessione di autorizzazioni ai nomi di gruppo, è possibile usare il SID (Security Identifier) sul posto. Il SID può essere recuperato eseguendo Get-LocalGroup | Select-Object Name, SID. Quando si usa il SID al posto del nome del gruppo, deve essere preceduto da un asterisco (*). Nell'esempio seguente il gruppo gruppo Amministratori usa il 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"""

Con questi passaggi viene completata la configurazione necessaria per usare l'autenticazione basata su chiavi con OpenSSH in Windows. Dopo aver eseguito i comandi di PowerShell di esempio, l'utente può connettersi all'host sshd da qualsiasi client con la chiave privata.