Il servizio parte, un client si associa e nessuna rotta compare mai sul lato server. Oppure il demone rifiuta di partire e nomina un comando che non è riuscito a eseguire. Entrambi gli esiti seguono le stesse tre righe, di solito copiate insieme da una guida all’irrigidimento: passare a un account senza privilegi, rinunciare al gruppo e cambiare la radice del filesystem. Solo una delle tre nasconde file, e solo una di esse toglie il privilegio di modificare la tabella di routing. Separarle è il modo per capire quale riga vuoi davvero.

Che cosa toglie la gabbia di cui il demone ha ancora bisogno

Il cambio di radice avviene dopo l’avvio, quindi il demone conserva tutto ciò che ha già aperto e perde tutto ciò che aprirebbe dopo. Ogni helper che la connessione esegue dopo quel punto deve esistere dentro la nuova radice, insieme alle librerie condivise che carica. Una gabbia costruita con un file di configurazione e un certificato non ha nessuna delle due cose.

Passare a un account senza privilegi è una restrizione separata. Un processo che ha rinunciato a root può non essere in grado di modificare rotte o di alzare un’interfaccia anche quando il binario è proprio lì, quindi i due guasti vanno diagnosticati separatamente.

Tre condizioni decidono quale correzione serve

La prima condizione è come la tua build installa le rotte. Le versioni recenti di OpenVPN configurano l’interfaccia e la tabella di routing nel processo, mentre i pacchetti più vecchi e le configurazioni personalizzate si affidano a strumenti esterni o a script up e down. Se il log nomina un comando, c’è uno strumento esterno di mezzo e la gabbia lo nasconde. Se il log mostra invece un errore di permessi, il problema è l’account.

La seconda è la manutenzione. Una gabbia con binari copiati va aggiornata ogni volta che si aggiorna il pacchetto che li fornisce, altrimenti il primo aggiornamento lascia dietro un tunnel rotto. La terza è se un controllo specifico richieda davvero un chroot; se il requisito riguarda in realtà la separazione dei privilegi, il cambio di account può bastare da solo.

Signal in the logOther side of the boundaryRepair direction
Command not found after startupBinary and its libraries absent inside the new rootPopulate the jail, or drop the chroot line
Operation not permittedAccount lost the privilege to edit routesKeep the account privileged, or pre-create routes elsewhere
No such deviceJail lacks the tun device nodeCreate the node inside, or open it before the root change

Che cosa deve contenere una gabbia funzionante

Una gabbia che esegue comandi ha bisogno del binario, di ogni libreria a cui si collega e di ogni nodo di dispositivo che il demone apre tardi. Copia i pezzi e provali senza la VPN nello scenario:

ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up

Il primo comando elenca le dipendenze, ed è quello che la gente salta. Un binario copiato che non trova una libreria fallisce con un messaggio diverso da un binario mancante, ed entrambi sembrano un guasto di OpenVPN se letti dal lato client. Eseguire il comando a mano dentro la gabbia riproduce il guasto senza riavviare il servizio.

Copia anche la configurazione, i certificati e l’eventuale CRL dentro la gabbia, perché un file che il demone si aspetta di rileggere dopo l’avvio non verrà trovato una volta cambiata la radice. Annota quello che hai copiato, dato che il prossimo aggiornamento del pacchetto di rete sostituisce gli originali e lascia la gabbia sulla vecchia copia.

Ridurre invece l’irrigidimento

Se la gabbia esiste solo perché lo diceva una guida, togliere quella singola riga mantenendo le restrizioni sull’account è un esito difendibile. Il demone conserva la sua vista del filesystem e perde il problema, e la riduzione dei privilegi toglie comunque root dal processo di lunga durata.

Scrivi che cosa resta, e perché. Una configurazione che ha perso in silenzio un controllo senza una nota è come l’irrigidimento va alla deriva, e il prossimo audit chiederà perché la riga è sparita.

Dimezza le tre righe prima di scegliere

Copia la configurazione, disabilita tutte e tre le direttive e conferma che un client si connetta e che compaiano le rotte attese. Riattiva poi solo le righe dell’account, quindi solo il chroot. Il passaggio in cui il tunnel si rompe indica il confine, e così eviti di ricostruire una gabbia che non era mai la causa.

Quando torna a instradare, esegui una sessione client con verbosità più alta e leggi la riga che nomina il comando o il permesso fallito. Quella riga vale più del timeout che il client alla fine riporta.

Articoli correlati