Trasporti sicuri per il DNS

Le query e le risposte DNS tradizionali vengono inviate tramite UDP o TCP senza crittografia e sono quindi soggette a sorveglianza, spoofing e filtri internet basati su DNS. Le risposte ai client da parte di resolver pubblici come Google Public DNS sono particolarmente vulnerabili a questo problema, poiché i messaggi possono passare attraverso molte reti, mentre i messaggi tra resolver ricorsivi e server dei nomi autorevoli incorporano spesso protezioni aggiuntive.

Per risolvere questi problemi, nel 2016 abbiamo lanciato il DNS tramite HTTPS (ora chiamato DoH) offrendo una risoluzione DNS criptata con convalida delle DNSSEC tramite HTTPS e QUIC. Nel 2019 abbiamo aggiunto il supporto per lo standard DNS su TLS (DoT) utilizzato dalla funzionalità DNS privato di Android.

DoH e DoT migliorano la privacy e la sicurezza tra client e resolver, integrando la convalida delle DNSSEC Google Public DNS per fornire un DNS end-to-end autenticato per i domini firmati con DNSSEC. Con Google Public DNS, ci impegniamo a fornire una risoluzione DNS veloce, privata e sicura per i client DoH e DoT.

Versioni e suite di crittografia TLS supportate

Google Public DNS supporta TLS 1.2 e TLS 1.3 sia per DoH che per DoT; non sono supportate versioni precedenti di TLS o SSL. Sono supportate solo le suite di crittografia con sicurezza di forwarding e AEAD (Authenticated Encryption with Additional Data). Qualys SSL Labs mostra l'insieme corrente di suite di crittografia supportate.

Endpoint

Il DNS pubblico di Google utilizza i seguenti endpoint per DoH e DoT:

DoT (porta 853) dns.google

Modelli URI DoH (porta 443)

  • RFC 8484 - https://dns.google/dns-query{?dns}

    • Per POST, l'URL è solo https://dns.google/dns-query e il corpo della richiesta HTTP è il payload DNS UDP binario con tipo di contenuto application/dns-message.
    • Per GET è https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • API JSON – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Altri parametri GET sono descritti nella pagina dell'API JSON. È richiesto solo il parametro name.

Clienti

Esistono numerose applicazioni client che utilizzano DoT o DoH

  • Funzionalità "Navigazione privata" di Android 9 (Pie) - DoT
  • Intra (app Android) - DoH

Sul sito web dnsprivacy.org sono elencati diversi altri client per DoT e DoH, che in genere richiedono una configurazione moderatamente tecnica.

Esempi di righe di comando

I seguenti esempi di riga di comando non sono destinati all'utilizzo in un client reale e sono semplicemente illustrazioni che utilizzano strumenti di diagnostica comunemente disponibili.

DoT

I seguenti comandi richiedono Knot DNS kdig 2.3.0 o versioni successive; con 2.7.4 o versioni successive, rimuovi il commento +tls‑sni per inviare SNI come richiesto da TLS 1.3.

kdig -d +noall +answer @dns.google example.com \
  +tls-ca +tls-hostname=dns.google # +tls-sni=dns.google
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(dns.google), port(853), protocol(TCP)
;; DEBUG: TLS, imported 312 system certificates
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG:  #1, C=US,ST=California,L=Mountain View,O=Google LLC,CN=dns.google
;; DEBUG:      SHA-256 PIN: lQXSLnWzUdueQ4+YCezIcLa8L6RPr8Wgeqtxmw1ti+M=
;; DEBUG:  #2, C=US,O=Google Trust Services,CN=Google Internet Authority G3
;; DEBUG:      SHA-256 PIN: f8NnEFZxQ4ExFOhSN7EiFWtiudZQVD2oY60uauV/n78=
;; DEBUG: TLS, skipping certificate PIN check
;; DEBUG: TLS, The certificate is trusted.

;; ANSWER SECTION:
example.com.            2046    IN      A       93.184.216.34
kdig -d +noall +answer @dns.google example.com \
  +tls-pin=f8NnEFZxQ4ExFOhSN7EiFWtiudZQVD2oY60uauV/n78= \
  # +tls-sni=dns.google
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(dns.google), port(853), protocol(TCP)
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG:  #1, C=US,ST=California,L=Mountain View,O=Google LLC,CN=dns.google
;; DEBUG:      SHA-256 PIN: lQXSLnWzUdueQ4+YCezIcLa8L6RPr8Wgeqtxmw1ti+M=
;; DEBUG:  #2, C=US,O=Google Trust Services,CN=Google Internet Authority G3
;; DEBUG:      SHA-256 PIN: f8NnEFZxQ4ExFOhSN7EiFWtiudZQVD2oY60uauV/n78=, MATCH
;; DEBUG: TLS, skipping certificate verification

;; ANSWER SECTION:
example.com.            5494    IN      A       93.184.216.34

DoH

POST RFC 8484

La stringa codificata in Base64Url in questo comando è il messaggio DNS inviato da dig +noedns example.test A con il campo ID DNS impostato su zero, come consigliato dalla sezione 4.1 di RFC 8484. Il comando shell invia la query DNS come contenuto del corpo dei dati binari, utilizzando il tipo di contenuto application/dns-message.

echo AAABAAABAAAAAAAAB2V4YW1wbGUEdGVzdAAAAQAB | base64 --decode |
 curl -is --data-binary @- -H 'content-type: application/dns-message' \
   https://dns.google/dns-query
