Les requêtes et réponses DNS traditionnelles sont envoyées via UDP ou TCP sans chiffrement, qui les exposent à la surveillance, au spoofing et au filtrage Internet DNS. Les réponses aux clients des résolveurs publics tels que le DNS public de Google sont particulièrement vulnérables, car les messages peuvent transiter par de nombreux réseaux, alors que les messages entre les résolveurs récursifs et les serveurs de noms faisant autorité intègrent souvent des protections supplémentaires.
Pour résoudre ces problèmes, nous avons lancé en 2016 le DNS via HTTPS (désormais appelé DoH). proposant une résolution DNS chiffrée de validation DNSSEC via HTTPS et QUIC. En 2019, nous avons ajouté la compatibilité avec la norme DNS-over-TLS (DoT) utilisée par la fonctionnalité DNS privé d'Android.
DoH et DoT améliorent la confidentialité et la sécurité entre les clients et les résolveurs, en complétant la validation du DNS public de Google DNSSEC pour fournir le DNS authentifié pour les domaines signés DNSSEC. Avec le DNS public de Google, nous nous engageons à fournir une résolution DNS rapide, privée et sécurisée pour DoH et Clients DoT.
Versions TLS et suites de chiffrement compatibles
Le DNS public de Google est compatible avec TLS 1.2 et TLS 1.3 pour DoH et DoT. pas plus tôt TLS ou SSL sont compatibles. Uniquement les suites de chiffrement avec sécurité de transfert et le chiffrement authentifié avec des données supplémentaires (AEAD) sont pris en charge. Qualys SSL Labs indique l'ensemble actuel de suites de chiffrement compatibles.
Points de terminaison
Le DNS public de Google utilise les points de terminaison suivants pour DoH et DoT:
DoT (port 853) dns.google
Modèles d'URI DoH (port 443)
RFC 8484 :
https://dns.google/dns-query{?dns}
- Pour les requêtes POST, l'URL est simplement
https://dns.google/dns-query
et le corps de la requête HTTP est la charge utile DNS UDP binaire avec le type de contenu application/dns-message. - Pour GET, il s'agit de
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Pour les requêtes POST, l'URL est simplement
API JSON –
https://dns.google/resolve{?name}{&type,cd,do,…}
- D'autres paramètres GET sont décrits dans le
API JSON.
Seul le paramètre
name
est obligatoire.
- D'autres paramètres GET sont décrits dans le
API JSON.
Seul le paramètre
Clients
De nombreuses applications clientes utilisent DoT ou DoH
- Fonctionnalité de navigation privée d'Android 9 (Pie) – DoT
- Intra (application Android) – DoH
Le site Web dnsprivacy.org répertorie plusieurs autres clients pour DoT et DoH, mais celles-ci nécessitent généralement une configuration assez technique.
Exemples de ligne de commande
Les exemples de ligne de commande suivants ne sont pas destinés à être utilisés dans un client Il ne s'agit que d'illustrations utilisant des outils de diagnostic courants.
DoT
Les commandes suivantes nécessitent Knot DNS kdig
2.3.0 ou une version ultérieure. avec la version 2.7.4 ou
par la suite, annulez la mise en commentaire de +tls‑sni
pour envoyer un message SNI, conformément aux exigences de 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
Requête POST RFC 8484
La chaîne encodée en Base64Url dans
cette commande est le message DNS envoyé par
dig +noedns example.test A
avec le champ de l'ID DNS défini sur zéro, comme recommandé
par la section 4.1 du document RFC 8484. La commande shell envoie cette requête DNS en tant que
contenu du corps de données binaires, à l'aide de 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 chaîne encodée en Base64Url dans
cette commande est le message DNS envoyé par
dig +noedns example.com A
avec le champ de l'ID DNS défini sur zéro. Dans ce cas,
est explicitement transmise dans l'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
L'API JSON est utilisée pour 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 et SNI pour les URL d'adresses IP
TLS 1.3 nécessite que les clients fournir un identifiant SNI (Server Name Identification).
L'extension SNI indique que les informations SNI correspondent à un domaine DNS (et non à une adresse IP):
"Nom de l'hôte" contient le nom d'hôte DNS complet du serveur, tel que compris par le client. Le nom d'hôte est représenté sous forme de chaîne d'octets en utilisant l'encodage ASCII sans point final. Cela permet de prendre en charge des noms de domaine internationalisés à l'aide d'étiquettes A définies dans RFC5890 Les noms d’hôte DNS ne sont pas sensibles à la casse. L'algorithme à comparer sont décrits dans la section 2.3.2.4 du document RFC5890.
Les adresses IPv4 et IPv6 littérales ne sont pas autorisées dans "HostName".
Ces exigences peuvent être difficiles à respecter pour les applications DoH ou DoT qui souhaitent profiter des améliorations de sécurité apportées à TLS 1.3. le DNS public de Google actuellement accepte les connexions TLS 1.3 qui n'offrent pas de SNI, mais nous devrons peut-être modifier pour des raisons opérationnelles ou de sécurité à l’avenir.
Voici nos recommandations pour les demandes DoT ou DoH concernant l'extension SNI:
- Envoyez le nom d'hôte dns.google en tant que SNI pour toute connexion à l'API DNS DoT ou DoH.
- Si aucun nom d'hôte n'est disponible (par exemple, dans une application qui effectue un DoT opportuniste), il est préférable d'envoyer l'adresse IP dans le SNI plutôt que de le laisser vide.
- Les adresses IPv6 doivent apparaître entre crochets
[2001:db8:1234::5678]
entre l'en-têteHost
, mais sans les crochets dans l'extension SNI.
Troncation de la réponse DNS
Bien que le DNS public de Google ne tronque généralement pas les réponses aux domaines DoT et DoH dans les deux cas suivants:
Si le DNS public de Google ne peut pas obtenir de réponses complètes et non tronquées de serveurs DNS faisant autorité, il définit l'indicateur TC dans la réponse.
Dans les cas où la réponse DNS (sous forme de message DNS binaire) serait dépasse la limite de 64 Kio pour les messages DNS TCP, le DNS public de Google peut définir le paramètre Indicateur TC (troncation) si les normes RFC l'exigent.
Cependant, dans ces cas, il n'est pas nécessaire que les clients effectuent de nouvelles tentatives en utilisant le protocole TCP simple. ou tout autre transport, car le résultat sera le même.