Table of Contents

FIDO2 e SSH

Appunti su come configurare un client e un server per usare autenticazione basata su chiavi pubbliche e private usando però un token FIDO2. L'autenticazione avviene di fatto con lo stesso meccanismo della "classica" configurazione a chiave pubblica e privata, con la differenza che in questo caso la chiave privata viene generata dentro il token FIDO2 e non viene mai estratta dal medesimo. Per ulteriore misura di sicurezza il token è protetto da un PIN e per effettuare l'autenticazione occorre anche premere un pulsante sulla medesimo. In questo modo se lo perdiamo in teoria possiamo dormire sonni tranquilli, compatibilmente con la complessità del pin. L'effetto collaterale però è che se lo perdiamo siamo chiusi fuori da tutto, ergo è meglio avere anche un secondo metodo di accesso di emergenza (un altro token per esempio).

Inizializzare e gestire il token

Se abbiamo un token nuovo probabilmente dovremo inizializzarlo inserendo un PIN. Come farlo dipende da marca e modello del token. Alcuni possono essere gestiti (in modo decisamente poco user friendly) con i programmi presenti in fido2-tools.

apt install fido2-tools
fido2-token -L

Output di esempio: /dev/hidraw11: vendor=0x349e, product=0x0026 (TOKEN2 FIDO2 Security Key(0026))
fido2-token -I /dev/hidraw11
fido2-token -S /dev/hidraw11
fido2-token -C /dev/hidraw11
fido2-token -L -r /dev/hidraw11

Inizializzazione e gestione di un token USB Thetis PRO-A

Thetis non fornisce un programma per la gestione del token sotto Linux, ma se avete Wine installato dovrebbe funzionare senza alcun problema il loro programma per windows. E` sufficiente inserire il token nella porta usb e lanciare il programma sotto wine, a me ha funzionato al primo colpo su Linux Mint con Wine versione 10.0. Quello che dobbiamo fare con un token nuovo è solamente impostare il PIN, poi il resto lo si fa da Linux. NOTA: probabilmente funzionano anche i tool nativi in Linux, non ho provato.

Inizializzazione e gestione di un token USB Token2 T2F2-NFC-Slim

Token2 fornisce il programma per Windows che però sotto Wine non vede il token. Esiste un programma per Linux che però devi compilarti da solo, non ne avevo voglia quindi ho provato a usare i tool nativi fido2-tools in Linux Mint e ha funzionato. È stato sufficiente vedere il nome del device e inizializzare il pin per la prima volta (vedi i comandi sopra).

Generazione delle chiavi per SSH

Per usare il token FIDO2 per autenticarci quando usiamo SSH, dobbiamo prima di tutto generare un paio di chiavi pubblica/privata usando il token stesso, in modo che la chiave privata venga generata dentro al token e tenuta dentro al token. La chiave privata non viene mai esportata dal token, quindi non può essere copiata da nessuno. Il processo non è molto diverso dalla generazione di una coppia di chiavi pubblica/privata "classiche" per ssh.

ssh-keygen -t ed25519-sk -O resident -O application=ssh:credentialDescription -O verify-required -C "Comment"

# Per esempio: ssh-keygen -t ed25519-sk -O resident -O application=ssh:Per_cliente_Rossi -O verify-required -C "Chiave di Mario Bianchi"

Ora la generazione dovrebbe essere completa e avremo due files dentro .ssh nella nostra home, con nome ed25519-sk e ed25519-sk.pub. Notare che mentre il file pub contiene esattamente la chiave pubblica, che poi metteremo sui vari sistemi remoti a quali dobbiamo accedere, il file che normalmente conterrebbe la chiave privata contiene in realtà un riferimento all' ID della chiave che si trova dentro al nostro token FIDO2, ergo è impossibile usarlo per autenticarsi senza il token.

Per usare il token su un altro computer

Ora di fatto per autenticarci dobbiamo avere con noi il token, ma ci serve anche avere i files ed25519-sk e ed25519-sk.pub. Questi files possono facilmente essere rigenerati dal token stesso, quindi se dovessimo perderli, o se volessimo usare un altro computer, potremmo senza problemi ricreare i files in questione.

ssh-keygen -K

Per usare il token in SSH

C'è un bug in alcune versioni di Ubuntu e Mint per cui se vogliamo che funzioni il nostro sistema FIDO2 dobbiamo passare a ssh il parametro -o "IdentityAgent=none". Questo è scomodo perché in questo modo dobbiamo usare un comando specifico se vogliamo usare il token FIDO2 e un comando diverso (senza la stringa -o "IdentityAgent=none") se vogliamo usae una coppia di chiavi pubblica/privata "tradizionale"

ssh -o "IdentityAgent=none" user@host-remoto

Configurazione del server SSH

Dal punto di vista del server SSH si tratta di una normale autenticazione con chiave pubblica/privata, qundi occorre copiare il contenuto della chiave pubblica ed25519-sk.pub dentro al file .ssh/authorized_keys sul server, e questo è sufficiente a fare funzionare tutto quanto.

Se però vogliamo rendere il server compliant dobbiamo assicurarci che nessun altro metodo funzioni, in particolare che non funzionino le password, quindi possiamo configurarlo modificando sshd_config in questo modo:

PubkeyAuthOptions verify-required
PermitRootLogin prohibit-password

Se vogliamo che NESSUNO (e non solo root) possa usare le password, allora dobbiamo mettere anche queste righe:

PasswordAuthentication no
PermitEmptyPasswords no

Notare un paio di cose importanti: