PQC Status
Guida

TLS post-quantum ibrido su un ingress Kubernetes

Un percorso pratico per i team di piattaforma: individuare il vero punto di terminazione TLS, impostare i gruppi di scambio di chiavi in modo prudente, poi verificarlo dall'internet pubblico.

· 7 min

In un cluster Kubernetes, il TLS post-quantum ibrido si configura nel punto in cui l'handshake termina realmente, quasi mai nel container applicativo. Questo punto è di solito il pod dell'ingress controller, un load balancer cloud posto davanti a esso oppure un sidecar di service mesh. Il lavoro si articola in quattro passaggi: individuare il vero punto di terminazione, verificare la versione della libreria TLS in esecuzione in quel punto, inserire un gruppo ibrido come X25519MLKEM768 prima di un gruppo classico nell'elenco delle preferenze, quindi verificare dall'esterno del cluster.

Passaggio 1: individuare dove termina davvero l'handshake

Capita spesso che i team configurino il componente sbagliato e concludano che il loro controller non supporta lo scambio di chiavi post-quantum. Ricostruite prima il percorso di un pacchetto client. Solo il componente che detiene la chiave privata e invia il ServerHello decide il gruppo di scambio di chiavi.

Punto di terminazioneChi sceglie il gruppo di scambio di chiaviCosa verificare per primo
Pod dell'ingress controller (nginx, basato su Envoy, HAProxy, Traefik)Il controller, tramite la sua ConfigMap o il proprio oggetto di configurazioneLa versione della libreria TLS all'interno dell'immagine del controller
Load balancer cloud di livello 7 che termina il TLSIl provider, tramite una policy TLS o di sicurezza con nomeSe il provider offre una policy che include un gruppo ibrido
Load balancer cloud di livello 4 in modalità passthrough o TCPL'ingress controller retrostante, perché l'handshake lo attraversaChe il servizio sia davvero in passthrough TCP e non termini il TLS
CDN, WAF o reverse proxy davanti al clusterQuel servizio di edge, per ogni hostname pubblico che esponeLe opzioni di configurazione TLS documentate per ciascun hostname
Sidecar di service mesh (mutual TLS est-ovest)Il control plane della mesh e la build del proxy sidecarSe il traffico interno rientra effettivamente nel perimetro di questa fase

Confermate la topologia con comandi in sola lettura prima di modificare qualsiasi cosa:

kubectl get ingress -A -o wide
kubectl -n ingress-nginx get svc -o wide
kubectl -n ingress-nginx get svc ingress-nginx-controller -o jsonpath='{.metadata.annotations}'

Le annotazioni del load balancer sul Service del controller indicano se il livello cloud termina il TLS o lo lascia passare. Se lo termina, nessuna impostazione dell'ingress modificherà il gruppo negoziato.

Passaggio 2: verificare cosa supporta la libreria TLS del controller

I gruppi ibridi sono una proprietà dello stack TLS compilato nell'immagine del controller, non di Kubernetes. Per le build basate su OpenSSL, è richiesto OpenSSL 3.5 o successivo per i gruppi ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism). I data plane basati su BoringSSL, come Envoy, usano una propria nomenclatura dei gruppi e una propria matrice di supporto: consultate quindi le note di rilascio della versione esatta che utilizzate.

kubectl -n ingress-nginx exec deploy/ingress-nginx-controller -- openssl version

Se la versione è precedente alla 3.5, fermatevi qui e pianificate un aggiornamento del controller. Nessuna chiave di configurazione può abilitare un gruppo che la libreria non implementa.

I nomi dei gruppi e i codepoint IANA che potete legittimamente utilizzare sono pubblicati nel registro dei parametri TLS (iana.org):

L'accordo di chiavi ibrido per TLS 1.3 è specificato nella RFC 10024 (rfc-editor.org). ML-KEM stesso è FIPS 203, definitivo dal 13 agosto 2024 (csrc.nist.gov). Il gruppo pre-standard della bozza Kyber X25519Kyber768Draft00 (0x6399) è obsoleto: se compare in un punto qualsiasi della vostra configurazione, rimuovetelo.

