<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>TLS on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/tls/</link>
        <description>Recent content in TLS on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Sat, 03 Oct 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/tls/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>mTLS: autenticare i servizi, non solo i server</title>
        <link>https://www.matteobianchi.eu/p/mtls-service-to-service/</link>
        <pubDate>Sat, 03 Oct 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/mtls-service-to-service/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/mtls-service-to-service/cover.png" alt="Featured image of post mTLS: autenticare i servizi, non solo i server" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Nel &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;capitolo su TLS&lt;/a&gt; il server dimostra la propria identità al
client con un certificato. Ma il client resta anonimo: TLS verifica che stiate parlando con
&lt;code&gt;banca.it&lt;/code&gt;, non che &lt;code&gt;banca.it&lt;/code&gt; stia parlando con voi. Per un sito web va bene — l&amp;rsquo;utente si
autenticherà dopo, con la password. Per due &lt;strong&gt;servizi&lt;/strong&gt; che si parlano in un&amp;rsquo;architettura a
microservizi, invece, non c&amp;rsquo;è nessun &amp;ldquo;dopo&amp;rdquo;: il servizio A deve sapere, subito e con certezza, che
chi lo contatta è davvero il servizio B. Questo è il mutual TLS.&lt;/p&gt;
&lt;h2 id=&#34;tls-normale-contro-mtls&#34;&gt;TLS normale contro mTLS
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    subgraph TLS[&amp;#34;TLS normale&amp;#34;]
        C1[Client] --&amp;gt;|verifica il cert del server| S1[Server]
        S1 -.client anonimo.-&amp;gt; C1
    end
    subgraph MTLS[&amp;#34;mutual TLS&amp;#34;]
        C2[Servizio A] --&amp;gt;|presenta il proprio cert| S2[Servizio B]
        S2 --&amp;gt;|presenta il proprio cert| C2
        C2 &amp;lt;-.entrambi verificati.-&amp;gt; S2
    end
&lt;/pre&gt;

&lt;p&gt;In mTLS il server, durante l&amp;rsquo;handshake, invia un messaggio &lt;code&gt;CertificateRequest&lt;/code&gt;: chiede al client
di presentare &lt;strong&gt;a sua volta&lt;/strong&gt; un certificato. L&amp;rsquo;handshake si completa solo se &lt;strong&gt;entrambi&lt;/strong&gt; i
certificati sono validi e firmati da una CA di cui l&amp;rsquo;altro si fida. L&amp;rsquo;identità è reciproca e provata
a livello di trasporto, prima che passi un solo byte applicativo.&lt;/p&gt;
&lt;h2 id=&#34;dove-serve-davvero&#34;&gt;Dove serve davvero
&lt;/h2&gt;&lt;p&gt;mTLS brilla dove non c&amp;rsquo;è un utente umano a digitare una password:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Microservizi&lt;/strong&gt;: decine di servizi che si chiamano a vicenda dentro un cluster. mTLS dà a
ciascuno un&amp;rsquo;identità crittografica e cifra tutto il traffico interno.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero Trust&lt;/strong&gt;: il principio &amp;ldquo;mai fidarsi della rete&amp;rdquo; (vedi
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/zero-trust-architecture/&#34; &gt;Zero Trust Architecture&lt;/a&gt;) richiede che ogni
chiamata sia autenticata, anche dentro il perimetro. mTLS è il meccanismo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API tra organizzazioni&lt;/strong&gt;: due aziende che si scambiano dati possono legare l&amp;rsquo;accesso a un
certificato invece che a una API key, che è solo una stringa da rubare.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lidentità-sta-nel-certificato&#34;&gt;L&amp;rsquo;identità sta nel certificato
&lt;/h2&gt;&lt;p&gt;La differenza rispetto a una API key è sostanziale. Una key è un segreto condiviso: chi la ruba
diventa te. Un certificato client lega l&amp;rsquo;identità a una &lt;strong&gt;chiave privata&lt;/strong&gt; che non lascia mai il
servizio; sul filo viaggia solo una firma, mai il segreto. E un certificato ha una scadenza e si può
revocare, mentre una key resta valida finché qualcuno non se ne accorge.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;identità del chiamante viene letta dal campo del certificato, ad esempio il Subject o un SAN:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# generare un certificato client firmato dalla CA interna&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl req -new -newkey ed25519 -nodes -keyout svcA.key -out svcA.csr &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    -subj &lt;span class=&#34;s2&#34;&gt;&amp;#34;/CN=service-a.internal&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl x509 -req -in svcA.csr -CA ca.crt -CAkey ca.key -out svcA.crt -days &lt;span class=&#34;m&#34;&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Certificati a vita &lt;strong&gt;breve&lt;/strong&gt; (giorni, non anni) riducono il danno di una chiave compromessa: è il
modello di SPIFFE/SPIRE, che emette identità effimere ai workload.&lt;/p&gt;
&lt;h2 id=&#34;la-configurazione-nginx&#34;&gt;La configurazione (nginx)
&lt;/h2&gt;&lt;p&gt;Lato server, abilitare la verifica del certificato client è questione di tre direttive:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;443&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;ssl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;ssl_certificate&lt;/span&gt;     &lt;span class=&#34;s&#34;&gt;/etc/tls/server.crt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;ssl_certificate_key&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/etc/tls/server.key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;ssl_client_certificate&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/etc/tls/ca.crt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# la CA che firma i client fidati
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;ssl_verify_client&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;                       &lt;span class=&#34;c1&#34;&gt;# richiedi e verifica il cert del client
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# passa l&amp;#39;identità del client all&amp;#39;applicazione
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Client-CN&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ssl_client_s_dn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Le due righe evidenziate trasformano un normale server TLS in un endpoint mTLS: &lt;code&gt;ssl_verify_client on&lt;/code&gt; rifiuta chi non presenta un certificato valido firmato dalla CA indicata.&lt;/p&gt;
&lt;h2 id=&#34;il-vero-costo-gestire-i-certificati&#34;&gt;Il vero costo: gestire i certificati
&lt;/h2&gt;&lt;p&gt;mTLS è potente ma sposta il problema sulla &lt;strong&gt;gestione dei certificati&lt;/strong&gt;. Con decine di servizi e
certificati a vita breve, l&amp;rsquo;emissione e la rotazione manuale non sono praticabili. Per questo mTLS
&amp;ldquo;su larga scala&amp;rdquo; vive quasi sempre dentro un &lt;strong&gt;service mesh&lt;/strong&gt; (Istio, Linkerd) o un sistema come
SPIRE, che emettono e ruotano i certificati automaticamente, trasparenti all&amp;rsquo;applicazione. Senza
automazione, mTLS tra molti servizi diventa ingestibile — ed è l&amp;rsquo;errore più comune di chi lo adotta.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Con una CA di test e due servizi (o &lt;code&gt;openssl s_server&lt;/code&gt;/&lt;code&gt;s_client&lt;/code&gt;):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create una CA, un certificato server e un certificato client, tutti firmati dalla CA.&lt;/li&gt;
&lt;li&gt;Avviate il server con &lt;code&gt;ssl_verify_client on&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Connettetevi &lt;strong&gt;senza&lt;/strong&gt; certificato client: deve fallire.&lt;/li&gt;
&lt;li&gt;Connettetevi &lt;strong&gt;con&lt;/strong&gt; il certificato client: deve riuscire, e il server deve vedere il CN.&lt;/li&gt;
&lt;li&gt;Provate un certificato firmato da un&amp;rsquo;altra CA: deve essere rifiutato.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se il traffico tra microservizi è già dentro un cluster privato, perché cifrarlo e autenticarlo con mTLS?&lt;/summary&gt;
&lt;p&gt;Perché &#34;dentro il cluster&#34; non significa &#34;fidato&#34;. È proprio l&#39;assunzione che il
&lt;a href=&#34;https://www.matteobianchi.eu/p/zero-trust-architecture/&#34;&gt;modello Zero Trust&lt;/a&gt; smonta: se un attaccante compromette un
singolo pod o si inserisce nella rete interna (pensate all&#39;ARP spoofing del
&lt;a href=&#34;https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/&#34;&gt;capitolo 02&lt;/a&gt;), senza mTLS può leggere il traffico tra
servizi e impersonarne uno, perché nulla verifica le identità. mTLS rende quel traffico illeggibile e
ogni chiamata autenticata: anche chi entra nella rete non può né ascoltare né fingersi un altro
servizio. La rete piatta e fidata è esattamente ciò che non vogliamo più dare per scontato.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;mTLS estende TLS dall&amp;rsquo;autenticazione del solo server a quella reciproca: entrambe le parti provano
chi sono con un certificato. È il modo in cui i servizi si fidano l&amp;rsquo;uno dell&amp;rsquo;altro senza affidarsi
alla rete, e il mattone dell&amp;rsquo;architettura Zero Trust. Il prezzo è la gestione dei certificati, che
su scala richiede automazione — un service mesh o SPIRE — altrimenti il rimedio diventa più
oneroso del problema.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>IPsec contro WireGuard</title>
        <link>https://www.matteobianchi.eu/p/ipsec-vs-wireguard/</link>
        <pubDate>Tue, 22 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/ipsec-vs-wireguard/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/ipsec-vs-wireguard/cover.png" alt="Featured image of post IPsec contro WireGuard" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Nel &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;capitolo su TLS&lt;/a&gt; abbiamo cifrato una singola connessione.
Una VPN fa un passo più in là: cifra &lt;strong&gt;tutto&lt;/strong&gt; il traffico IP tra due punti, creando un tunnel
attraverso una rete non fidata. Serve a collegare due sedi (site-to-site) o a far entrare un
lavoratore da remoto nella LAN — la minaccia T6 del
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/threat-modeling-networks/&#34; &gt;threat model&lt;/a&gt;, dove serviva anche tracciare chi si
collega.&lt;/p&gt;
&lt;p&gt;Le due tecnologie dominanti sono agli antipodi per filosofia: IPsec è una suite completa e
configurabile all&amp;rsquo;eccesso; WireGuard è una cinquantina di righe di concetti. Abbiamo già visto
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/wireguard-site-to-site-vpn/&#34; &gt;WireGuard in pratica&lt;/a&gt;; qui lo confrontiamo con IPsec per
capire quando scegliere cosa.&lt;/p&gt;
&lt;h2 id=&#34;ipsec-una-suite-non-un-protocollo&#34;&gt;IPsec: una suite, non un protocollo
&lt;/h2&gt;&lt;p&gt;IPsec non è un protocollo ma un insieme. Ha due modalità e due protocolli di protezione, e una
negoziazione separata delle chiavi:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    IPsec --&amp;gt; IKE[&amp;#34;IKEv2&amp;lt;br/&amp;gt;negozia le chiavi e la SA&amp;#34;]
    IPsec --&amp;gt; ESP[&amp;#34;ESP&amp;lt;br/&amp;gt;cifra e autentica i pacchetti&amp;#34;]
    IPsec --&amp;gt; Modes[&amp;#34;Modalità&amp;#34;]
    Modes --&amp;gt; Tunnel[&amp;#34;Tunnel&amp;lt;br/&amp;gt;incapsula l&amp;#39;intero pacchetto IP&amp;lt;br/&amp;gt;(site-to-site)&amp;#34;]
    Modes --&amp;gt; Transport[&amp;#34;Transport&amp;lt;br/&amp;gt;protegge solo il payload&amp;lt;br/&amp;gt;(host-to-host)&amp;#34;]
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IKEv2&lt;/strong&gt; stabilisce la Security Association (SA): le due parti si autenticano (con chiavi
precondivise o certificati) e concordano chiavi e algoritmi, con forward secrecy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESP&lt;/strong&gt; è ciò che protegge davvero i pacchetti: li cifra e li autentica.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;modalità tunnel&lt;/strong&gt; l&amp;rsquo;intero pacchetto IP originale viene incapsulato in uno nuovo: è quella
usata per collegare due reti.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La forza di IPsec è la sua universalità: lo parlano router, firewall e sistemi operativi di ogni
marca, ed è lo standard nelle interconnessioni aziendali. La debolezza è la complessità: decine di
parametri da far combaciare tra i due lati, e un fallimento di negoziazione difficile da
diagnosticare.&lt;/p&gt;
&lt;h2 id=&#34;wireguard-fare-meno-meglio&#34;&gt;WireGuard: fare meno, meglio
&lt;/h2&gt;&lt;p&gt;WireGuard parte da un&amp;rsquo;idea opposta: niente negoziazione di algoritmi, niente opzioni. Usa un set
fisso di primitive crittografiche moderne (Curve25519, ChaCha20-Poly1305, BLAKE2s). Se un domani
una di queste si indebolisce, si cambia versione del protocollo, non si negozia.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;autenticazione è semplicissima: ogni peer ha una coppia di chiavi, come SSH. Si conoscono per
&lt;strong&gt;chiave pubblica&lt;/strong&gt;. La configurazione di un lato sta in poche righe:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[Interface]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;PrivateKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;lt;chiave privata locale&amp;gt;          # la mia identità&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;Address&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;10.9.0.1/24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;ListenPort&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;51820&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[Peer]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;PublicKey&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;lt;chiave pubblica del peer&amp;gt;        # di chi mi fido&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;AllowedIPs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;10.9.0.2/32                        # quali IP accetto/instrado da questo peer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;Endpoint&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;peer.esempio.it:51820&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Le due righe evidenziate sono il cuore del modello: &lt;strong&gt;la mia chiave privata&lt;/strong&gt; definisce chi sono,
&lt;strong&gt;la chiave pubblica del peer&lt;/strong&gt; definisce di chi mi fido. &lt;code&gt;AllowedIPs&lt;/code&gt; fa doppio lavoro: è insieme
una regola di routing (quali IP mando nel tunnel) e di sicurezza (quali IP accetto da quel peer,
una forma di cryptokey routing).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wg-quick up wg0          &lt;span class=&#34;c1&#34;&gt;# attiva il tunnel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wg show                  &lt;span class=&#34;c1&#34;&gt;# stato: handshake, byte trasferiti, ultimo contatto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Un dettaglio che conta per la sicurezza: WireGuard è &lt;strong&gt;silenzioso&lt;/strong&gt;. Non risponde a chi non
presenta una chiave valida, quindi dall&amp;rsquo;esterno la porta sembra chiusa. Un attaccante che fa uno
scan non trova nulla a cui agganciarsi.&lt;/p&gt;
&lt;h2 id=&#34;il-confronto&#34;&gt;Il confronto
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;IPsec&lt;/th&gt;
&lt;th&gt;WireGuard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Natura&lt;/td&gt;
&lt;td&gt;suite configurabile&lt;/td&gt;
&lt;td&gt;protocollo minimale, opzioni fisse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Righe di codice (kernel)&lt;/td&gt;
&lt;td&gt;~decine di migliaia&lt;/td&gt;
&lt;td&gt;~4.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negoziazione&lt;/td&gt;
&lt;td&gt;IKEv2, molti parametri&lt;/td&gt;
&lt;td&gt;nessuna: primitive fisse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autenticazione&lt;/td&gt;
&lt;td&gt;PSK o certificati (PKI)&lt;/td&gt;
&lt;td&gt;coppie di chiavi, stile SSH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interoperabilità&lt;/td&gt;
&lt;td&gt;universale (standard aziendale)&lt;/td&gt;
&lt;td&gt;ottima tra sistemi WireGuard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prestazioni&lt;/td&gt;
&lt;td&gt;buone&lt;/td&gt;
&lt;td&gt;generalmente migliori, meno overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attraversamento NAT&lt;/td&gt;
&lt;td&gt;può richiedere NAT-T&lt;/td&gt;
&lt;td&gt;nativo, con keepalive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagnosi dei guasti&lt;/td&gt;
&lt;td&gt;spesso complessa&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wg show&lt;/code&gt; dice quasi tutto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;quando-scegliere-cosa&#34;&gt;Quando scegliere cosa
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WireGuard&lt;/strong&gt; per road warrior, collegamenti tra server, lab, qualunque caso in cui si
controllano entrambi i lati. Più semplice significa meno errori di configurazione, e la
superficie di codice ridotta è essa stessa un vantaggio di sicurezza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPsec&lt;/strong&gt; quando serve interoperare con apparati che parlano solo IPsec (molti firewall e router
aziendali), o dove policy e audit impongono certificati e algoritmi negoziabili.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La semplicità di WireGuard non è una scorciatoia di sicurezza: è una scelta di design. Meno codice e
meno opzioni significano meno superficie per i bug e meno modi di configurare male. Ma IPsec resta
insostituibile dove l&amp;rsquo;altro capo non è vostro.&lt;/p&gt;
&lt;h2 id=&#34;tracciare-chi-si-collega-la-minaccia-t6&#34;&gt;Tracciare chi si collega (la minaccia T6)
&lt;/h2&gt;&lt;p&gt;Il threat model chiedeva di registrare gli accessi VPN. Con WireGuard, &lt;code&gt;wg show&lt;/code&gt; espone per ogni
peer l&amp;rsquo;ultimo handshake e i byte trasferiti; esportando questi dati (o i log del kernel) a un
sistema centrale si ottiene la tracciabilità richiesta. Con IPsec, IKEv2 registra le SA negoziate.
In entrambi i casi il punto è &lt;strong&gt;inoltrare&lt;/strong&gt; quei dati a un log centralizzato, non lasciarli solo
sul gateway.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Nel lab containerlab, due nodi che simulano due sedi separate da una rete &amp;ldquo;non fidata&amp;rdquo;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate le coppie di chiavi WireGuard (&lt;code&gt;wg genkey | tee priv | wg pubkey&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Configurate i due lati e attivate il tunnel con &lt;code&gt;wg-quick&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Da un lato, &lt;code&gt;ping&lt;/code&gt; l&amp;rsquo;IP interno dell&amp;rsquo;altro e catturate il traffico sulla rete intermedia:
deve essere illeggibile (UDP cifrato).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wg show&lt;/code&gt;: osservate l&amp;rsquo;handshake e i contatori.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché WireGuard usa UDP e non TCP?&lt;/summary&gt;
&lt;p&gt;Perché incapsulare traffico TCP dentro un tunnel TCP crea il problema del &#34;TCP meltdown&#34;: due
controlli di congestione e due ritrasmissioni annidati che si combattono, con prestazioni che
crollano quando la rete perde pacchetti. UDP non ha controllo di congestione né ritrasmissione, così
il TCP interno gestisce da solo il suo recupero errori end-to-end, come se il tunnel non ci fosse.
È lo stesso motivo per cui anche IPsec/ESP e la maggior parte delle VPN serie preferiscono UDP.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;IPsec e WireGuard risolvono lo stesso problema con filosofie opposte: configurabilità universale
contro minimalismo. Non c&amp;rsquo;è un vincitore assoluto: WireGuard dove controllate entrambi i capi,
IPsec dove dovete parlare con il mondo. In entrambi i casi, un tunnel è sicuro solo quanto la
gestione delle sue chiavi e il tracciamento di chi lo usa.&lt;/p&gt;
&lt;p&gt;Abbiamo costruito difese per nove capitoli. Nel prossimo mettiamo tutto alla prova dalla parte di
chi indaga: analizzare una cattura di pacchetti e ritrovare, dentro il traffico, gli attacchi che
abbiamo studiato.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/packet-analysis-wireshark/&#34; &gt;10 · Analisi dei pacchetti con Wireshark&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Sicurezza del DNS: DNSSEC e DoH</title>
        <link>https://www.matteobianchi.eu/p/dns-security-dnssec-doh/</link>
        <pubDate>Tue, 08 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/dns-security-dnssec-doh/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/dns-security-dnssec-doh/cover.png" alt="Featured image of post Sicurezza del DNS: DNSSEC e DoH" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Nel &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;capitolo su TLS&lt;/a&gt; abbiamo visto come proteggere una
connessione. Ma prima di aprirla, il client chiede al DNS: &amp;ldquo;qual è l&amp;rsquo;IP di &lt;code&gt;banca.it&lt;/code&gt;?&amp;rdquo;. Se un
attaccante risponde al posto del DNS legittimo — minaccia T7 del
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/threat-modeling-networks/&#34; &gt;threat model&lt;/a&gt; — manda il client su un IP che
controlla lui. TLS su quel sito mostrerebbe un errore di certificato, certo, ma il DNS è il primo
anello, e troppi attacchi partono da lì.&lt;/p&gt;
&lt;p&gt;Il DNS classico ha due difetti indipendenti: non autentica le risposte (chiunque può falsificarle)
e non le cifra (chiunque sulla rete le legge). Vanno risolti separatamente.&lt;/p&gt;
&lt;h2 id=&#34;il-problema-1-autenticità--cache-poisoning&#34;&gt;Il problema 1: autenticità — cache poisoning
&lt;/h2&gt;&lt;p&gt;Una query DNS esce con un ID di transazione a 16 bit e attende la risposta. Chi risponde per primo
con l&amp;rsquo;ID giusto vince — anche un attaccante, se indovina l&amp;rsquo;ID prima del server vero. La risposta
falsa viene &lt;strong&gt;messa in cache&lt;/strong&gt; dal resolver, e da quel momento tutti quelli che usano quel resolver
vengono mandati sull&amp;rsquo;IP sbagliato. È il &lt;strong&gt;cache poisoning&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  sequenceDiagram
    participant C as Client
    participant R as Resolver
    participant A as Attaccante
    participant S as Server DNS vero
    C-&amp;gt;&amp;gt;R: banca.it ?
    R-&amp;gt;&amp;gt;S: banca.it ? (txid 0x3f9a)
    A--&amp;gt;&amp;gt;R: banca.it = 6.6.6.6 (txid indovinato, arriva prima)
    Note over R: mette in cache la risposta falsa
    S-&amp;gt;&amp;gt;R: banca.it = 1.2.3.4 (arriva dopo, scartata)
    R-&amp;gt;&amp;gt;C: banca.it = 6.6.6.6
&lt;/pre&gt;

&lt;h3 id=&#34;la-soluzione-dnssec&#34;&gt;La soluzione: DNSSEC
&lt;/h3&gt;&lt;p&gt;DNSSEC firma le risposte DNS con la crittografia a chiave pubblica. Ogni zona firma i propri record;
la zona superiore firma la chiave di quella inferiore, formando una &lt;strong&gt;catena di fiducia&lt;/strong&gt; che parte
dalla radice &lt;code&gt;.&lt;/code&gt;, esattamente come la PKI di TLS parte dalle CA radice.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    Root[&amp;#34;. (root)&amp;#34;] --&amp;gt;|firma la chiave di| IT[&amp;#34;.it&amp;#34;]
    IT --&amp;gt;|firma la chiave di| Dom[&amp;#34;banca.it&amp;#34;]
    Dom --&amp;gt;|firma i record| A[&amp;#34;A = 1.2.3.4 (RRSIG)&amp;#34;]
&lt;/pre&gt;

&lt;p&gt;Il resolver verifica le firme risalendo la catena. Una risposta falsificata non ha una firma
valida e viene &lt;strong&gt;scartata&lt;/strong&gt;: il cache poisoning fallisce perché l&amp;rsquo;attaccante non possiede la chiave
privata della zona.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# chiedere i record DNSSEC e verificare la firma&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dig banca.it +dnssec
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# il flag &amp;#34;ad&amp;#34; (Authenticated Data) nella risposta indica validazione riuscita&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dig @1.1.1.1 banca.it &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -o &lt;span class=&#34;s1&#34;&gt;&amp;#39;flags:.*;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Attenzione: DNSSEC &lt;strong&gt;autentica&lt;/strong&gt; ma &lt;strong&gt;non cifra&lt;/strong&gt;. Chiunque sulla rete vede ancora quali domini
chiedete. Risolve il problema 1, non il problema 2.&lt;/p&gt;
&lt;h2 id=&#34;il-problema-2-riservatezza--tutti-leggono-le-query&#34;&gt;Il problema 2: riservatezza — tutti leggono le query
&lt;/h2&gt;&lt;p&gt;Una query DNS classica viaggia in UDP, in chiaro, sulla porta 53. Chiunque sia sul percorso — il
proprietario della rete Wi-Fi, il provider, un uomo nel mezzo — legge l&amp;rsquo;elenco dei siti che
visitate, anche se poi vi collegate in HTTPS. E può ancora intercettarla e rispondere.&lt;/p&gt;
&lt;h3 id=&#34;la-soluzione-dot-e-doh&#34;&gt;La soluzione: DoT e DoH
&lt;/h3&gt;&lt;p&gt;Due standard cifrano il trasporto del DNS dentro TLS:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DoT (DNS over TLS)&lt;/th&gt;
&lt;th&gt;DoH (DNS over HTTPS)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Porta&lt;/td&gt;
&lt;td&gt;853 (dedicata)&lt;/td&gt;
&lt;td&gt;443 (come il traffico web)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibilità&lt;/td&gt;
&lt;td&gt;si distingue dal resto del traffico&lt;/td&gt;
&lt;td&gt;indistinguibile dal normale HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocco&lt;/td&gt;
&lt;td&gt;facile da bloccare (porta nota)&lt;/td&gt;
&lt;td&gt;difficile: bloccarlo blocca il web&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso tipico&lt;/td&gt;
&lt;td&gt;resolver di rete, policy aziendali&lt;/td&gt;
&lt;td&gt;browser, aggiramento della censura&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# DoT verso un resolver pubblico&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kdig -d @1.1.1.1 +tls banca.it
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# DoH: una query DNS dentro una normale richiesta HTTPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -s -H &lt;span class=&#34;s1&#34;&gt;&amp;#39;accept: application/dns-json&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://1.1.1.1/dns-query?name=banca.it&amp;amp;type=A&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;le-due-soluzioni-sono-complementari&#34;&gt;Le due soluzioni sono complementari
&lt;/h2&gt;&lt;p&gt;È l&amp;rsquo;errore più comune: pensare che DoH &amp;ldquo;renda sicuro&amp;rdquo; il DNS. DoH cifra la query verso il resolver,
ma se quel resolver non valida DNSSEC, può comunque ricevere e inoltrarvi una risposta falsa. E
DNSSEC autentica, ma lascia la query visibile. La configurazione robusta usa &lt;strong&gt;entrambi&lt;/strong&gt;: un
resolver che valida DNSSEC, raggiunto via DoT/DoH.&lt;/p&gt;
&lt;p&gt;Nel lab si costruisce con &lt;code&gt;unbound&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    auto-trust-anchor-file: &amp;#34;/var/lib/unbound/root.key&amp;#34;   # abilita la validazione DNSSEC
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    # ... ascolto su localhost ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;forward-zone:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    name: &amp;#34;.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    forward-tls-upstream: yes                              # inoltra agli upstream via DoT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    forward-addr: 1.1.1.1@853
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La prima riga evidenziata attiva la validazione DNSSEC (problema 1); la seconda cifra l&amp;rsquo;inoltro
verso l&amp;rsquo;upstream con DoT (problema 2).&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Nel lab containerlab, con un nodo resolver (&lt;code&gt;unbound&lt;/code&gt;) e un nodo client:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configurate &lt;code&gt;unbound&lt;/code&gt; con validazione DNSSEC e upstream in DoT.&lt;/li&gt;
&lt;li&gt;Da client, &lt;code&gt;dig&lt;/code&gt; un dominio firmato DNSSEC e verificate il flag &lt;code&gt;ad&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dig&lt;/code&gt; un dominio con firma deliberatamente rotta (ne esistono di test, es.
&lt;code&gt;dnssec-failed.org&lt;/code&gt;): il resolver deve rispondere &lt;code&gt;SERVFAIL&lt;/code&gt;, non l&amp;rsquo;IP.&lt;/li&gt;
&lt;li&gt;Catturate il traffico tra resolver e upstream: con DoT deve essere illeggibile (TLS sulla 853).&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché un dominio con DNSSEC rotto dà SERVFAIL e non l&#39;IP?&lt;/summary&gt;
&lt;p&gt;Perché la validazione è una scelta binaria: o la firma è valida, o la risposta non è fidata. Un
resolver che valida DNSSEC, di fronte a una firma che non torna (scaduta, mancante, manomessa),
non ha modo di sapere se è un errore di configurazione o un attacco in corso, quindi tratta la
risposta come non attendibile e restituisce &lt;code&gt;SERVFAIL&lt;/code&gt;. È un &#34;fallire in sicurezza&#34;:
meglio nessuna risposta che una risposta potenzialmente falsa. Lo svantaggio è che un errore di
firma del gestore del dominio rende il sito irraggiungibile per chi valida — ed è successo a domini
importanti.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il DNS ha due problemi distinti: autenticità e riservatezza. DNSSEC firma (problema 1), DoT/DoH
cifrano (problema 2). Confonderli porta a configurazioni che sembrano sicure e non lo sono. La
difesa completa li combina: resolver che valida DNSSEC, raggiunto con trasporto cifrato.&lt;/p&gt;
&lt;p&gt;Fin qui abbiamo difeso riservatezza, integrità e autenticità. Resta la terza gamba della
sicurezza: la &lt;strong&gt;disponibilità&lt;/strong&gt;. Nel prossimo capitolo l&amp;rsquo;attacco che la prende di mira: il DDoS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/ddos-anatomy-and-mitigation/&#34; &gt;08 · Anatomia di un DDoS&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>TLS 1.3 in profondità</title>
        <link>https://www.matteobianchi.eu/p/tls-deep-dive/</link>
        <pubDate>Tue, 01 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/tls-deep-dive/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/tls-deep-dive/cover.png" alt="Featured image of post TLS 1.3 in profondità" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Tutti gli attacchi dei capitoli precedenti — ARP spoofing, DHCP rogue, uomo nel mezzo — hanno lo
stesso punto debole come bersaglio: il traffico in chiaro. TLS è la risposta. Risolve un problema
che sembra impossibile: due macchine che non si sono mai parlate devono accordarsi su una chiave
segreta, mentre un attaccante registra ogni byte che si scambiano. E devono anche essere sicure di
parlare con chi credono, non con l&amp;rsquo;uomo nel mezzo.&lt;/p&gt;
&lt;p&gt;TLS 1.3 (RFC 8446, 2018) ha ripulito vent&amp;rsquo;anni di debolezze. Vediamo come funziona.&lt;/p&gt;
&lt;h2 id=&#34;il-problema-dello-scambio-di-chiavi&#34;&gt;Il problema dello scambio di chiavi
&lt;/h2&gt;&lt;p&gt;La cifratura simmetrica è veloce ma richiede una chiave condivisa. Come la si concorda su un canale
che l&amp;rsquo;attaccante ascolta? La risposta è lo scambio &lt;strong&gt;Diffie-Hellman&lt;/strong&gt;, in TLS 1.3 nella variante
su curve ellittiche (&lt;strong&gt;ECDHE&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idea, semplificata: client e server scelgono ciascuno un segreto privato ($a$ e $b$) e si
scambiano un valore pubblico derivato. Grazie alla proprietà matematica dello scambio, entrambi
calcolano lo stesso segreto condiviso $S$ senza mai trasmetterlo:&lt;/p&gt;
&lt;p&gt;$$
S = g^{ab} \bmod p
$$&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;attaccante vede passare $g^a$ e $g^b$, ma per ricavare $S$ dovrebbe risolvere il problema del
logaritmo discreto, computazionalmente proibitivo con i parametri usati. La chiave non viaggia mai
sul filo: viene &lt;strong&gt;calcolata&lt;/strong&gt; alle due estremità.&lt;/p&gt;
&lt;h2 id=&#34;lhandshake-tls-13&#34;&gt;L&amp;rsquo;handshake TLS 1.3
&lt;/h2&gt;&lt;p&gt;La novità più visibile di TLS 1.3 è la velocità: l&amp;rsquo;handshake si completa in &lt;strong&gt;un solo giro&lt;/strong&gt;
(1-RTT), contro i due di TLS 1.2. Il client azzarda i parametri già nel primo messaggio.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  sequenceDiagram
    participant C as Client
    participant S as Server
    C-&amp;gt;&amp;gt;S: ClientHello (versioni, cifrari, key_share g^a)
    Note over S: sceglie i parametri, calcola S = (g^a)^b
    S-&amp;gt;&amp;gt;C: ServerHello (key_share g^b)
    S-&amp;gt;&amp;gt;C: {Certificate, CertificateVerify, Finished} (già cifrati)
    Note over C: calcola S = (g^b)^a, verifica il certificato
    C-&amp;gt;&amp;gt;S: {Finished} (cifrato)
    Note over C,S: canale cifrato stabilito in 1-RTT
&lt;/pre&gt;

&lt;p&gt;Dal &lt;code&gt;ServerHello&lt;/code&gt; in poi &lt;strong&gt;tutto è già cifrato&lt;/strong&gt;, inclusi il certificato del server. In TLS 1.2 il
certificato viaggiava in chiaro.&lt;/p&gt;
&lt;h2 id=&#34;autenticazione-la-catena-di-certificati&#34;&gt;Autenticazione: la catena di certificati
&lt;/h2&gt;&lt;p&gt;Lo scambio ECDHE protegge dall&amp;rsquo;ascolto, ma non dall&amp;rsquo;uomo nel mezzo: un attaccante potrebbe fare un
proprio scambio con il client fingendosi il server. Serve &lt;strong&gt;autenticazione&lt;/strong&gt;, e la dà la PKI.&lt;/p&gt;
&lt;p&gt;Il server presenta un &lt;strong&gt;certificato&lt;/strong&gt; che lega il suo nome di dominio a una chiave pubblica,
firmato da una &lt;strong&gt;Certificate Authority (CA)&lt;/strong&gt;. Il client verifica la firma risalendo la catena
fino a una CA radice di cui si fida già (sono preinstallate nel sistema).&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    Root[&amp;#34;CA radice&amp;lt;br/&amp;gt;(preinstallata, fidata)&amp;#34;] --&amp;gt;|firma| Inter[&amp;#34;CA intermedia&amp;#34;]
    Inter --&amp;gt;|firma| Leaf[&amp;#34;Certificato del server&amp;lt;br/&amp;gt;esempio.it&amp;#34;]
    Leaf -.verificato dal.-&amp;gt; Client
&lt;/pre&gt;

&lt;p&gt;In &lt;code&gt;CertificateVerify&lt;/code&gt; il server firma l&amp;rsquo;handshake con la chiave privata corrispondente al
certificato: prova di possedere la chiave, non solo di esibire il certificato. Un uomo nel mezzo
non ha quella chiave privata, quindi non può produrre quella firma.&lt;/p&gt;
&lt;h2 id=&#34;due-proprietà-che-contano&#34;&gt;Due proprietà che contano
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Forward secrecy.&lt;/strong&gt; In TLS 1.3 ogni connessione usa una coppia ECDHE &lt;strong&gt;effimera&lt;/strong&gt;, nuova ogni
volta e cancellata dopo. Se un attaccante registra oggi il traffico cifrato e tra un anno ruba la
chiave privata del server, &lt;strong&gt;non&lt;/strong&gt; può decifrare quel traffico: la chiave di sessione non derivava
da quella del server, ed è sparita. TLS 1.2 lo permetteva solo con i cifrari giusti; 1.3 lo rende
obbligatorio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Niente cifrari deboli.&lt;/strong&gt; TLS 1.3 ha rimosso dalla negoziazione RC4, 3DES, MD5, lo scambio RSA
statico e la rinegoziazione. Molti attacchi storici (BEAST, POODLE, downgrade) sfruttavano proprio
quelle opzioni: toglierle dal protocollo le chiude per costruzione.&lt;/p&gt;
&lt;h2 id=&#34;vederlo-nel-lab&#34;&gt;Vederlo nel lab
&lt;/h2&gt;&lt;p&gt;Con &lt;code&gt;openssl&lt;/code&gt; si ispeziona un handshake reale:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# handshake completo verso un server, con dettagli&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl s_client -connect esempio.it:443 -tls1_3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# guardare il certificato e la sua catena&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl s_client -connect esempio.it:443 -showcerts &amp;lt;/dev/null 2&amp;gt;/dev/null &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; openssl x509 -noout -subject -issuer -dates
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Nel lab containerlab si può generare una CA di test, emettere un certificato per un server interno
e osservare la verifica della catena, senza toccare internet.&lt;/p&gt;
&lt;h2 id=&#34;la-configurazione-lato-server&#34;&gt;La configurazione lato server
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# solo TLS 1.2 e 1.3; niente versioni vecchie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ssl_protocols&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;TLSv1.2&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;TLSv1.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;         &lt;span class=&#34;c1&#34;&gt;# in 1.3 la lista cifrari è già sicura
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ssl_session_tickets&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;               &lt;span class=&#34;c1&#34;&gt;# i ticket possono indebolire la forward secrecy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Le due righe evidenziate sono il minimo: disattivare le versioni obsolete e lasciare a TLS 1.3 la
scelta dei cifrari, che sono già tutti robusti.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Nel lab, create una CA di test (&lt;code&gt;openssl req -x509 ...&lt;/code&gt;) ed emettete un certificato per un
server interno.&lt;/li&gt;
&lt;li&gt;Avviate un server TLS 1.3 (&lt;code&gt;openssl s_server&lt;/code&gt;) e collegatevi con &lt;code&gt;openssl s_client&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Osservate con quale &lt;code&gt;key_share&lt;/code&gt; e cifrario si conclude l&amp;rsquo;handshake.&lt;/li&gt;
&lt;li&gt;Provate a forzare &lt;code&gt;-tls1_1&lt;/code&gt;: il server deve rifiutare.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se tutto è cifrato, l&#39;IDS del capitolo 05 serve ancora a qualcosa?&lt;/summary&gt;
&lt;p&gt;Sì, ma vede meno. Con TLS, un IDS passivo non legge il contenuto HTTP: vede solo i metadati —
indirizzi IP, dimensioni e tempi dei pacchetti, e il nome del server nell&#39;estensione SNI (in chiaro
anche in TLS 1.3, salvo ECH). Può ancora rilevare schemi (scan, beaconing di malware, destinazioni
note come malevole), ma non il payload. Per ispezionare il contenuto cifrato servirebbe la
decifratura TLS (un proxy che termina e ri-origina la connessione), che però rompe la forward
secrecy end-to-end e introduce un punto in cui il traffico è di nuovo in chiaro. È un compromesso
di sicurezza serio, non una funzione da attivare a cuor leggero.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;TLS 1.3 risolve due problemi distinti con due meccanismi distinti: ECDHE per la segretezza
(nessuno ascolta), la PKI per l&amp;rsquo;autenticazione (parli con chi credi). La forward secrecy
obbligatoria e l&amp;rsquo;eliminazione dei cifrari deboli chiudono per costruzione gli attacchi che
affliggevano le versioni precedenti.&lt;/p&gt;
&lt;p&gt;TLS protegge il &lt;em&gt;trasporto&lt;/em&gt;. Ma prima ancora di aprire una connessione, il client deve sapere
quale IP ha &lt;code&gt;esempio.it&lt;/code&gt;: lo chiede al DNS. E il DNS, per impostazione predefinita, è in chiaro e
senza autenticazione — il prossimo bersaglio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/dns-security-dnssec-doh/&#34; &gt;07 · Sicurezza del DNS: DNSSEC e DoH&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