HTTP/2 200
strict-transport-security: max-age=31536000; includeSubDomains; preload
access-control-allow-origin: *
date: Wed, 29 May 2019 19:37:16 GMT
expires: Wed, 29 May 2019 19:37:16 GMT
cache-control: private, max-age=19174
content-type: application/dns-message
server: HTTP server (unknown)
content-length: 45
x-xss-protection: 0
x-frame-options: SAMEORIGIN
alt-svc: quic=":443"; ma=2592000; v="46,44,43,39"

RFC 8484 OTTIENI

La stringa codificata in Base64Url in questo comando è il messaggio DNS inviato da dig +noedns example.com A con il campo ID DNS impostato su zero. In questo caso, viene passato esplicitamente nell'URL.

curl -i https://dns.google/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE
HTTP/2 200
strict-transport-security: max-age=31536000; includeSubDomains; preload
access-control-allow-origin: *
date: Wed, 29 May 2019 19:37:16 GMT
expires: Wed, 29 May 2019 19:37:16 GMT
cache-control: private, max-age=19174
content-type: application/dns-message
server: HTTP server (unknown)
content-length: 45
x-xss-protection: 0
x-frame-options: SAMEORIGIN
alt-svc: quic=":443"; ma=2592000; v="46,44,43,39"

JSON GET

Viene utilizzata l'API JSON per DoH.

curl -i 'https://dns.google/resolve?name=example.com&type=a&do=1'
HTTP/2 200
strict-transport-security: max-age=31536000; includeSubDomains; preload
access-control-allow-origin: *
date: Thu, 30 May 2019 02:46:46 GMT
expires: Thu, 30 May 2019 02:46:46 GMT
cache-control: private, max-age=10443
content-type: application/x-javascript; charset=UTF-8
server: HTTP server (unknown)
x-xss-protection: 0
x-frame-options: SAMEORIGIN
alt-svc: quic=":443"; ma=2592000; v="46,44,43,39"
accept-ranges: none
vary: Accept-Encoding

{"Status": 0,"TC": false,"RD": true,"RA": true,"AD": true,"CD": false,"Question":[ {"name": "example.com.","type": 1}],"Answer":[ {"name": "example.com.","type": 1,"TTL": 10443,"data": "93.184.216.34"},{"name": "example.com.","type": 46,"TTL": 10443,"data": "a 8 2 86400 1559899303 1558087103 23689 example.com. IfelQcO5NqQIX7ZNKI245KLfdRCKBaj2gKhZkJawtJbo/do+A0aUvoDM5A7EZKcF/j8SdtyfYWj/8g91B2/m/WOo7KyZxIC918R1/jvBRYQGreDL+yutb1ReGc6eUHX+NKJIYqzfal+PY7tGotS1Srn9WhBspXq8/0rNsEnsSoA="}],"Additional":[]}

TLS 1.3 e SNI per URL di indirizzi IP

TLS 1.3 richiede che i client forniscano l'identificazione SNI (Server Name Identification).

L'estensione SNI specifica che le informazioni SNI sono un dominio DNS (e non un indirizzo IP):

"Nomehost" contiene il nome host DNS completo del server, così come è inteso dal client. Il nome host è rappresentato come una stringa di byte con codifica ASCII senza punto finale. Ciò consente il supporto di nomi di dominio internazionalizzati attraverso l'uso di etichette A definite in RFC5890. I nomi host DNS non fanno distinzione tra maiuscole e minuscole. L'algoritmo per confrontare i nomi host è descritto in RFC5890, Sezione 2.3.2.4.

Gli indirizzi IPv4 e IPv6 letterali non sono consentiti in "HostName".

Questi requisiti possono essere difficili da soddisfare per le applicazioni DoH o DoT che vogliono sfruttare i miglioramenti della sicurezza di TLS 1.3. Al momento Google Public DNS accetta connessioni TLS 1.3 che non forniscono SNI, ma in futuro potrebbe essere necessario modificare questa impostazione per motivi operativi o di sicurezza.

I nostri consigli per le applicazioni DoT o DoH in relazione a SNI sono i seguenti:

  1. Invia il nome host dns.google come SNI per qualsiasi connessione ai servizi Google Public DNS DoT o DoH.
  2. Se non è disponibile alcun nome host (ad esempio, in un'applicazione che esegue un DoT opportunità), è meglio inviare l'indirizzo IP nella casella SNI anziché lasciarlo vuoto.
  3. Gli indirizzi IPv6 devono apparire in forma tra parentesi [2001:db8:1234::5678] nell'intestazione Host, ma senza parentesi nella SNI.

Troncamento risposta DNS

Sebbene Google Public DNS in genere non tronca le risposte alle query DoT e DoH, ci sono due casi in cui lo fa:

  1. Se il DNS pubblico di Google non è in grado di ricevere risposte complete e non troncate da server dei nomi autorevoli, imposta il flag TC nella risposta.

  2. Nei casi in cui la risposta DNS (nel modulo di messaggio DNS binario) supererebbe il limite di 64 KiB per i messaggi DNS TCP, Google Public DNS potrebbe impostare il flag TC (troncamento) se gli standard RFC lo richiedono.

Tuttavia, in questi casi, non è necessario che i client ripetano l'utilizzo del protocollo TCP normale o di qualsiasi altro trasporto, poiché il risultato sarà lo stesso.