Importa un profilo in un client desktop e il primo errore è spesso una riga che il client rifiuta di rispettare: un hook di script che non eseguirà, o un valore script-security che ritiene troppo permissivo. Alzare il numero fa sparire la finestra. Ma amplia anche ciò che quel profilo è autorizzato a eseguire sulla tua macchina, cosa strana da concedere solo per chiudere un avviso. Segui l’importazione fino alla direttiva e la decisione diventa concreta.

Dalla finestra di importazione alla direttiva

Il profilo è un file di testo con direttive, e il client le legge prima che esista qualsiasi tunnel. Una direttiva come up, down o tls-verify nomina un programma esterno che OpenVPN deve eseguire in un momento definito. Se OpenVPN sia disposto a eseguirlo è un’impostazione separata chiamata script-security, e il profilo di solito la imposta anch’essa.

Quindi l’avviso non riguarda la crittografia o i certificati. Riguarda un file di configurazione che chiede al client di eseguire qualcosa sull’host, e il client che verifica se il suo livello di autorizzazione attuale consente quella richiesta.

Due errori diversi sembrano uguali in questa fase. Un profilo che chiede un livello che il client non concederà produce un rifiuto. Un profilo che chiede un livello che il client concede ma lo script manca produce invece un errore in fase di esecuzione, e i due vengono confusi nei thread di supporto. Uno è una questione di autorizzazioni e l’altro di confezionamento.

Cosa apre davvero ogni livello

Il livello 0 vieta del tutto le chiamate a programmi esterni, cosa coerente per un client che configura da solo la propria interfaccia senza aiuto e incoerente per uno che ricorre al sistema operativo. Il livello 1, quello predefinito, consente gli eseguibili integrati necessari alla configurazione di interfaccia e rotte. Nessuno dei due esegue qualcosa fornito dall’utente.

LevelWhat OpenVPN may executeWhat it exposes
0No external programs at allInterface and route setup must not depend on helpers
1 (default)Built-in helpers such as ip, ifconfig, route or netshPrivileged commands the platform already ships
2Built-in helpers plus user-defined scriptsWhatever the named script does with the client's privileges
3Everything above, plus passwords in environment variablesCredentials visible to child processes and their logs

Il livello 2 è il confine interessante, perché ammette script definiti dall’utente. Da quel punto i privilegi del client si applicano a codice che forse non hai mai letto, invocato in momenti che non hai scelto, con un ambiente che contiene i dettagli della connessione. Il livello 3 va oltre e permette di passare password tramite variabili d’ambiente, ed è per questo che il manuale lo descrive come potenzialmente insicuro.

Nessuno di questi numeri è un’impostazione di forza. Un profilo al livello 3 non ha cifratura migliore di uno al livello 1; ha semplicemente una superficie di esecuzione più ampia, e il tunnel è identico.

Decidi cosa merita il profilo

Chiediti a cosa serve lo script prima di chiedere quale livello gli serva. Un hook che spinge le impostazioni DNS o ripara una rotta dopo la connessione è un motivo legittimo per eseguire qualcosa. Un hook che chiama un binario sconosciuto in una directory temporanea è un motivo per fermarsi.

Il percorso dello script conta quanto lo script. Un percorso relativo viene risolto rispetto alla directory che il client usa, e una directory scrivibile trasforma un’importazione una tantum in uno slot di esecuzione permanente. I percorsi assoluti in una directory che l’utente non può modificare sono la forma da preferire.

Gli script ereditano anche l’ambiente del client, dove vivono le credenziali e i metadati di connessione. È proprio questa eredità a rendere pericoloso il livello 3 in combinazione con uno script che registra il proprio ambiente, ed è il motivo per cui un dump diagnostico da un client con script attivi merita un secondo sguardo prima di essere incollato in un ticket. Rimuovi l’ambiente prima di condividerlo.

grep -nE 'script-security|^up |^down |tls-verify' client.ovpn

Cambia una cosa, poi osserva anche lo smontaggio

Se il profilo ha davvero bisogno di uno script, cambia solo il livello e solo per quel profilo. Esegui il client in primo piano con output dettagliato così che gli errori dello script siano visibili invece di essere inghiottiti da un gestore di servizi.

openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default

Prova l’intero ciclo di vita, non solo la connessione. Un hook di chiusura che fallisce lascia rotte che puntano a un tunnel morto, cosa che produce una macchina che sembra connessa e non raggiunge nulla. Riconnetti una volta e disconnetti una volta prima di dichiarare finita la modifica, e controlla la tabella di routing dopo ciascuna.

Conserva una copia del profilo originale. Se un client di piattaforma non implementa lo stesso modello di script, eliminare direttive finché l’importazione riesce può rimuovere l’integrazione DNS o delle rotte di cui il tunnel aveva bisogno, e la connessione risultante si autenticherà perfettamente senza risolvere nulla.

La decisione da annotare è stretta: quale script, su quale percorso, concesso a quale livello, per quale profilo. Tutto il resto del profilo resta invariato, ed è una frase che un revisore può verificare.

Articoli correlati