L'esaurimento dell'alea del kernel è una spiegazione attraente per un VPN lento, e quasi sempre quella sbagliata per il sintomo che le persone riportano. Un host che attende output casuale si blocca in un momento preciso, di solito all'inizio dell'avvio o durante la gestione delle chiavi. Un tunnel che si connette in fretta e poi trasferisce lentamente sta invece descrivendo la velocità effettiva. Separa queste due osservazioni prima di installare un demone per correggere un numero che non hai finito di leggere.

Perché il mito sopravvive

Entrambi i problemi sono reali e da lontano sembrano uguali. I blocchi all'avvio su una macchina virtuale appena avviata accadono davvero, e un tunnel stabilito lento è altrettanto reale. L'errore è supporre che il secondo sia causato dal primo perché la crittografia compare da qualche parte in entrambe le storie. Nulla nella parola cifratura implica che ogni byte trasferito consumi un byte fresco di rumore ambientale.

Non è così che funzionano questi generatori. Una libreria crittografica mantiene un generatore con seme e ne trae output, riseminandolo secondo la propria politica, quindi il momento costoso è la seminagione, non il trasferimento costante.

Cosa fa un generatore per pacchetto

In OpenSSL 3 la gerarchia di generatori predefinita è costruita con istanze DRBG che seminano e riseminano in base alla configurazione e allo stato. In OpenVPN 2.6 il percorso dati AEAD deriva il proprio nonce dal numero di sequenza del pacchetto combinato con un valore implicito per sessione, mentre il percorso CBC più vecchio estrae un IV pseudo-casuale per pacchetto. Nessuno dei due schemi sostiene la regola che spostare un gigabyte consumi un gigabyte di rumore nuovo del kernel. Entrambi sostengono l'idea che la generazione delle chiavi e le strette di mano siano il punto in cui la seminagione conta.

Il caso CBC merita di essere nominato perché sembra il mito e non lo è: il suo IV per pacchetto proviene dal generatore della libreria secondo il calendario di riseminagione della libreria stessa, mai da una chiamata al kernel per pacchetto. Quando qualcuno cita un costo di entropia per byte, chiedi quale versione di libreria e quale percorso di codice hanno misurato.

Dove si vede davvero l'attesa

Metti marche temporali attorno alle fasi, non attorno alla sessione: avvio, autenticazione, cambio di chiave e trasferimento. Un'attesa prima che il tunnel sia utilizzabile è una lamentela diversa da una velocità costante bassa, e solo una delle due punta al caso. Su Linux una richiesta getrandom() normale può bloccarsi finché la sorgente casuale del kernel non è inizializzata, ed è per questo che la versione all'avvio di questo problema è reale su macchine virtuali e schede embedded che hanno poco con cui alimentare il pool all'inizio.

FaseCosa eseguireLettura che significa attesaLettura che significa velocità effettiva
Avvio, prima di qualsiasi tunnelsystemd-analyze critical-chainun'unità che resta ferma per secondi prima che parta il tunnelnon applicabile, non si sta ancora trasferendo nulla
Stretta di manojournalctl -u openvpn-server@server -bun lungo intervallo prima che la sequenza di inizializzazione si completinon applicabile, il tunnel non è attivo
Trasferimento stabilitoss -tin accanto a sar -n DEV 1un processo bloccato con code di socket vuotecode piene, ritrasmissioni e un solo thread occupato

Due comandi economici appartengono all'inizio di quella raccolta, e risolvono le domande facili prima che la tabella sia persino necessaria. Il contatore che leggono è contabilità dell'entropia, non un misuratore di banda, e un singolo snapshot non può mostrare che un processo è bloccato, quanto ha atteso o quale interfaccia chiamano le sue funzioni di libreria. Un campione preso dopo il recupero di solito manca del tutto il blocco, quindi tieni la versione del kernel accanto alla lettura.

cat /proc/sys/kernel/random/entropy_avail
uname -r

Abbina la correzione alla lettura

Se il kernel attende davvero l'inizializzazione, guarda il percorso di seminagione supportato dalla piattaforma, non il tunnel. A una macchina virtuale si può dare un dispositivo casuale fornito dall'host, come virtio-rng, e la preparazione dell'immagine conta perché un seme copiato senza modifiche in molti ospiti non è un'inizializzazione indipendente. Se una libreria segnala errori di seminagione dopo l'avvio, esamina la sorgente configurata e il comportamento del fornitore invece di cambiare le impostazioni del kernel.

ss -tin dst 203.0.113.7
sar -n DEV 1 5

La documentazione del generatore di OpenSSL descrive come quella gerarchia ottiene input e quando avviene la riseminagione, che è un'affermazione molto più stretta del mito e vale solo per quell'implementazione. Un demone di entropia non è una riparazione universale della velocità, e installarlo per far salire un contatore modifica un'assunzione di sicurezza senza dimostrare un ritardo. Per la velocità effettiva, segui il percorso dei dati: un thread saturo, le ritrasmissioni, la perdita esterna e le cadute di coda richiedono ciascuno una correzione diversa, e le dimensioni dei buffer affrontano il buffering dei socket con le proprie prove di coda.

Articoli correlati