Sichere Übertragungen für DNS

Traditionelle DNS-Abfragen und -Antworten werden unverschlüsselt über UDP oder TCP gesendet. Sie unterliegen daher Überwachung, Spoofing und DNS-basierte Internetfilterung. Dies ist besonders anfällig für Antworten von Clients mit öffentlichen Resolvern wie Google Public DNS, da Nachrichten möglicherweise über viele Netzwerke geleitet werden, während Nachrichten zwischen rekursiven Resolvern und autoritativen Nameservern häufig zusätzliche Schutzmaßnahmen enthalten.

Zur Behebung dieser Probleme haben wir 2016 DNS über HTTPS eingeführt (jetzt DoH), das eine verschlüsselte DNSSEC-validierende DNS-Auflösung über HTTPS und QUIC anbietet. Im Jahr 2019 haben wir außerdem den DoH-Standard (DoH) unterstützt, der von der Android-Funktion Privates DNS verwendet wird.

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

Unterstützte TLS-Versionen und Crypto-Suiten

Google Public DNS unterstützt TLS 1.2 und TLS 1.3 für DoH und DoT. Es werden keine früheren Versionen von TLS oder SSL unterstützt. Es werden nur Cipher Suites mit Forward Security und Authentifizierte Verschlüsselung mit zusätzlichen Daten (AEAD) unterstützt. Qualys SSL Labs enthält die aktuell unterstützten Cipher Suites.

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}

    • Für POST lautet die URL nur https://dns.google/dns-query und der Text der HTTP-Anfrage ist die binäre UDP-DNS-Nutzlast mit dem 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 werden auf der Seite JSON API beschrieben. Nur der Parameter name ist erforderlich.

Im Namen der Kunden meines Arbeitgebers

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

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

Auf der Website dnsprivacy.org sind mehrere andere Clients für DoT und DoH aufgelistet. Diese erfordern jedoch normalerweise eine moderate technische Konfiguration.

Befehlszeilenbeispiele

Die folgenden Befehlszeilenbeispiele sind nicht zur Verwendung in einem tatsächlichen Client vorgesehen und dienen lediglich der Veranschaulichung mithilfe von allgemein verfügbaren Diagnosetools.

Punkt

Für die folgenden Befehle ist Knot DNS kdig 2.3.0 oder höher erforderlich. Wenn Sie Version 2.7.4 oder höher verwenden, entfernen Sie die Kommentarzeichen aus +tls‑sni, 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

Logo: DoH

RFC 8484-POST

Der Base64Url-codierte String in diesem Befehl ist die DNS-Nachricht, die von dig +noedns example.test A gesendet wird, wobei das DNS-ID-Feld auf null gesetzt ist. Dies wird in RFC 8484, Abschnitt 4.1 empfohlen. Der Shell-Befehl sendet diese DNS-Abfrage mit dem Inhaltstyp application/dns-message als binären Datentext.

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 gesendet wurde, wobei das Feld „DNS-ID“ auf null gesetzt ist. In diesem Fall wird sie explizit in der URL übergeben.

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

Dies verwendet die JSON API für 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 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 SNI-Informationen eine DNS-Domain und keine IP-Adresse ist:

"HostName" enthält den vollständig qualifizierten DNS-Hostnamen des Servers, wie vom Client erkannt. Der Hostname wird als Bytestring mit ASCII-Codierung ohne abschließenden Punkt dargestellt. Dies ermöglicht die Unterstützung internationalisierter Domainnamen mithilfe von A-Labels, die in RFC5890 definiert sind. Bei DNS-Hostnamen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Der Algorithmus zum Vergleichen von Hostnamen wird in RFC5890, Abschnitt 2.3.2.4 beschrieben.

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

Diese Anforderungen können für DoH- oder DoT-Anwendungen, die Sicherheitsvorteile in TLS 1.3 nutzen möchten, schwer zu erfüllen sein. Google Public DNS akzeptiert derzeit TLS 1.3-Verbindungen, die kein SNI bieten. Dies kann jedoch aus geschäftlichen oder Sicherheitsgründen in Zukunft geändert werden.

Unsere Empfehlungen für DoT- oder DoH-Anwendungen in Bezug auf SNI:

  1. Senden Sie den Hostnamen „dns.google“ als SNI für alle Verbindungen zu den DoT- oder DoH-Diensten von Google Public DNS.
  2. Wenn kein Hostname verfügbar ist (z. B. in einer Anwendung, die Opportunity-DoT verwendet), ist es besser, die IP-Adresse im SNI zu senden, statt sie leer zu lassen.
  3. IPv6-Adressen sollten im [2001:db8:1234::5678]Header im Header Host in Klammern gesetzt werden, jedoch ohne Klammern im SNI.

Abschneiden von DNS-Antworten

Obwohl Google Public DNS im Allgemeinen keine Antworten auf DoT- und DoH-Abfragen kürzt, kann es zwei Situationen geben:

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

  2. In Fällen, in denen die DNS-Antwort (im binären DNS-Nachrichtenformat) das Limit von 64 KiB für TCP-DNS-Nachrichten überschreiten würde, kann Google Public DNS das TC-Flag (Abschneiden) festlegen, wenn dies gemäß RFC-Standards erforderlich ist.

In diesen Fällen ist es jedoch nicht erforderlich, dass Clients einen einfachen TCP-Datenverkehr oder einen anderen Transportvorgang wiederholen, da das Ergebnis das gleiche ist.