Transports sécurisés pour DNS

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.
  • 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.

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:

  1. Envoyez le nom d'hôte dns.google en tant que SNI pour toute connexion à l'API DNS DoT ou DoH.
  2. 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.
  3. Les adresses IPv6 doivent apparaître entre crochets [2001:db8:1234::5678] entre l'en-tête Host, 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:

  1. 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.

  2. 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.