Guida alle tecnologie

Come configurare OpenVPN per autenticarsi con LinOTP

6 min read Sicurezza Aggiornato 02 Oct 2025
OpenVPN con autenticazione LinOTP
OpenVPN con autenticazione LinOTP

Questo articolo spiega passo passo come integrare OpenVPN con LinOTP per ottenere autenticazione a due fattori (2FA) basata su OTP. Troverai istruzioni per installare il modulo PAM pam_py_linotp, configurare OpenVPN per usare PAM e controlli aggiuntivi su sicurezza, test e rollback.

Importante: questa guida presuppone conoscenze di base su Linux, PAM e OpenVPN. Testa sempre le modifiche in un ambiente di staging prima di applicarle in produzione.

Introduzione

Questa guida mostra come configurare OpenVPN per autenticare gli utenti contro il backend di autenticazione LinOTP. In questo modo puoi far funzionare la VPN con autenticazione a due fattori usando diversi tipi di token OTP. Se hai pochi utenti che usano solo lo smartphone come token potresti preferire soluzioni più semplici, ma per gestire molti utenti e token diversi LinOTP è più adatto.

Breve definizione: LinOTP è un server per la gestione di token OTP (One-Time Password) che si integra via Web API, RADIUS o PAM.

Prerequisiti

  • Server Linux con OpenVPN già installato.
  • LinOTP installato (stesso host o accessibile via rete).
  • Accesso root o sudo.
  • Certificati CA/cliente/Server per OpenVPN configurati.

Installare e preparare LinOTP

Puoi installare LinOTP usando pacchetti Debian/Ubuntu o pip dal Python Package Index per un rapido test. Per ambienti di produzione preferisci i pacchetti della tua distribuzione o una procedura di deployment ripetibile.

Suggerimento operativo: per semplicità amministrativa puoi installare LinOTP e OpenVPN sullo stesso server, riducendo la latenza e la complessità delle comunicazioni.

Configurare PAM per LinOTP

Ci sono varie modalità per autenticare contro LinOTP: Web API, RADIUS o PAM. Per evitare di compilare moduli C useremo pam_py_linotp, un modulo PAM scritto in Python.

Procedura di installazione di pam_py_linotp (esempi):

Esempio manuale:

tar -ztf pam_py_linotp-0.1.tar.gz

cd pam_py_linotp-0.1/

sudo python setup.py install

Installazione rapida con pip:

sudo pip install pam_py_linotp

Copia singolo modulo (alternativa):

cd pam_py_linotp-0.1/

cp src/ pam_linotp.py /lib/security

Per usare il modulo Python installa anche libpam-python:

sudo apt-get install libpam-python

oppure

yum install libpam-python

Creiamo un file PAM riutilizzabile (stackable) chiamato common-linotp per facilitare l’uso con più servizi:

auth    [success=1 default=ignore]      pam_python.so /lib/security/pam_linotp.py \  
     debug url=https://localhost/validate/check  
auth    requisite           pam_deny.so  
auth    required            pam_permit.so

Note:

  • Il primo argomento dopo pam_python.so è il modulo Python (pam_linotp.py).
  • La chiave url= indica dove risiede il servizio LinOTP (https o http, porta inclusa se non standard).
  • Usa “localhost” se LinOTP è sulla stessa macchina; altrimenti sostituisci con l’IP o hostname.

Configurare OpenVPN per usare PAM

Esempio di file client.ovpn (configurazione client):

client  
dev tun  
proto udp  
remote your.server.com 1194  
resolv-retry infinite  
nobind  
persist-key  
persist-tun  
ca ca.crt  
cert client.crt  
key client.key  
comp-lzo  
verb 3  
auth-user-pass

Adatta servername e nomi dei certificati.

Esempio di server.conf (OpenVPN server):

port 1194  
proto udp  
dev tun  
ca ca.crt  
cert server.crt  
key server.key  
dh dh2048.pem  
server 192.168.42.0 255.255.255.0  
ifconfig-pool-persist ipp.txt  
keepalive 10 120  
comp-lzo  
persist-key  
persist-tun  
status openvpn-status.log  
verb 3  
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn

Adatta i nomi dei certificati e il pool IP.

Infine, crea o modifica /etc/pam.d/openvpn per includere la nostra configurazione PAM:

@include common-linotp 
session    sufficient pam_permit.so
account    sufficient  pam_permit.so

Spiegazione rapida:

  • L’include invoca la logica definita in common-linotp.
  • Le direttive session/account con pam_permit.so evitano di dover creare account locali per ogni utente VPN.

Quando l’utente inserisce il corretto OTP (ed eventuale PIN), la connessione VPN viene stabilita.

Verifica e test

Test base:

  • Avvia OpenVPN server in modalità verbosa (verb 3 o superiore).
  • Tenta connessioni client e verifica i log di /var/log/syslog o openvpn-status.log.
  • Verifica che richieste errate (OTP sbagliato) rifiutino l’accesso e non lascino sessioni aperte.

Casi di test consigliati (accettazione):

  • Utente valido + certificato valido + OTP valido => connessione riuscita.
  • Utente valido + certificato valido + OTP errato => rifiuto.
  • Certificato mancante o non valido => rifiuto anche con OTP valido.
  • Test di carico minimo: più sessioni concorrenti per verificare stabilità.

Alternative e modelli decisionali

Alternative possibili:

  • Usare LinOTP via RADIUS invece di PAM (utile se hai già un RADIUS centrale).
  • Usare la Web API direttamente da un plugin custom se hai esigenze particolari.
  • Soluzioni cloud 2FA alternative (es. Duo, Google Authenticator con plugin RADIUS) per scenari gestiti.

