Mettere in pausa l’accesso di un client e rimuoverlo per sempre sembrano lo stesso compito finché non si prova ad annullare una delle due cose. Revocare un certificato scrive un record che il server tratta come definitivo, e invertirlo significa modificare a mano il database dell’emittente. Scartare il tunnel attivo è un comando di gestione che non cambia nulla nella fiducia. Scegliete la leva chiedendovi se la chiave è ancora affidabile, non chiedendovi quanto sembri urgente la richiesta.

La convinzione: revocato e sospeso sono la stessa cosa

Un appaltatore viene messo in pausa per una settimana e il riflesso è revocare, perché revoca suona come spegnere qualcosa. Sembra ordinato, richiede dieci secondi, e lascia una modifica al database come unica via di ritorno. Il riflesso è comprensibile ed è più vicino a bruciare un passaporto che a chiudere una porta. Un dispositivo in pausa e una chiave compromessa richiedono trattamenti diversi, e solo uno dei due è economico da annullare.

La distinzione riguarda la credenziale e non la persona. Una chiave ancora nelle mani giuste può essere messa in pausa e ripresa senza alcuna perdita di fiducia. Una chiave che potrebbe essere stata copiata non dovrebbe mai essere ripristinata, perché il ripristino afferma che la copia non esiste.

Scrivete la risposta prima di toccare uno dei due sistemi. Se non potete dire se la chiave è esposta, la risposta prudente è la sostituzione.

Scartate la sessione attiva con l’interfaccia di gestione

OpenVPN espone un’interfaccia di gestione che può elencare le sessioni e ucciderne una per nome comune. Attivatela su localhost, tenetela lontana dall’interfaccia pubblica, e inviate il comando di uccisione quando una sessione deve sparire subito. Il comando chiude solo quel tunnel, e ogni altro client continua a funzionare.

Questa è una risposta a un problema attivo, non una politica di sospensione. Lo stesso profilo può riconnettersi in un minuto, perché nulla della sua credenziale è cambiato. Usatela quando la sessione deve andarsene e la decisione duratura è ancora in corso.

Confermate che la sessione era connessa prima di ucciderla, per non inseguire un client che non si è mai connesso. Il comando di stato qui sotto stampa ciò che è attualmente connesso.

printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506

Se l’uccisione segnala che non esiste alcun client di quel tipo, il nome comune nel certificato non è la stringa che avete digitato. Leggete l’output di stato invece del nome del file di profilo.

Cosa controlla davvero la CRL

Il server non consulta un flag di revoca memorizzato sul certificato. Legge la lista di revoca dei certificati indicata in crl-verify, a ogni nuova connessione, e rifiuta un certificato il cui numero di serie compare in quella lista. Ne derivano due conseguenze, ed entrambe contano operativamente. Il file deve essere leggibile dall’account a cui il server cede i privilegi, e un client già connesso continua a funzionare finché non si riconnette.

La seconda conseguenza sorprende le persone durante gli incidenti. Revocare un certificato non chiude il tunnel che lo sta usando in quel momento. Abbinate la revoca a un’uccisione di gestione se la sessione deve finire immediatamente, e trattate le due azioni come passaggi separati del manuale.

Ispezionate la lista per vedere cosa applicherà realmente il server, invece di fidarvi della marca temporale dell’ultimo file copiato. Il conteggio delle serie è la parte che conta.

openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pem

Una lista senza voci e una lista con le voci giuste sembrano identiche in un elenco di directory, per questo vale la pena stampare il conteggio delle serie. La riga dei permessi conta altrettanto, perché un file che il demone non riesce a leggere produce un guasto che sembra un client rifiutato.

Ripristinare un record, con attenzione

Ripristinare un certificato significa invertire un record nel database di emissione e pubblicare una nuova lista. easy-rsa 3 tiene quel database come index.txt nella directory PKI, mentre le disposizioni più vecchie usavano un’altra struttura. Una riga inizia con una lettera di stato e una data di scadenza. Una riga revocata inserisce una marca temporale per la revoca prima di proseguire con il numero di serie, il nome del file del certificato e il nome distinto. Rimettere a posto una riga significa cancellare quella marca temporale e invertire la lettera, lasciando tutto il resto in pace.

Fate prima un backup del file, e realizzate la modifica come script invece di digitarla in un editor di testo. Un errore di battitura che cambia quanti campi porta una riga rompe l’emissione per ogni certificato aggiunto dopo. È questa la ragione per automatizzare la modifica e copiare il file prima di toccarlo.

Una seconda revoca dello stesso nome spesso fallisce anch’essa, perché la prima esecuzione ha spostato quel certificato e la sua chiave fuori dalle directory in cui lo strumento si aspetta di trovarli. Lo strumento allora non trova ciò che gli è stato chiesto di revocare, e il messaggio di errore non spiega sempre chiaramente il perché.

cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crl

Pubblicate la nuova lista, correggetene la proprietà e fate in modo che il server la legga. Un ricaricamento basta nella maggior parte delle installazioni, ma la conferma deve venire da una connessione nuova, visto che la sessione esistente non ha ricontrollato nulla.

Verificate quale leva merita il caso

Ponete la domanda che decide tutto il manuale: la chiave privata è ancora soltanto dove dovrebbe essere. Se lo è, l’uccisione della sessione più una pausa documentata copre il caso e non lascia alcun record permanente. Se non lo è, l’unica risposta sicura è una chiave nuova con il vecchio certificato lasciato revocato.

Poi verificate l’esito con un tentativo di connessione e non con una differenza di configurazione. La differenza vi dice cosa intendevate, e la connessione vi dice cosa applica il server.

openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506

Quando un client ripristinato si connette e compare nell’output di stato, la modifica del record ha funzionato. Quando un client revocato viene rifiutato e il log nomina la CRL, la revoca ha funzionato. Qualunque cosa nel mezzo è un problema di permessi o di ricaricamento, e vale la pena sistemarlo prima che arrivi la richiesta successiva.

Articoli correlati