[UPDATE: 2015-01-07]

In questo articolo spiegherò passo dopo passo come modificare la struttura di IPFire 2 per implementare alla configurazione standard di OpenVPN, l’autenticazione OTP (One time Password) di google authenticator.

Per configurare OpenVPN e google authenticator su IPFire 2.x basta installare il pacchetto da me creato e seguire pochi  semplici passi.

Il pacchetto (i386) e relative istruzioni d’installazione sono reperibili qui: http://www.homelab.it/index.php/2014/03/10/libpam-google-authenticator-ipfire-2-x-pack/

La procedura che riporterò di seguito è stata testata su IPFire 2.15 Core Update 75 ma con qualche modifica credo che possa essere compatibile anche con le versioni 2.x precedenti.

Potremmo inserire le implementazioni di google authenticator direttamente nei file di configurazione di OpenVPN, ma nel caso venisse fatta qualche modifica dalla pagina di amministrazione https://indirizzo_ip_ipfire:444/cgi-bin/ovpnmain.cgi , le personalizzazioni andrebbero perse.

Come ben sappiamo ogni volta che applichiamo qualche modifica dalla web gui, ipfire sovrascrive i relativi file di configurazione.

Per evitare questo, collegarsi tramite ssh su IPFire ed editare con vim il file:

/srv/web/ipfire/cgi-bin/ovpnmain.cgi

Posizionarsi tra la riga n° 187 e 188 inserendo:

     print CONF "plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn\n";

Dopo posizionarsi tra la riga n° 2154 e 2155 ed inserire:

     print CLIENTCONF "auth-user-pass\r\n";

Chiudere il file e salvare le modifiche.
Sempre tramite vim creare il file:

/etc/pam.d/openvpn

Prima di salvare il file scrivere al suo interno:

auth requisite pam_google_authenticator.so forward_pass
auth required pam_unix.so use_first_pass
account required pam_permit.so

In questa maniera configureremo OpenVPN in modo da usufruire dell’autenticazione pam oltre al classico scambio di certificati.
Le opzioni forward_pass e use_first_pass sono fondamentali per implementare il codice one-time passcode all’autenticazione pam_unix user+pass.

Per quanto riguarda la configurazione di OpenVPN in modalità Roadwarrior (Client-to-Net)  parto dal presupposto che sappiate già come muovervi, se così non fosse vi rimando alla documentazione (wiki) ufficiale: Qui 
L’ultima parte dell’articolo riguarda la creazione dell’utente vpn, ad esempio claudiovpn .
Prima di tutto va creato l’utente e relativo certificato tramite la web-gui di IPFire:

https://indirizzo_ip_ipfire:444/cgi-bin/ovpnmain.cgi

OpenVPNClient

Dopo, tramite ssh, creare l’utente di sistema e settare una password:

[root@firewall ~]# useradd claudiovpn  -m
[root@firewall ~]# passwd claudiovpn
Changing password for claudiovpn
Enter the new password (minimum of 5, maximum of 127 characters)
Please use a combination of upper and lower case letters and numbers.
New password:
Re-enter new password:
Password changed.
[root@firewall ~]#

Loggarsi temporaneamente col nuovo utente per creare il token di google:

[root@firewall ~]# su claudiovpn -
[claudiovpn@firewall]$ /usr/local/bin/google-authenticator

Do you want authentication tokens to be time-based (y/n) y <--- Rispondere Y
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/claudiovpn@firewall%3Fsecret%3D5MG7M2XNSNJPQHIN
Your new secret key is: 5MG7M2XNSNJPQHIN <--- Codice per l'app google che genera il one-time passcode
Your verification code is 821553
Your emergency scratch codes are:
48058587
37432228
51593683
26172608
44428685

Do you want me to update your "/home/claudiovpn/.google_authenticator" file (y/n) y <--Rispondere Y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y <--- Rispondere come meglio si preferisce

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n <--- Rispondere come meglio si preferisce

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y <--- Rispondere come meglio si preferisce
[claudiovpn@firewall]$ exit
exit
[root@firewall ~]#

Per rendere ancor più sicuro l’account, editare il file /etc/passwd e cambiare la shell dell’utente appena creato da /bin/bash a /bin/false .

Per configurare il client OpenVPN, basta scaricare il pacchetto di configurazione del proprio utente dalla pagina: https://indirizzo_ip_ipfire:444/cgi-bin/ovpnmain.cgi cliccando sull’icona del floppy.
Scompattare il contenuto del file zip, un file .ovpn e un cerificato, all’interno della directory di configurazione del client OpenVPN.

Una volta caricato l’account, dopo aver inizializzato la connessione, ci verranno richieste le credenziali di accesso.
A questo punto non rimane che inserire la login e la password+one-time passcode.
Ad esempio se la password fosse welcome e il passcode generato 123456, l’autenticaizone sarebbe:

Login: claudiovpn 
Pass: welcome123456

Siamo arrivati alla fine, se avete seguito tutti i passaggi in maniera corretta riuscirete a collegarvi alla VPN.
Per qualsiasi info o delucidazione commentate pure senza problemi.