Bezpieczne transporte DNS

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Tradycyjne zapytania i odpowiedzi DNS są wysyłane przy użyciu protokołów UDP lub TCP bez szyfrowania, co oznacza, że podlegają one inspekcji, podszywaniu się i filtrowaniu internetu przez DNS. Na te odpowiedzi szczególnie wolno odpowiadać klientom korzystającym z publicznych resolverów Google, takich jak publiczne serwery DNS, ponieważ wiadomości mogą przechodzić przez wiele sieci, a wiadomości między rekurencyjnymi resolverami a wiarygodnymi serwerami nazw często zawierają dodatkowe zabezpieczenia.

Aby rozwiązać te problemy, w 2016 roku wprowadziliśmy tryb DNS przez HTTPS (obecnie DoH) oferujący szyfrowaną przez DNS weryfikację DNS przez HTTPS i QUIC. W 2019 roku dodaliśmy obsługę standardu DNS przez TLS (DoT) wykorzystywanego przez funkcję prywatnego DNS Androida.

DoH i DoT zwiększają prywatność i bezpieczeństwo między klientami a resolverami, uzupełniając publiczną weryfikację DNS Google DNSSEC, aby zapewnić kompleksowe uwierzytelnianie DNS w domenach podpisanych przez DNSSEC. Google Public DNS zobowiązuje się do zapewniania szybkich, prywatnych i bezpiecznych rozwiązań DNS dla klientów DoH i DoT.

Obsługiwane wersje TLS i pakiety kryptograficzne

Publiczny serwer DNS Google obsługuje protokoły TLS 1.2 i TLS 1.3 w przypadku DoH i DoT. Nie są obsługiwane żadne starsze wersje protokołów TLS ani SSL. Obsługiwane są tylko zestawy szyfrów z dodatkowym zabezpieczeniem i uwierzytelnianiem za pomocą dodatkowych danych (AEAD). Qualys SSL Labs pokazuje aktualny zestaw obsługiwanych zestawów szyfrów.

Punkty końcowe

Publiczny serwer DNS Google używa tych punktów końcowych w usługach DoH i DoT:

TT (port 853) dns.google

DoH (port 443) szablony URI

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

    • W przypadku metody POST adres URL to po prostu https://dns.google/dns-query, a treść żądania HTTP to binarny ładunek UDP z typem treści application/dns-message.
    • W przypadku GET to https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • Interfejs API JSON – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Więcej parametrów GET znajdziesz na stronie interfejsu API JSON. Wymagany jest tylko parametr name.

W imieniu klientów

Jest wiele aplikacji klienckich, które używają DoT lub DoH.

  • Android 9 (Pie) „Przeglądanie prywatne” – DoT
  • Intra (aplikacja na Androida) – DoH

Witryna dnsprivacy.org zawiera listę kilku innych klientów firm obsługujących zasoby DoT i DoH, ale zazwyczaj wymagają one umiarkowanej konfiguracji technicznej.

Przykłady wiersza poleceń

Poniższe przykłady wiersza poleceń nie są przeznaczone do użytku w rzeczywistym kliencie i są tylko ilustracjami przy użyciu powszechnie dostępnych narzędzi diagnostycznych.

Kropka

Te polecenia wymagają usługi Knot DNS kdig w wersji 2.3.0 lub nowszej; w przypadku wersji 2.7.4 lub nowszej usuń znacznik komentarza +tls‑sni, aby wysłać SNI zgodnie z protokołem 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

Ciąg znaków zakodowany w Base64Url w tym polece to wiadomość DNS wysłana przez dig +noedns example.test A z polem DNS ID ustawionym na zero, zgodnie z sekcją 4.1 wymogów RFC. Polecenie powłoki wysyła to zapytanie DNS jako treść binarną treści za pomocą typu treści 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 8484GET

Ciąg znaków zakodowany w Base64Url w tym polecem to wiadomość DNS wysłana przez dig +noedns example.com A z polem identyfikatora DNS o wartości zero. W tym przypadku jest on wyraźnie przekazywany w adresie 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"

GET JSON

Wykorzystuje interfejs API JSON dla 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 i SNI w przypadku adresów URL adresów IP

TLS 1.3 wymaga, aby klienci podali nazwę SNI (Server Name Identification).

Rozszerzenie SNI określa, że informacje SNI są domeną DNS (a nie adresem IP):

"HostName" zawiera pełną nazwę hosta DNS serwera zinterpretowaną przez klienta. Nazwa hosta jest przedstawiona w postaci ciągu bajtowego za pomocą kodowania ASCII bez kropki na końcu. Umożliwia to obsługę międzynarodowych nazw domen za pomocą etykiet A zdefiniowanych w RFC5890. W nazwach hostów DNS nie jest rozróżniana wielkość liter. Algorytm do porównania nazw hostów został opisany w RFC5890 (sekcja 2.3.2.4).

Literalne adresy IPv4 i IP66 nie są dozwolone w domenie "HostName".

Te wymagania mogą być trudne do spełnienia w przypadku aplikacji DoH lub DoT, które chcą skorzystać z ulepszeń zabezpieczeń TLS 1.3. Publiczny serwer DNS Google obecnie akceptuje połączenia TLS 1.3, które nie udostępniają rozszerzenia SNI, ale może to wymagać zmiany tego systemu w przyszłości.

Oto nasze zalecenia dotyczące stosowania szablonów DoT oraz DoH w kontekście SNI:

  1. Wyślij nazwę hosta dns.google jako SNI w przypadku wszelkich połączeń z usługami Google DoT i DoH Google.
  2. Jeśli nie jest dostępna żadna nazwa hosta (na przykład w aplikacji przeprowadzającej osobisty kontakt do DoT), lepiej jest wysłać adres IP w SNI, zamiast zostawiać to pole puste.
  3. Adresy IPv6 powinny mieć postać [2001:db8:1234::5678] w nagłówku Host, ale bez nawiasów w SNI.

Obcinanie odpowiedzi DNS

Publiczny serwer DNS Google zwykle nie ogranicza odpowiedzi na zapytania DoT i DoH, ale istnieją 2 sposoby:

  1. Jeśli publiczny serwer DNS Google nie może podać pełnych i nieskróconych odpowiedzi z wiarygodnych serwerów nazw, wskazuje w nim flagę TC.

  2. Jeśli odpowiedź DNS (w formularzu wiadomości binarnej DNS) przekroczy limit 64 KiB w przypadku wiadomości TCP DNS, Google Public DNS może ustawić flagę TC (skracanie), jeśli wymaga tego standardy RFC.

W takich przypadkach klienci nie muszą jednak przeprowadzać zwykłego połączenia TCP ani przesyłania żadnego innego protokołu, ponieważ wyniki będą identyczne.