Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 si lavora tra domini, ad esempio tra sistemi locali e ospitati nel cloud, questo tipo di autenticazione diventa vulnerabile alle intrusioni di forza bruta.
Gli ambienti Linux usano in genere coppie di chiavi pubbliche/private per eseguire l'autenticazione che non richiede l'uso di password indovinabili. OpenSSH include strumenti per supportare l'autenticazione basata su chiave, in particolare:
- ssh-keygen per la generazione di chiavi sicure.
- ssh-agent e ssh-add per l'archiviazione sicura delle chiavi private.
- scp e sftp per copiare in modo sicuro i file di chiave pubblica durante l'uso iniziale di un server.
Questo documento offre una panoramica di come usare questi strumenti in Windows per iniziare a usare l'autenticazione basata su chiave con Secure Shell (SSH). Se non si ha familiarità con la gestione delle chiavi SSH, è consigliabile consultare il documento NIST IR 7966, intitolato Security of Interactive and Automated Access Management Using Secure Shell (SSH).
Coppie chiave
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 di chiave, uno privato e l'altro pubblico. Ogni file di chiave privata è l'equivalente di una password e deve rimanere protetto in tutte le circostanze. Se qualcuno acquisisce la chiave privata dell'utente privato, potrà accedere a qualsiasi server SSH accessibile all'utente stesso. La chiave pubblica è quella inserita nel server SSH e può essere condivisa senza compromettere la chiave privata.
Il server SSH e il client possono usare l'autenticazione basata su chiave per confrontare la chiave pubblica per 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.
L'autenticazione a più fattori può essere implementata con coppie di chiavi immettendo una passphrase quando viene generata la coppia di chiavi. Per altre informazioni, vedere Generazione di chiavi utente. All'utente viene richiesta la passphrase durante l'autenticazione. La passphrase combinata con la presenza della chiave privata viene usata nel client SSH per autenticare l'utente.
Importante
Una sessione remota aperta tramite l'autenticazione basata su chiave non dispone di credenziali utente associate. Di conseguenza, la sessione non è in grado di eseguire l'autenticazione in uscita come utente. Questo comportamento è predefinito.
Generazione di chiavi host
Le chiavi pubbliche hanno requisiti specifici dell'elenco di controllo di accesso (ACL) che, in Windows, equivalgono solo a consentire l'accesso agli amministratori e all'utente di sistema. La prima volta che viene usato il sshd
servizio, la coppia di chiavi per l'host viene generata automaticamente.
Importante
È necessario installare OpenSSH Server prima di poter eseguire i comandi in questo articolo. Per altre informazioni, vedere Introduzione a OpenSSH per Windows.
Per impostazione predefinita, è necessario avviare sshd
manualmente. Per configurarlo per l'avvio automatico 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
# Start the sshd service.
Start-Service sshd
Poiché al servizio non è associato sshd
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. È possibile usare ssh-keygen.exe
per generare file di chiave ed è possibile specificare gli algoritmi di generazione di chiavi seguenti:
- Algoritmo di firma digitale (DSA)
- Rivest-Shamir-Adleman (RSA)
- Algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm)
- Ed25519
Se non si specifica un algoritmo, viene usato Ed25519. In questo esempio è consigliabile usare un algoritmo sicuro e una lunghezza della chiave, ad esempio ECDSA.
Per generare file di chiave usando l'algoritmo ECDSA, eseguire il comando seguente in una finestra di PowerShell o del prompt dei comandi nel client:
ssh-keygen -t ecdsa
L'output del comando dovrebbe essere simile alle righe seguenti, ad eccezione del fatto che username
viene sostituito con il nome utente:
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
Al prompt è possibile selezionare Invio per accettare il percorso del file predefinito oppure specificare un percorso o un nome di file per le chiavi generate.
Verrà quindi richiesto di usare una passphrase per crittografare i file di chiave privata. In generale, non è consigliabile usare una passphrase vuota, perché la passphrase funziona con il file di chiave per fornire l'autenticazione a due fattori. Tuttavia, per questo esempio, è possibile lasciare vuota la passphrase.
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]-----+
A questo punto è disponibile una coppia di chiavi ECDSA pubblica/privata nella posizione specificata. Il file .pub è la chiave pubblica e il file senza estensione è la chiave privata:
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
Un file di chiave privata è l'equivalente di una password e deve essere protetto allo stesso modo in cui si protegge la password.
Puoi usare ssh-agent
per archiviare in modo sicuro le chiavi private all'interno di un contesto di sicurezza di Windows associato all'account di Windows. Per configurare il servizio per l'avvio ssh-agent
automatico ogni volta che il computer viene riavviato e usare ssh-add
per archiviare la chiave privata, eseguire i comandi seguenti al prompt di PowerShell con privilegi elevati nel 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
Dopo aver aggiunto la chiave al servizio nel ssh-agent
client, il ssh-agent
servizio recupera automaticamente la chiave privata locale e la passa al client SSH.
Importante
È consigliabile eseguire il backup della chiave privata in una posizione sicura e quindi eliminarla dal sistema locale dopo averlo aggiunto al ssh-agent
servizio. La chiave privata non può essere recuperata dall'agente quando viene usato un algoritmo sicuro, ad esempio ECDSA in questo esempio. Se si perde l'accesso alla chiave privata, è necessario creare una nuova coppia di chiavi e aggiornare la chiave pubblica in tutti i sistemi con cui si interagisce.
Distribuire la chiave pubblica
Per usare la chiave utente creata in precedenza, è necessario inserire il contenuto della chiave pubblica (\.ssh\id_ecdsa.pub) 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 amministratore locale o di un account utente standard. Le sezioni seguenti illustrano sia gli utenti standard che gli utenti amministratori.
Utente standard
È necessario inserire il contenuto della chiave pubblica (\.ssh\id_ecdsa.pub) 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.
È possibile usare il codice seguente per copiare la chiave pubblica nel server. Nell'ultima riga sostituire username
con il nome utente. Inizialmente viene richiesto di immettere una 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_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
Utente amministrativo
È necessario inserire il contenuto della chiave pubblica (\.ssh\id_ecdsa.pub) 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 all'utente di sistema.
È possibile usare il codice seguente per copiare la chiave pubblica nel server e configurare l'ACL. Nell'ultima riga sostituire username
con il nome utente. Inizialmente viene richiesto di immettere una 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 file si applica solo agli account amministratore. È necessario usarlo invece del file specifico dell'utente all'interno del percorso del profilo dell'utente.
# 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
Per le versioni localizzate non in lingua inglese del sistema operativo, lo script deve essere modificato in modo da riflettere i nomi dei gruppi di conseguenza. Per evitare errori che possono verificarsi quando si concedono autorizzazioni ai nomi di gruppo, è possibile usare l'identificatore di sicurezza (SID) al posto del nome del gruppo. È possibile recuperare il SID 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 Administrators 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 questi comandi di PowerShell, è possibile connettersi all'host sshd
da qualsiasi client con la chiave privata.