Hai un common name e un indirizzo nei tuoi appunti, e tre comandi che sembrano tutti rimuovere un client. Solo uno fa quello che vuoi, e la scelta dipende dal fatto che tu debba terminare la sessione in corso, rifiutare il prossimo accesso o togliere del tutto il diritto di connettersi. Leggi l'identità che possiedi davvero prima di toccare qualcosa, perché un pool OpenVPN assegna lo stesso indirizzo di tunnel a un'altra sessione più avanti.

Quale identità hai davvero

Un file di stato versione 3 è il punto di partenza abituale. La sezione CLIENT_LIST contiene il common name, l'indirizzo reale, i contatori di byte e il tempo di connessione; la sezione ROUTING TABLE mappa un indirizzo virtuale su un common name con un timestamp dell'ultimo riferimento. Il common name è l'identità stabile. L'indirizzo virtuale è un'assegnazione, e l'indirizzo reale dietro un NAT può cambiare tra sessioni senza che nulla cambi sul server.

L'interfaccia di gestione espone una vista simile tramite il suo comando status e aggiunge un ID client per sessione. È quell'ID che client-kill si aspetta, e non è l'indirizzo del tunnel. Se devi sapere quale common name ha ricevuto quale indirizzo al momento della connessione, l'ambiente di uno script client-connect ha entrambi, insieme all'indirizzo esterno fidato, ma quello script viene eseguito come utente OpenVPN e richiede un percorso di log scrivibile.

What you holdWhere it came fromWhat it can act on
Common nameCLIENT_LIST, or the auth hookkill, and credential revocation
Client IDstatus on the management socketclient-kill, that one session
Tunnel addressROUTING TABLE, client-connect environmentNothing durable, the address is recycled

Uccidere subito, negare all'accesso, revocare per sempre

Entrambi i comandi di rimozione dell'interfaccia di gestione sono azioni di sessione. kill accetta un common name o un indirizzo reale e una porta; client-kill accetta l'ID client e termina subito quell'istanza. Nessuno è un blocco: un client espulso con un certificato e una password validi si riconnette in pochi secondi, il che va bene quando ricicli un peer di test e non serve a nulla quando è stato rubato un portatile.

client-deny è un altro tipo di decisione. Di solito viene emesso da un hook di autenticazione o client-connect e rifiuta la sessione con un motivo, quindi si adatta a una politica che nega un accesso anziché a una che interrompe una connessione. La documentazione avverte anche che un rifiuto emesso durante una rinegoziazione TLS invalida la chiave rinegoziata mentre la sessione esistente può continuare fino alla chiusura della finestra di transizione. Se il requisito è che il client sia sparito subito, la risposta documentata è client-kill.

La rimozione duratura sta sotto tutto questo. Revoca il certificato e assicurati che crl-verify punti a un elenco che il server ricarica davvero, disabilita il file di configurazione specifico del client nella directory ccd, oppure disabilita l'account nel backend che l'hook di autenticazione interroga. Anche una revoca non è immediata: con le impostazioni predefinite di reneg-sec, una sessione stabilita può continuare finché non rinegozia, quindi l'azione di sessione e l'azione sulle credenziali sono complementari, non alternative.

Il socket di gestione è libero?

L'interfaccia di gestione serve un client alla volta. Se una GUI o un demone di monitoraggio tiene già la connessione, il tuo script non può agganciarsi accanto, e a seconda del client potresti espellere quello esistente invece di fallire in modo pulito. La sua password viaggia in chiaro su quel socket, quindi appartiene a un indirizzo locale o a un socket unix, mai a un'interfaccia pubblica.

Quando non puoi prendere il socket, hai ancora opzioni, e sono tutte più lente. Lascia prima la sessione della GUI se la controlli, oppure accetta la via dello strato delle credenziali e attendi la prossima rinegoziazione. Quello che non dovresti fare è riavviare il servizio per liberarti di un client, perché questo termina anche tutte le altre sessioni e distrugge le prove del file di stato per questa.

La sequenza che eseguo su un server in produzione

Agganciati, leggi lo stato corrente, agisci sull'ID che hai appena letto, poi rileggilo. I valori copiati da un documento sono il modo più comune per uccidere la persona sbagliata.

status                     # note the client ID and common name
client-kill 3              # end that session now
kill Test-Client           # alternative: by common name
status                     # confirm the session is gone

Il nome e il numero qui sopra sono segnaposto, e gli ID vengono riutilizzati dopo che altri client si disconnettono. Conferma che la riga sia assente prima di annotare qualcosa come fatto, e controlla che il conteggio dei client connessi si sia spostato di uno e non di diversi.

Conferma che sia rimasto fuori

Annota il common name, l'indirizzo del tunnel, l'indirizzo esterno e il minuto della rimozione. Se lo stesso common name ricompare un minuto dopo, l'azione di sessione ha funzionato e lo strato delle credenziali no, il che è una riparazione del tutto diversa da quella di un comando che non ha mai avuto effetto.

Poi prova dal lato client. Un certificato revocato dovrebbe fallire il successivo handshake; se si connette ancora, la CRL non viene letta affatto, e questo è il risultato che vale la pena segnalare. Scegli l'azione in base a ciò che devi terminare, conferma con un secondo status e correggi lo strato delle credenziali quando la risposta deve durare più della sessione.

Articoli correlati