Passaggio 3: impostare i gruppi, con un fallback classico

Per ogni connessione viene negoziato un solo gruppo di scambio di chiavi, e il server sceglie tra quelli offerti dal client. Elencare per primo un gruppo ibrido e dopo un gruppo classico è quindi sicuro per costruzione: i client che conoscono il gruppo ibrido lo utilizzano, i client meno recenti ripiegano su X25519 o P-256.

ingress-nginx

Il controller espone la chiave ConfigMap ssl-ecdh-curve, che corrisponde alla direttiva nginx ssl_ecdh_curve e viene passata alla libreria TLS come elenco ordinato di gruppi (il suo valore predefinito è auto). Verificate la chiave nella documentazione di riferimento della ConfigMap per la versione del controller che utilizzate, quindi applicate:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  ssl-protocols: "TLSv1.3 TLSv1.2"
  ssl-ecdh-curve: "X25519MLKEM768:X25519:prime256v1"

Qui prime256v1 è il nome OpenSSL di secp256r1. Mantenere due gruppi classici dopo quello ibrido preserva i client TLS 1.2 e qualsiasi client TLS 1.3 che non implementa ML-KEM. La stessa logica di ordinamento si applica a un web server autonomo, come descritto nella nostra guida per abilitare ML-KEM su nginx, Apache, HAProxy e Caddy.

Altri controller e service mesh

Non copiate le annotazioni da un controller all'altro. Un'annotazione che il controller non riconosce viene ignorata senza alcun avviso, ed è questa la modalità di errore più pericolosa: il rollout sembra riuscito e nulla è cambiato. Il principio è identico ovunque, cambia l'interfaccia:

Per ora lasciate invariata la catena di certificati

Il traffico registrato è protetto unicamente dallo scambio di chiavi, ed è proprio questo il punto dell'attacco harvest now, decrypt later: un attaccante che archivia oggi il testo cifrato può decifrarlo in seguito se lo scambio di chiavi era classico. Il nostro articolo su harvest now, decrypt later spiega perché lo scambio di chiavi viene per primo. I certificati possono migrare in un secondo momento: le autorità di certificazione pubbliche emettono ancora certificati ECDSA e RSA, e le firme ML-DSA, standardizzate come FIPS 204, non sono ancora generalmente disponibili nelle catene TLS pubbliche. In questa fase mantenete invariato il vostro issuer cert-manager esistente.

Passaggio 4: verificare dall'esterno del cluster

Eseguite il test da una macchina sull'internet pubblico, attraverso lo stesso percorso seguito da un browser. Non verificate mai con kubectl port-forward: aggira il load balancer e l'edge, e può quindi mostrare un handshake ibrido che nessun client reale otterrà mai. Con OpenSSL 3.5 o successivo:

openssl s_client -connect www.example.com:443 -servername www.example.com \
  -groups X25519MLKEM768 </dev/null 2>/dev/null | grep -i 'Negotiated TLS1.3 group'

Un esito positivo stampa il gruppo negoziato. Dimostrate poi che il fallback funziona ancora, il test che i team dimenticano:

openssl s_client -connect www.example.com:443 -servername www.example.com \
  -groups X25519 </dev/null 2>/dev/null | grep -i 'Negotiated TLS1.3 group'

Ripetete entrambi i test per ogni hostname pubblico, compreso il dominio apex e qualsiasi host servito da una seconda ingress class o da un diverso provider di edge. Un cluster con due ingress class finisce spesso per essere migrato solo a metà. Cosa un test esterno può e non può mostrare è descritto nella nostra metodologia dello scanner.

Passaggio 5: distribuire e conservare le evidenze

  1. Applicate la modifica prima in staging, su un controller che esegue lo stesso tag di immagine della produzione.
  2. Promuovetela su un solo hostname di produzione o su una sola ingress class canary, non sull'intera flotta.
  3. Monitorate gli errori di handshake TLS e la CPU del controller per almeno un ciclo operativo completo. Le key share ML-KEM sono più grandi di una share X25519, quindi i messaggi ClientHello e ServerHello aumentano di dimensione.
  4. Tenete pronto il rollback: riportare la chiave ConfigMap al valore precedente ripristina il comportamento originario al reload successivo.
  5. Registrate il risultato nel vostro inventario crittografico, con la data e l'host testato.

