Nella base di codice di OpenSSH supporto sperimentale per l'autenticazione a due fattori utilizzando dispositivi che supportano il protocollo , sviluppato dall'alleanza . U2F consente di creare token hardware a basso costo per confermare la presenza fisica dell'utente, interagendo con essi attraverso USB, Bluetooth o NFC. Questi dispositivi sono promossi come un mezzo per l'autenticazione a due fattori sui siti, sono già supportati dai principali browser e sono prodotti da vari produttori, tra cui Yubico, Feitian, Thetis e Kensington.
Per interagire con i dispositivi che confermano la presenza dell'utente, in OpenSSH è stato aggiunto un nuovo tipo di chiave "sk-ecdsa-sha2-nistp256@openssh.com" ("ecdsa-sk"), che utilizza l'algoritmo di firma digitale ECDSA (Elliptic Curve Digital Signature Algorithm) con la curva ellittica NIST P-256 e l'hash SHA-256. Le procedure di interazione con i token sono state spostate in una libreria intermedia, che viene caricata in modo analogo alla libreria per il supporto di PKCS#11 ed è un wrapper sopra la libreria. , che fornisce strumenti per comunicare con i token tramite USB (supporta i protocolli FIDO U2F/CTAP 1 e FIDO 2.0/CTAP 2). La libreria intermedia libsk-libfido2, preparata dagli sviluppatori di OpenSSH è parte integrante di libfido2, così come per OpenBSD.
Per abilitare U2F è possibile utilizzare l'ultima versione della base di codice da OpenSSH e il ramo HEAD della libreria , che già include la sovrastruttura necessaria per OpenSSH.
Libfido2 supporta il funzionamento in OpenBSD, Linux, macOS e Windows.
Per l'autenticazione e la generazione della chiave è necessario impostare la variabile d'ambiente SSH_SK_PROVIDER, specificando in essa il percorso a libsk-libfido2.so (export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so), oppure definire la libreria tramite la configurazione SecurityKeyProvider, dopodiché lanciare "ssh-keygen -t ecdsa-sk" oppure, se le chiavi sono già state create e configurate, connettersi al server utilizzando "ssh". Al momento dell'esecuzione di ssh-keygen, la coppia di chiavi generata sarà salvata in "~/.ssh/id_ecdsa_sk" e può essere utilizzata come altre chiavi.
La chiave pubblica (id_ecdsa_sk.pub) deve essere copiata sul server nel file authorized_keys. Sul lato server viene verificata solo la firma digitale, mentre l'interazione con i token avviene sul lato client (non è necessario installare libsk-libfido2 sul server, ma il server deve supportare il tipo di chiavi "ecdsa-sk"). La chiave privata generata (id_ecdsa_sk) è essenzialmente un descrittore della chiave, che crea la chiave reale solo in combinazione con la sequenza segreta, memorizzata sul lato del token U2F.
Se il tasto id_ecdsa_sk finisce nelle mani di un attaccante, sarà inoltre necessario ottenere l'accesso al token hardware per completare l'autenticazione, senza il quale la chiave privata id_ecdsa_sk salvata nel file è inutile. Inoltre, di default, per eseguire qualsiasi operazione con le chiavi (sia durante la generazione che nell'autenticazione) è necessaria una conferma locale della presenza fisica dell'utente, ad esempio viene richiesto di toccare il sensore sul token, il che complica l'esecuzione di attacchi remoti su sistemi con il token connesso. Come ulteriore misura di protezione, durante l'avvio di ssh-keygen può essere anche richiesto di impostare una password per accedere al file della chiave.
La chiave U2F può essere aggiunta a ssh-agent tramite "ssh-add ~/.ssh/id_ecdsa_sk", ma ssh-agent deve essere compilato con il supporto per le chiavi "ecdsa-sk", deve essere presente un'interfaccia libsk-libfido2 e l'agente deve essere eseguito su un sistema a cui il token è connesso.
È stato aggiunto un nuovo tipo di chiavi "ecdsa-sk" poiché il formato delle chiavi ecdsa di OpenSSH differisce dal formato U2F per le firme digitali ECDSA, con l'aggiunta di campi extra.
Fonte: opennet.ru
