Trasporti sicuri per il DNS

Le query e le risposte DNS tradizionali vengono inviate tramite UDP o TCP senza crittografia. il che li rende soggetti a sorveglianza, spoofing e filtro di internet basato su DNS. Le risposte ai client da resolver pubblici come Google Public DNS sono particolarmente vulnerabile a questo fenomeno, dato che i messaggi possono passare attraverso molte reti, mentre i messaggi tra resolver ricorsivi e server dei nomi autorevoli spesso incorporano ulteriori protezioni.

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

DoH e DoT migliorano la privacy e la sicurezza tra client e resolver, complementare alla convalida Google Public DNS di DNSSEC per fornire end-to-end DNS autenticato per i domini con firma DNSSEC. Con Google Public DNS, impegnata a fornire una risoluzione DNS veloce, privata e sicura sia per DoH che DoT.

Versioni TLS e suite di crittografia supportate

Google Public DNS supporta TLS 1.2 e TLS 1.3 sia per DoH che per DoT; non prima sono supportate le versioni TLS o SSL. Solo suite di crittografia con sicurezza di inoltro e la crittografia autenticata con dati aggiuntivi (AEAD). Qualys SSL Labs mostra l'insieme corrente di suite di crittografia supportate.

Endpoint

Google Public DNS utilizza i seguenti endpoint per DoH e DoT:

DoT (porta 853) dns.google

DoH (porta 443) Modelli URI

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

    • Per POST, l'URL è solo https://dns.google/dns-query e il corpo della La 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 API JSON. È richiesto solo il parametro name.

Clienti

Esistono diverse 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, ma Queste in genere richiedono una configurazione moderatamente tecnica.

Esempi dalla riga di comando

I seguenti esempi della riga di comando non sono destinati all'uso in un client reale e sono solo illustrazioni che utilizzano gli strumenti diagnostici comunemente disponibili.

DoT

I comandi seguenti richiedono Knot DNS kdig 2.3.0 o versioni successive; con 2.7.4 o in seguito, rimuovi il commento di +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 Base64Url in questo comando è il messaggio DNS inviato da dig +noedns example.test A con il campo ID DNS impostato su zero, come consigliato secondo la sezione 4.1 di RFC 8484. Il comando shell invia la query DNS come contenuti del corpo dei dati binari, utilizzando il Content-Type 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 GET

La stringa codificata 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 gli URL degli indirizzi IP

TLS 1.3 richiede che i client fornire l'identificazione del nome del server (SNI).

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

"Nome Host" contiene il nome host DNS completo del server, come interpretato dal cliente. Il nome host è rappresentato come una stringa di byte utilizzando la codifica ASCII senza punto finale. Ciò consente il supporto di di nomi di dominio internazionalizzati mediante l’uso di etichette A definite RFC5890. I nomi host DNS non fanno distinzione tra maiuscole e minuscole. L'algoritmo da confrontare descritti nella RFC5890, sezione 2.3.2.4.

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

Può essere difficile soddisfare questi requisiti per le applicazioni DoH o DoT che vogliono sfruttare i miglioramenti per la sicurezza di TLS 1.3. Google Public DNS attualmente accetta connessioni TLS 1.3 che non forniscono SNI, ma potrebbe essere necessario modificare per motivi operativi o di sicurezza in futuro.

Le nostre raccomandazioni per applicazioni DoT o DoH relative a SNI sono le seguenti:

  1. Invia il nome host dns.google come SNI per qualsiasi connessione al servizio pubblico di Google servizi DNS DoT o DoH.
  2. Se non è disponibile alcun nome host (ad esempio, in un'applicazione che esegue punto opportunistico), è meglio inviare l'indirizzo IP nell'SNI anziché invece di lasciarlo vuoto.
  3. Gli indirizzi IPv6 devono essere visualizzati in [2001:db8:1234::5678] tra parentesi quadre l'intestazione Host, ma senza parentesi nella SNI.

Troncamento risposta DNS

Anche se Google Public DNS in genere non tronca le risposte a DoT e DoH di Google, esistono due circostanze:

  1. Se Google Public DNS non può 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 (in formato di messaggi DNS binari) superare il limite di 64 KiB per i messaggi DNS TCP, Google Public DNS potrebbe impostare Flag TC (troncamento) se richiesto dagli standard RFC.

Tuttavia, in questi casi, non è necessario che i client ripetano utilizzando una comunicazione TCP semplice o qualsiasi altro mezzo di trasporto, in quanto il risultato sarà lo stesso.