È in quest'ultimo passaggio che una modifica di piattaforma diventa un'evidenza di conformità. La corrispondenza seguente è la nostra lettura di come l'artefatto tecnico risponde al requisito, non una citazione dei testi. Si tratta di informazioni, non di consulenza legale.

RequisitoCosa richiede il testoArtefatto prodotto da questa modifica
PCI DSS v4.0.1 req. 12.3.3Inventario documentato delle cipher suite e dei protocolli in uso, riesaminato almeno ogni 12 mesiLa ConfigMap del controller, sotto controllo di versione, più l'output datato del test esterno
DORA RTS (EU) 2024/1774, Art. 6Una politica di cifratura con disposizioni per modificare la tecnologia crittografica in funzione dell'evoluzione della crittoanalisiL'ordinamento dei gruppi documentato e la procedura di rollback testata
DORA RTS (EU) 2024/1774, Art. 7Gestione delle chiavi lungo l'intero ciclo di vita e un registro dei certificati per gli asset criticiL'inventario degli issuer cert-manager per gli hostname dell'ingress

Passaggio successivo

Una volta applicata la ConfigMap e superati i test in staging, confermate il risultato visibile dall'esterno: analizzate il vostro dominio con PQC Status per vedere quale gruppo di scambio di chiavi il vostro ingress negozia effettivamente, quali versioni di TLS offre e come si presenta la catena di certificati. Eseguite la scansione una volta per ogni hostname pubblico, prima e dopo ogni aggiornamento dell'immagine del controller, perché una modifica dell'immagine può riportarvi silenziosamente a un gruppo classico. Una scansione descrive soltanto la configurazione TLS visibile dall'esterno: non è una certificazione né un'attestazione di conformità.

Domande frequenti

Posso abilitare il TLS post-quantum ibrido se è un load balancer cloud a terminare il mio TLS?

Non da Kubernetes. Quando un load balancer gestito di livello 7 termina il TLS, è lui a scegliere il gruppo di scambio di chiavi, e il vostro unico controllo è la policy TLS con nome esposta dal provider. Verificate nelle note di rilascio del provider l'esistenza di una policy che includa un gruppo ML-KEM ibrido. Se non ne esiste alcuna, l'alternativa è spostare la terminazione all'interno del cluster dietro un servizio passthrough di livello 4, una modifica architetturale che merita una revisione separata.

Aggiungere X25519MLKEM768 creerà problemi ai client meno recenti?

Non dovrebbe, a condizione di mantenere un gruppo classico dopo di esso nell'elenco, ad esempio X25519 e poi secp256r1. Per ogni connessione viene negoziato un solo gruppo, e il server può scegliere solo tra quelli offerti dal client: i client che non implementano ML-KEM ripiegano semplicemente sul gruppo classico. Testate sempre esplicitamente il fallback in staging, non solo l'handshake ibrido.

Quale versione di OpenSSL richiede l'immagine dell'ingress controller?

Per le build basate su OpenSSL, è richiesto OpenSSL 3.5 o successivo per i gruppi TLS ML-KEM. Verificatela all'interno del pod in esecuzione anziché dedurla dalla versione del chart. I data plane basati su BoringSSL, come Envoy, hanno una propria nomenclatura e una propria matrice di supporto: consultate quindi le note di rilascio della versione esatta che utilizzate.

Servono anche certificati post-quantum sull'ingress?

Non in questa fase. Il traffico registrato è protetto dal solo scambio di chiavi, ed è per questo che l'accordo di chiavi ibrido viene per primo mentre le firme possono migrare in seguito. ML-DSA è uno standard NIST definitivo (FIPS 204) ma non è ancora generalmente disponibile nelle catene di certificati TLS pubbliche: per ora mantenete il vostro issuer ECDSA o RSA esistente e rivalutate quando le autorità di certificazione pubbliche offriranno catene post-quantum.