Modello decisionale rapido:

  • Vuoi integrazione centralizzata con altri servizi => preferisci RADIUS.
  • Vuoi semplicità e controllo locale => PAM con pam_py_linotp.
  • Necessiti di alta disponibilità per LinOTP => distribuisci LinOTP su più nodi e bilancia.

Sicurezza e hardening

Azioni consigliate:

  • Esegui LinOTP dietro HTTPS (certificato valido).
  • Limita l’accesso alla porta di management LinOTP tramite firewall (solo OpenVPN server).
  • HSM o protezione dei certificati OpenVPN su filesystem sicuro.
  • Monitora i tentativi di autenticazione falliti e imposta alert.

Risk matrix (qualitativa):

RischioImpattoProbabilitàMitigazione
Compromissione del server LinOTPAltoMedioIsolare LinOTP, backup, logging, patching
Attacco brute-force OTPMedioMedioRate-limit, alerting, lockout temporanei
Certificato cliente rubatoAltoBassoCRL/OCSP, revoca rapida

Playbook di emergenza e rollback

Brevi passi per rollback se si rompe l’autenticazione:

  1. Ripristina /etc/pam.d/openvpn a una copia funzionante.
  2. Disabilita includere common-linotp temporaneamente e lascia autenticazione tramite certificato client soltanto.
  3. Ripristina LinOTP da snapshot o avvia istanza di standby.
  4. Notifica gli utenti e applica indagine forense.

Checklist per ruoli

Amministratore OpenVPN:

  • Verificare che plugin openvpn-auth-pam.so sia presente.
  • Testare connessioni client con log verbose.

Amministratore LinOTP:

Operatore sicurezza:

  • Monitorare tentativi falliti e metriche SLI (es. % autenticazioni riuscite).
  • Verificare policy di rotazione dei token/PIN.

Decisione rapida (diagramma)

flowchart TD
  A[Inizio: devo integrare 2FA con OpenVPN?] --> B{Ho RADIUS centrale?}
  B -- Sì --> C[Integrare LinOTP con RADIUS]
  B -- No --> D{Preferisco gestire tutto localmente?}
  D -- Sì --> E[Usare PAM 'pam_py_linotp']
  D -- No --> F[Usare Web API o plugin custom]
  C --> G[Configurare RADIUS client in OpenVPN]
  E --> G[Configurare PAM in /etc/pam.d/openvpn]
  F --> G[Implementare flusso di autenticazione nel plugin]

Compatibilità e migrazione

  • pam_py_linotp richiede libpam-python; alcune distribuzioni moderne (es. recenti Ubuntu) potrebbero aver cambiato i pacchetti: verificare repository ufficiali.
  • Se migrando da un’implementazione RADIUS, mappa attributi e politiche token su LinOTP.

Domande frequenti

Q: Posso usare solo certificati client senza OTP?
A: Sì, ma la forza dell’approccio è il doppio fattore; puoi configurare PAM per permettere la sola autenticazione certificata temporaneamente.

Q: LinOTP supporta smartphone come token?
A: Sì, supporta app TOTP come Google Authenticator o token hardware e altre varianti.

Q: Posso mettere LinOTP e OpenVPN su host separati?
A: Sì. Assicurati che OpenVPN server possa raggiungere l’endpoint LinOTP via HTTPS e aggiorna la URL in common-linotp.

Glossario rapido

  • OTP: One-Time Password, password valida una sola volta.
  • PAM: Pluggable Authentication Modules, sistema di autenticazione modulare di Linux.
  • LinOTP: Server per la gestione e validazione di token OTP.

Conclusione

Abbiamo configurato OpenVPN per autenticare gli utenti con token OTP gestiti da LinOTP usando il modulo PAM pam_py_linotp. L’approccio combina autenticazione basata su certificati client e OTP utente, garantendo che sia la macchina sia l’utente siano autorizzati.

Riepilogo delle azioni pratiche:

  • Installare LinOTP e pam_py_linotp.
  • Creare common-linotp con URL corretto verso LinOTP.
  • Configurare OpenVPN per usare openvpn-auth-pam.so e aggiornare /etc/pam.d/openvpn.
  • Testare e predisporre procedure di rollback.

Annuncio breve (100–200 parole)

Abbiamo rilasciato una guida completa per integrare OpenVPN con LinOTP e abilitare l’autenticazione a due fattori tramite OTP. La procedura usa il modulo PAM pam_py_linotp per connettere OpenVPN al backend LinOTP: è adatta sia per ambienti con gestione centralizzata di token sia per scenari in cui LinOTP e OpenVPN convivono sullo stesso host. La guida include esempi di configurazione, checklist per ruoli, test di accettazione e un playbook di emergenza per rollback rapido. Implementando questa integrazione, ottieni un livello di sicurezza superiore perché la VPN richiede sia il certificato del dispositivo sia l’OTP dell’utente.

Autore
Redazione

Materiali simili

Account Facebook violato: come recuperarlo
Sicurezza

Account Facebook violato: come recuperarlo

Correggere l'errore 0x80070718 in Windows 10
Windows

Correggere l'errore 0x80070718 in Windows 10

Come usare CoinDCX per comprare e vendere crypto
Criptovalute

Come usare CoinDCX per comprare e vendere crypto

Vedere i post a cui hai messo Mi piace su Instagram
Social Media

Vedere i post a cui hai messo Mi piace su Instagram

OpenVPN con autenticazione LinOTP
Sicurezza

OpenVPN con autenticazione LinOTP

Analisi Instagram: misurare il successo
Social Media

Analisi Instagram: misurare il successo