TOTP con Openvpn
Questa configurazione, che si basa sulla configurazione descritta in ../Openvpn server, aggiunge il supporto per una autenticazione con token TOTP. È possibile gestire sia utenti con che senza TOTP allo stesso tempo. L'ho provata con ROS 7.15. Come app di autenticazione io personalmente uso Aegis su Android, ma in teoria qualsiasi app compatibile con il sistema TOTP dovrebbe funzionare.
Installazione pacchetto user-manager
Per funzionare, abbiamo bisogno del pacchetto "user-manager" che espone un server RADIUS che useremo per gestire gli utenti con l'autenticazione TOTP. Il pacchetto user-manager non esiste per tutte le architetture, quindi occorre che il nostro Mikrotik lo supporti e anche che abbia ovviamente abbastanza RAM e FLASH per installarlo. Il pacchetto user-manager lo trovate qui: https://mikrotik.com/download scaricando lo zip giusto per il vostro router (tipo di hardware e versione del software).
Una volta scaricato lo zip, potete estrarre solo il file dello user manager e uploadarlo sul Mikrotik nella gestione files. Una volta che lo avete uploadato, riavviate e dovrebbe automaticamente installarlo. Una volta installato potete anche cancellarlo dalla sezione files. Troverete una nuova voce "User Manager" nella interfaccia web (o nel winbox).
Configurazione del Mikrotik per essere server RADIUS
Configuriamo lo user manager per essere server RADIUS (per se` stesso). Volendo potremmo anche essere server per un altro client, ma qui non ci interessa.
/user-manager set certificate=*0 enabled=yes /user-manager router add address=127.0.0.1 name=router1
Configurazione di openvpn per essere client RADIUS
Ora configuriamo il sistema per essere client RADIUS in modo che openvpn possa vedere gli account utente che creeremo sotto lo user manager. Una volta fatta questa configurazione il server openvpn userà sia gli account utente esistenti sotto la configurazione dei Secret del PPP, sia quelli che creeremo nello user manager. Se vogliamo tenere ordine, consiglio di evitare di usare tutti e due i sistemi, anche se tecnicamente si può fare senza problemi, basta che non abbiamo utenti con lo stesso username nell'uno e nell'altro sistema di autenticazione.
/radius add address=127.0.0.1 service=ppp timeout=1s /ppp aaa set accounting=yes use-radius=yes
Creazione utenti sotto lo user manager
Ora possiamo creare gli utenti. Farlo è relativamente scomodo, per cui ho creato un piccolo script per farlo che gira sotto Linux. In ogni caso se vogliamo fare una prova possiamo farla a mano con un utente di test (che poi toglieremo).
/user-manager user add name=test2 otp-secret=ONSWO4TFORXWI2LQOVWGG2LOMVWGYYIK password=pippo
Questo utente usa come segreto per la generazione dell' OTP la stringa "segretodipulcinella" encodata in base32, e come password fissa "pippo". Per collegarci dovremo usare come password la stringa "pippo" seguita dai numeri generati dalla nostra app TOTP, per esempio "pippo543665".
Configurazione del client Openvpn
Lato client, impostiamo tutto come indicato in ../Openvpn server, con l'unica differenza che la configurazione del client non usa più un file dove conservare le credenziali di accesso, ma dovrà necessariamente chiedercele ogni volta. In pratica, modifichiamo il file .ovpn e usiamo
auth-user-pass
al posto di
auth-user-pass user-pass.txt
Test del sistema
Ora possiamo provare a connetterci dal client, alla richiesta di username e password inseriamo il nostro username "test2" e come password inseriamo "pippo" seguito dai numeri che otteniamo usando una app TOTP (per esempio Aegis) alla quale abbiamo dato come secret la stringa "ONSWO4TFORXWI2LQOVWGG2LOMVWGYYIK". Se avete Linux sul vostro pc potete usare il comando oathtool (pacchetto oathtool in Debian) per ottenere un codice TOTP valido per il nostro utente di prova.
oathtool -b --totp ONSWO4TFORXWI2LQOVWGG2LOMVWGYYIK
Gestione account utente
Gestire gli account utente è decisamente scomodo se lo facciamo a mano, dobbiamo usare base32 per codificare i segreti per la generazione della OTP e poi dobbiamo copiarli a mano nella nostra app di autenticazione. Per questo motivo ho creato uno script abbastanza orribile che permette di creare del QR code da leggere con Aegis e genera anche un file di testo (utenti-mirkotik.txt) il cui contenuto possiamo copiare e incollare nella console del Mikrotik per creare gli account utente.
Lo script gira su Linux, e richiede di avere installati i seguenti programmi: base32, pwgen, qrencode
#!/bin/bash # uso: creautente <username> <password> # se password e` un numero singolo, crea una password casuale di N caratteri # se è una stringa, usa quella stringa come password # Se non ho esattamente due argomenti, esco con un errore if [ "$#" -ne 2 ]; then echo "Numero di argomenti errato" echo "USO: $0 <username> <password>" echo "Oppure $0 <username> <numero di caratteri per una password random>" echo "Esempio: $0 utente password oppure $0 utente 8" exit 1 fi # se esite già un file di QR code con lo stesso nome dell'utente che sto creando, esco con un errore if [ -f $1.png ]; then echo "Errore: esiste già un file di QR code con nome $1.png." exit 1 fi # se la password e` un numero e non una stringa, genera una password casuale # di enne caratteri la quale non contiene numeri (per semplificare la vita all'utente) case $2 in ''|*[!0-9]*) password=$2 ;; *) password="`pwgen -0 $2 1`" ;; esac # creiamo una stringa per il TOTP di 9 caratteri e la convertiamo in base32 # uso 9 caratteri che producono 16 caratteri in base32, e` lo standard che usa MS totp=`pwgen -sy 9 1 | base32` echo "Creo utente $1 con password $password e otp-secret $totp" echo "Il QR code relativo è creato in un file con nome $1.png" echo "la riga per creare l'utente su Mirkotik è accodata al file utenti-mirkotik.txt" qrencode -o $1.png -d 300 -s 10 "otpauth://totp/$1?secret=$totp" echo "/user-manager/user/add name=$1 otp-secret=$totp password=$password" >> utenti-mirkotik.txt exit 0