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.
- Per POST, l'URL è solo
API JSON:
https://dns.google/resolve{?name}{&type,cd,do,…}
- Altri parametri GET sono descritti nella
API JSON.
È richiesto solo il parametro
name
.
- Altri parametri GET sono descritti nella
API JSON.
È richiesto solo il parametro
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:
- Invia il nome host dns.google come SNI per qualsiasi connessione al servizio pubblico di Google servizi DNS DoT o DoH.
- 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.
- Gli indirizzi IPv6 devono essere visualizzati in
[2001:db8:1234::5678]
tra parentesi quadre l'intestazioneHost
, 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:
Se Google Public DNS non può ricevere risposte complete e non troncate da server dei nomi autorevoli, imposta il flag TC nella risposta.
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.