Autenticazione SSH senza password

Parte 2 – Come generare una coppia di chiavi pubblica/privata in ambiente Windows

Premessa

OpenSSH permette di autenticare un utente con uno scambio di chiavi, evitando l’utilizzo di password.

E’ necessario creare le due chiavi SSH (pubblica e privata) sul client dal quale vogliamo collegarci alla macchina remota su cui è installato OpenSSH. La chiave privata è archiviata in modo sicuro sul client, quella pubblica è salvata sul server SSH.

logo OpenSSH
The logo may be obtained from OpenSSH., Fair use, Link

OpenSSH per Windows

Disponibile attualmente per Windows Server 2022, Windows Server 2019, Windows 11, Windows 101.

Prerequisiti

  • Un dispositivo con almeno Windows Server 2019 o Windows 10 build 1809.
  • PowerShell versione 5.1 o superiore.
  • Account con diritti di amministratore.

OpenSSH Server deve essere installato su Windows, procedura che non trattiamo qui e per la quale rimandiamo all’articolo Introduzione ad OpenSSH2.

Generazione delle chiavi utente

Per generare la coppia di chiavi pubblica/privata per il client, usiamo il comando ssh-keygen.exe, selezionando l’algoritmo tra DSA, RSA, ECDSA o Ed25519.

Nell’esempio che segue utilizzeremo l’algoritmo Ed25519:

ssh-keygen -t ed25519
ssh-keygen

Possiamo accettare le impostazioni di default, o modificare il percorso e/o il nome del file dove le chiavi saranno generate. Possiamo inserire una passphrase per criptare la chiave privata, attivando così l’autenticazione a due fattori, o lasciarla vuota.

Nella cartella .ssh dell’utente avremo il file id_ed25519 (chiave privata3) e il file id_ed25519.pub (chiave pubblica).

dir .ssh
contenuto .ssh

Servizio ssh-agent

Per archiviare in modo sicuro la chiave privata, usiamo il servizio ssh-agent. Per avviare il servizio ad ogni riavvio del computer, e ssh-add per archiviare la chiave privata, inseriamo i seguenti comandi dal prompt di PowerShell come amministratore:

# Il servizio ssh-agent è disabilitato come impostazione predefinita. 
# Configuriamolo per partire automaticamente all'avvio.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Facciamo partire il servizio
Start-Service ssh-agent

# Per verificare se il servizio è attivo
Get-Service ssh-agent

# Carichiamo la nostra chiave privata
ssh-add $env:USERPROFILE\.ssh\id_ed25519
servizio ssh-agent

Una volta aggiunta la chiave a ssh-agent nel client, il servizio ssh-agent recupera automaticamente la chiave privata locale e la trasmette al nostro client SSH.

Per motivi di sicurezza, è consigliato salvare la chiave privata in modo sicuro, ed eliminarla dal client locale, dopo averla aggiunta all’ssh-agent. La chiave privata non può essere recuperata dall’agent con algoritmo sicuro come l’Ed25519 del caso in esempio. Se la perdiamo, dovremo ricreare una nuova coppia di chiavi e aggiornare la chiave pubblica su tutti i sistemi con i quali ci connettiamo in SSH.

Distribuzione della chiave pubblica

Il contenuto della chiave pubblica deve essere inserito in un file del server SSH. Il nome e la posizione del file variano a seconda che l’account utente sia parte del gruppo amministratori o di quello degli utenti standard.

Utente standard

Il contenuto della chiave pubblica deve essere inserito nel file di testo authorized_keys nella cartella C:\Users\username\.ssh\ del server. Per copiare la chiave pubblica, possiamo usare l’utilità scp di OpenSSH, o PowerShell per scrivere la chiave nel file.

Nell’esempio che segue, copiamo la chiave pubblica nel server e per far questo dobbiamo usare inizialmente la password dell’account utente sul server.

# Otteniamo il file della chiave pubblica generata in precedenza sul nostro client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generiamo la PowerShell da eseguire in remoto per copiare il contenuto della 
# chiave pubblica nel file authorized_keys sul server
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Ci connettiamo al server ed eseguiamo la PowerShell utilizzando la variabile 
# $remotePowerShell
ssh username@domain@host.ext $remotePowershell
copia della chiave pubblica

Possiamo così collegarci al server senza necessità di password e verificare il contenuto della cartella .ssh.

contenuto della cartella .ssh sul server

Utente amministratore

Il contenuto della chiave pubblica deve essere inserito nel file di testo administrators_authorized_keys4 sul server, nella cartella %ProgramData%\ssh\. Possiamo copiare la chiave con l’utilità scp di OpenSSH, o usare PowerShell per scrivere la chiave nel file. L’ACL di questo file deve essere configurato per permettere l’accesso soltanto agli amministratori e a System.

# Otteniamo il file della chiave pubblica generata in precedenza sul nostro client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generiamo la PowerShell da eseguire in remoto per copiare il contenuto della 
# chiave pubblica nel file authorized_keys sul 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"""

# Ci connettiamo al server ed eseguiamo la PowerShell utilizzando la variabile 
# $remotePowerShell
ssh username@domain@host.ext $remotePowershell
copia della chiave pubblica sul server

Lo script è impostato per la versione inglese del sistema operativo, per altre lingue i nomi dei gruppi devono essere modificati di conseguenza. Per prevenire errori in fase di assegnazione dei permessi, si può usare il SID (Security Identifier)5.

Ci possiamo quindi collegare con l’utente amministratore al server.

ssh username@domain@host.ext
collegamento SSH senza password
collegamento SSH senza password sul server

Disabilitare la connessione con password

Ora che è attiva l’autenticazione con chiave, possiamo disabilitare l’accesso con password per il protocollo SSH. Modifichiamo la voce PasswordAuthentication nel file di configurazione del server OpenSSH, togliendo il # di commento e impostando il valore su no.

notepad %ProgramData%\ssh\sshd_config
sshd_config configurato per accesso senza password

Parte 1 – Come generare una coppia di chiavi pubblica/privata


Parliamone


Note

1. maertendMSFT. (2024, February 14). Key-based authentication in OpenSSH for Windows. Microsoft Learn. https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
2. Robinharwood. (2024, August 17). Introduzione a OpenSSH per Windows. Microsoft Learn. https://learn.microsoft.com/it-it/windows-server/administration/openssh/openssh_install_firstuse
3. La chiave privata è l'equivalente di una password, e come tale deve essere protetta.
4. Possiamo anche semplicemente copiare il file della chiave pubblica id_ed25519.pub nella cartella %ProgramData%ssh, rinominandolo in administrators_authorized_keys, assegnando il permesso in lettura ai soli gruppi Administators e SYSTEM.
5. Il SID può essere ricavato con il comando Get-LocalGroup | Select-Object Name, SID. Se si usa il SID al posto del nome del gruppo, questo deve essere preceduto da un asterisco (*).