Sichere Übertragungen für DNS

Herkömmliche DNS-Abfragen und -Antworten werden ohne Verschlüsselung über UDP oder TCP gesendet. Dadurch werden sie überwacht, Spoofing und DNS-basierter Internetfilterung unterzogen. Antworten von Clients von öffentlichen Resolvern wie Google Public DNS sind besonders anfällig ist, da Nachrichten viele Netzwerke durchlaufen können, während zwischen rekursiven Resolvern und autoritativen Nameservern zusätzliche Schutzmaßnahmen.

Um diese Probleme zu beheben, haben wir 2016 DNS over HTTPS (jetzt DoH) eingeführt. bietet verschlüsselte DNSSEC-validierende DNS-Auflösung über HTTPS und QUIC. 2019 haben wir Unterstützung für den DoT-Standard (DNS over TLS) hinzugefügt, der von den die Android-Funktion Privates DNS

DoH und DoT verbessern den Datenschutz und die Sicherheit zwischen Kunden und Resolvern, die Google Public DNS-Validierung von DNSSEC ergänzt, um eine End-to-End- authentifiziertes DNS für DNSSEC-signierte Domains. Mit Google Public DNS eine schnelle, private und sichere DNS-Auflösung sowohl für DoH als auch DoT-Clients.

Unterstützte TLS-Versionen und Krypto-Suites

Google Public DNS unterstützt TLS 1.2 und TLS 1.3 sowohl für DoH als auch für DoT. nein früher Versionen von TLS oder SSL unterstützt werden. Nur Cipher Suites mit Forward Security Authentifizierte Verschlüsselung mit zusätzlichen Daten (Authenticated Encryption with Umgebungs-Daten, AEAD) unterstützt. Qualys SSL Labs zeigt die aktuellen unterstützten Cipher Suites an.

Endpunkte

Google Public DNS verwendet die folgenden Endpunkte für DoH und DoT:

DoT (Port 853) dns.google

DoH (Port 443) URI-Vorlagen

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

    • Bei POST-Anfragen ist die URL nur https://dns.google/dns-query und der Textkörper Die HTTP-Anfrage ist die binäre UDP-DNS-Nutzlast mit Inhaltstyp. application/dns-message.
    • Für GET ist dies https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • JSON API – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Weitere GET-Parameter sind in der JSON API. Nur der Parameter name ist erforderlich.

Clients

Es gibt eine Reihe von Clientanwendungen, die DoT oder DoH verwenden.

  • Funktion „Privates Surfen“ unter Android 9 (Pie) – DoT
  • Intra (Android-App) – DoH

Auf der Website dnsprivacy.org sind mehrere andere Clients für DoT und DoH aufgeführt, die jedoch erfordern diese in der Regel eine mäßig technische Konfiguration.

Befehlszeilenbeispiele

Die folgenden Befehlszeilenbeispiele sind nicht für die Verwendung in einem tatsächlichen Client vorgesehen und dienen lediglich dazu, allgemein verfügbare Diagnosetools zu verwenden.

DoT

Für die folgenden Befehle ist Knot DNS kdig 2.3.0 oder höher erforderlich. mit 2.7.4 oder Entfernen Sie die Kommentarzeichen von +tls‑sni später, um SNI gemäß TLS 1.3 zu senden.

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

RFC 8484-POST-Anfrage

Der Base64Url-codierte String in diesem Befehl ist die DNS-Nachricht, die von dig +noedns example.test A, wobei das Feld für die DNS-ID auf null gesetzt ist, wie empfohlen gemäß RFC 8484, Abschnitt 4.1. Der Shell-Befehl sendet diese DNS-Abfrage Binärdatentext unter Verwendung des 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

Der Base64Url-codierte String in diesem Befehl ist die DNS-Nachricht, die von dig +noedns example.com A, wobei das Feld für die DNS-ID auf null gesetzt ist. In diesem Fall explizit in der URL übergeben wird.

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

Dabei wird die JSON API für DoH verwendet.

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 und SNI für IP-Adress-URLs

Für TLS 1.3 müssen Clients Server Name Identification (SNI) bereitstellen.

Die SNI-Erweiterung gibt an, dass die SNI-Informationen eine DNS-Domain und keine IP-Adresse sind:

„Hostname“ enthält den voll qualifizierten DNS-Hostnamen des Servers, wie vom Kunden verstanden. Der Hostname wird als Bytestring dargestellt. mit ASCII-Codierung ohne abschließenden Punkt. So kann die Unterstützung von internationalisierten Domainnamen durch die Verwendung von A-Labels, RFC5890. Bei DNS-Hostnamen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Der zu vergleichende Algorithmus Hostnamen sind in RFC5890, Abschnitt 2.3.2.4 beschrieben.

Literale IPv4- und IPv6-Adressen sind in „HostName“ nicht zulässig.

Für DoH- oder DoT-Anwendungen, die profitieren Sie von den Sicherheitsverbesserungen in TLS 1.3. Google Public DNS derzeit akzeptiert TLS 1.3-Verbindungen ohne SNI, dies müssen jedoch möglicherweise geändert werden. aus betrieblichen oder sicherheitsbedingten Gründen.

Unsere Empfehlungen für DoT- oder DoH-Anwendungen bezüglich SNI lauten wie folgt:

  1. Senden Sie bei allen Verbindungen zu Google Public den Hostnamen „dns.google“ als SNI. DNS DoT- oder DoH-Diensten
  2. Wenn kein Hostname verfügbar ist, z. B. in einer Anwendung, opportunistisches DoT), ist es besser, die IP-Adresse im SNI zu senden, einfach leer lassen.
  3. IPv6-Adressen sollten in [2001:db8:1234::5678] in Klammern angezeigt werden in: den Header Host, aber ohne Klammern im SNI.

Kürzung von DNS-Antworten

Obwohl Google Public DNS Antworten auf DoT und DoH im Allgemeinen nicht kürzt Abfragen gibt es zwei Umstände:

  1. Wenn Google Public DNS keine vollständigen und nicht abgeschnittenen Antworten von autoritativen Nameservern in der Antwort das TC-Flag fest.

  2. Wenn die DNS-Antwort (in binärer DNS-Nachrichtenform) 64 KiB für TCP-DNS-Nachrichten überschreiten, legt Google Public DNS möglicherweise TC (abgeschnitten) markieren, wenn dies gemäß RFC-Standards erforderlich ist.

In diesen Fällen müssen die Clients jedoch keine neuen Versuche über TCP ausführen oder ein anderes Transportmittel ein, da das Ergebnis das gleiche ist.