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.
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
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
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
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
Possiamo così collegarci al server senza necessità di password e verificare il contenuto della cartella .ssh.
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
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
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