Openvpn con autenticazione TOTP

Questa è una configurazione per un server openvpn su Linux (provato su Debian e Openwrt) con autenticazione basata su certificato e su un codice TOTP. E` una soluzione mediamente semplice, basata su uno shell script e files di testo. Per scelta non chiedo all'utente sia una password fissa che un codice variabile, ma solo il codice variabile. Visto che per autenticarsi l'utente usa sia un certificato che il codice variabile, ritendo che inserire anche una password sia superfluo.

Principio di funzionamento: Prima di tutto Openvpn autentica il certificato (e se non è valido non si procede in ogni caso), poi verifica che lo username sia uguale al common name del certificato, e infine verifica il codice TOTP. Se tutte le verifiche passano, l'utente è autenticato. Siccome ogni tot tempo (default 1 ora) Openvpn ristabilisce la connessione e rigenera le chiavi simmetriche effimere di crittografia, l'autenticazione a quel punto verrebbe rifatta e fallirebbe perché nel frattempo il codice TOTP è cambiato. Per evitare che questo succeda, una volta stabilita la connessione viene scambiato un cookie di autenticazione che viene usato per tutte le riconnessioni successive, fino a che non viene chiusa definitivamente la connessione.

Notare che io volutamente richiedo che ci sia un certificato personale per ogni utente. Sarebbe possibile volendo usare un unico certificato per tutti gli utenti e autenticare i singoli utenti basandosi su username e TOTP, però questo a mio avviso rende meno sicuro il sistema in quanto rende possibile accedere possedendo un certificato rubato ad un utente e un codice TOTP rubato ad un altro utente. Inoltre una volta che per qualche motivo venisse compromesso il certificato utente (si presume che ce ne sia uno solo usato da tutti) o continuo a usare un certificato compromesso oppure devo revocarlo e quindi dare un nuovo certificato a tutti gli utenti, e non solo ad un singolo utente.

Configurazione openvpn lato server

Lato server, uso una configurazione molto simile a quella di ../Openvpn_Con_Certificati, alla quale faccio alcune modifiche per gestire la doppia autenticazione.

Le modifiche nel dettaglio sono queste:

La configurazione risultante è questa:

Ovviamente qui non spiego come generare i certificati, ecc. Fate riferimento alla pagina ../Openvpn_Con_Certificati

Script per autenticare con TOTP lato server

Questo è il contenuto dello script "oath.sh" che è indicato nella configurazione di Openvpn. Questo script legge un due files: uno e` il file "oath.secrets" che contiene username e seed per generare il codice TOTP, e l'altro gli viene passato da openvpn (dentro la tmp-dir) e contiene user e codice TOTP che l'utente ha inserito per autenticarsi. Questo script va adattato indicando il percorso del file "oath.secrets" (nome e percorso sono a vostra scelta, io lo tengo dentro /etc/openvpn)

Questo script richiede di avere installato il programma "oathtool", che esiste come pacchetto sia in debian che in openwrt.

Script per generare le righe da inserire nel file oath.secrets

Il file oath.secrets contiene un utente per riga, nella forma username:seme del TOTP. Il carattere che separa i campi e` il "due punti" e quindi è vietato creare degli username che contengano quel carattere. In ogni caso Openvpn per motivi di sicurezza non consente di usare caratteri che non siano lettere numeri e i caratteri . _ @ - (punto, underscore, chiocciola, e meno). Quindi per i vostri username usate lettere numeri e solo questi simboli. Gli username sono case sensitive.

Per generare il seed per il TOTP uso il programma "oathtool" che peraltro è anche quello che uso per verificare i codici TOTP in fase di autenticazione. Per rendere più comodo impostare il codice sulla app del cellulare, uso qrencode per generare dei QR code che vengono salvati come "username.png"

Questo script, che non è necessario che giri sullo stesso server dove gira openvpn, richiede che siano installati i seguenti programmi: oathtool, pwgen, base32, qrencode. Sono tutti disponibili come pacchetti debian e anche su openwrt.

Se usiamo questo script sulla stessa macchina dove si trova openvpn possiamo direttamente fargli scrivere il file oath.secrets che viene letto da openvpn, in alternativa dovremo copiare a mano gli utenti da una macchina all'altra.

Notare che questo script semplicemente accoda una riga ogni volta al file oath.secrets, e non è in grado né di cancellare né di modificare utenti esistenti. Per farlo dovrete manomettere il file a mano.

Configurazione lato client

Lato client, la configurazione è di nuovo simile a quella usata in ../Openvpn_Con_Certificati con poche modifiche per renderla compatibile con la necessità di inserire username e password. Notare che il client openvpn per Windows permette di salvare lo username (lo fa per default, senza dover impostare nulla) e anche di salvare la password. Evitate di salvare la password perché la password è il codice TOTP che cambia ogni volta.

Configurazione app sul cellulare

È possibile usare qualsiasi app che possa leggere i QR code per generare i codici TOTP. Le app che ho provato personalmente sono "Aegis" e "2FAS Auth", ma dovrebbero funzionare anche Google Authenticator e Microsoft Authenticator.

OpenVpn/Openvpn_MFA (last edited 2024-10-14 16:24:15 by Kurgan)