Nel codice sorgente di OpenSSH supporto sperimentale per l'autenticazione a due fattori utilizzando dispositivi che supportano il protocollo , sviluppato dall'alleanza . U2F consente la creazione di token hardware economici per confermare la presenza fisica dell'utente, che interagiscono tramite USB, Bluetooth o NFC. Questi dispositivi sono promossi come mezzo per l'autenticazione a due fattori su siti web, sono già supportati dai principali browser e sono prodotti da diversi 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 simile a una libreria per supportare PKCS#11 e funge da wrapper sopra la libreria , fornendo mezzi di comunicazione con i token tramite USB (supporta i protocolli FIDO U2F/CTAP 1 e FIDO 2.0/CTAP 2). La libreria intermedia libsk-libfido2 è stata preparata dagli sviluppatori di OpenSSH. nel pacchetto principale di libfido2, come anche per OpenBSD.
Per abilitare U2F, puoi utilizzare l'ultima versione del codice sorgente da OpenSSH e il ramo HEAD della libreria , che già include il layer necessario per OpenSSH.
Libfido2 supporta il funzionamento su OpenBSD, Linux, macOS e Windows.
Per l'autenticazione e la generazione della chiave, è necessario impostare la variabile d'ambiente SSH_SK_PROVIDER, specificando il percorso a libsk-libfido2.so (export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so), o definire la libreria tramite la configurazione SecurityKeyProvider, dopo di che puoi eseguire "ssh-keygen -t ecdsa-sk" o, se le chiavi sono già create e configurate, connetterti al server utilizzando "ssh". All'avvio di ssh-keygen, la coppia di chiavi generata verrà salvata in "~/.ssh/id_ecdsa_sk" e può essere utilizzata come le altre chiavi.
La chiave pubblica (id_ecdsa_sk.pub) deve essere copiata sul server nel file authorized_keys. Dalla parte del server viene solo verificata la firma digitale, mentre l'interazione con i token avviene dalla parte client (non è necessario installare libsk-libfido2 sul server, ma il server deve supportare il tipo di chiave "ecdsa-sk"). La chiave privata generata (id_ecdsa_sk) è fondamentalmente un descrittore della chiave, creando la chiave reale solo in combinazione con la sequenza segreta memorizzata sul token U2F.
Se la chiave id_ecdsa_sk finisce nelle mani di un attaccante, per completare l'autenticazione dovrà anche avere accesso al token hardware, senza il quale la chiave privata memorizzata nel file id_ecdsa_sk è inutile. Inoltre, per impostazione predefinita, qualsiasi operazione con le chiavi (sia durante la generazione che durante l'autenticazione) richiede una conferma locale della presenza fisica dell'utente, ad esempio, si può essere invitati a toccare il sensore sul token, il che rende difficili gli attacchi remoti su sistemi con il token collegato. Come ulteriore livello di protezione, in fase di avvio di ssh-keygen, può anche essere impostata una password per accedere al file con la chiave.
La chiave U2F può essere aggiunta a ssh-agent tramite "ssh-add ~/.ssh/id_ecdsa_sk", ma ssh-agent deve essere compilato con supporto per chiavi "ecdsa-sk", deve essere presente il layer libsk-libfido2 e l'agente deve essere eseguito sul sistema a cui si collega il token.
Il nuovo tipo di chiavi "ecdsa-sk" è stato aggiunto poiché il formato delle chiavi ecdsa di OpenSSH differisce dal formato U2F per firme digitali ECDSA per la presenza di campi aggiuntivi.
Fonte: opennet.ru
