Effettuare l’autenticazione utilizzando password statiche nasconde alcune insidie: può essere dimenticata, violata, persa. Per aumentare il fattore sicurezza, esiste un tipo di autenticazione basata sull’utilizzo di password dinamiche generate da dispositivi chiamati “token” valide per un solo utilizzo: le one time password. Questo sistema è molto usato per accedere, ad esempio, al conto online della propria banca.
Lo stesso concetto è possibile applicarlo per l’autenticazione degli utenti durante, ad esempio, una sessione VPN. Per effettuare l’autenticazione tramite MOTP (Mobile One Time Password), si abbina la procedura nel progetto MOTP al sito http://motp.sourceforge.net.
Prerequisiti
Per installare il sistema, sono richiesti i seguenti componenti:
- FreeRADIUS 2.x
- otpverify.sh
- dictionary.motp
Procedura
Iniziare con l’installazione di FreeRADIUS. Tramite il comando yum, installare i package richiesti per il funzionamento.
# yum install freeradius2 freeradius2-utils freeradius2-ldap
Rendere il servizio radiusd attivo anche al riavvio del sistema tramite il comando chkconfig.
# chkconfig radiusd on
Scaricare dal sito Mobile-OTP il file otpverify.sh, renderlo eseguibile ed assegnare l’ownership all’utente/gruppo radiusd utilizzati da FreeRADIUS.
# cd /usr/local/bin
# wget http://motp.sourceforge.net/otpverify.sh
# chmod +x otpverify.sh
# chown radiusd:radiusd otpverify.sh
Scaricare dal sito motp il file dictionary.motp nella directory /etc/raddb/.
# wget http://motp.sourceforge.net/dictionary.motp
# chown root:radiusd dictionary.motp
Editare il file /etc/raddb/dictionary ed aggiungere l’INCLUDE per il file appena scaricato.
# vi /etc/raddb/dictionary
Creare le seguenti directory in /var ed assegnare l’ownership a radiusd.
# mkdir /var/motp
# mkdir /var/motp/cache
# mkdir /var/motp/users
# chown -R radiusd:radiusd /var/motp
Editare il file /etc/raddb/radiusd.conf ed aggiungere le seguenti istruzioni nella sezione modules:
exec MOTP { wait = yes program = "/usr/local/bin/otpverify.sh %{User-Name} %{User-Password} %{reply:Secret} %{reply:Pin} %{reply:Offset}" input_pairs = request output_pairs = reply }
Creare un file identificativo (nell’esempio radius.nolabnoparty.com) nella directory /etc/raddb/sites-enabled/.
# touch /etc/raddb/sites-enabled/radius.nolabnoparty.com
Editare il file creato inserendo la seguente configurazione:
authorize { preprocess chap suffix files expiration logintime pap } authenticate { Auth-Type PAP { pap } Auth-Type CHAP { chap } Auth-Type External { MOTP } unix } preacct { preprocess acct_unique suffix files } accounting { detail unix radutmp attr_filter.accounting_response } session { radutmp } post-auth { Post-Auth-Type REJECT { attr_filter.access_reject } } pre-proxy { } post-proxy { }
Editare il file /etc/raddb/sites-enabled/inner-tunnel ed aggiungere nella sezione authenticate l’istruzione:
Auth-Type External { MOTP }
Editare il file /etc/raddb/clients.conf ed impostare il valore del parametro secret che sarà utilizzato dal server e dal client per la comunicazione.
# /etc/raddb/clients.conf
Installazione del client (token)
Il dispositivo utilizzato come token può essere un comunissimo Smartphone (iPhone, Android, Nokia) su cui viene installato il software che genera l’OTP.
Qui sono elencati alcuni software utilizzabili:
Android: DroidOTP, mobile-OTP (presenti nel Market)
iPhone: mOTP , iOTP (presenti in iTunes)
Nokia: mobileOTP (applicazione Java)
Installato il software sullo Smartphone, generare il valore del parametro Secret* ed annotarlo. Editare il file /etc/raddb/users ed inserire la seguente configurazione:
DEFAULT Auth-Type = External Exec-Program-Wait = "/etc/raddb/otpverify.sh '%{User-Name}' '%{User-Password}' '%{reply:Secret}' '%{reply:Pin}' '%{reply:Offset}'", Fall-Through = Yes user_nolabnoparty # username Secret = 7176f617a1a6ae52, # *prelevato dal dispositivo token PIN = 1234, # pin utilizzato per generare l’OTP Offset = 0 # differenza “Epoch-Time” tra client e server
Verifica della configurazione
Per testare lo script otpverify.sh, generare una password tramite il token ed eseguire l’istruzione:
otpverify.sh username token Init-Secret PIN Offset
# /usr/local/bin/otpverify.sh user_nolabnoparty 536d46 7176f617a1a6ae52 1111 0
Lo script dovrebbe riportare ACCEPT. Rilanciando il comando lo script dovrebbe rispondere con FAIL.
Per verificare che la configurazione di FreeRADIUS sia corretta, lanciare il daemon radiusd in modalità debug.
# radiusd -X
Se la configurazione non presenta errori, il sistema visualizza il messaggio Ready to process requests.
Testare l'autenticazione tramite MOTP
L’installazione e configurazione del sistema è terminata. Non rimane che testare la funzionalità del sistema.
Lanciare FreeRADIUS in modalità debug.
# radiusd -X
Dal token generare una password. Aprire un’altra sessione di FreeRADIUS e digitare il comando:
radtest username token IP_FreeRADIUS Offset FreeRADIUS_Secret
# radtest user_nolabnoparty 127.0.0.1 0 secret1234
Visualizzando il messaggio Access-Accept, il sistema ha autenticato l’utente con la password OTP generata dallo Smartphone. Il sistema è adesso pronto per essere utilizzato.
Troubleshooting
Nel caso l’autenticazione fallisse sistematicamente con il messaggio Access-Rejected, verificare che la configurazione sia corretta.
- Verificare che i permessi e l’ownershipsia corretta nei seguenti file/directory:
- otpverify.sh
- /var/motp
- /var/motp/cache
- /var/motp/users
- Verificare che l’Epoch-Time sia in sync tra server e client seguendo la procedura nel sito Mobile-OTP.
- Verificare che il parametro Secret del token sia correttamente riportato nella configurazione dell’utente nel file /etc/raddb/users.
Grazie è molto interessante