Bezpieczne przesyłanie dla DNS

Tradycyjne zapytania DNS i odpowiedzi są wysyłane przez UDP lub TCP bez szyfrowania, przez co podlegają inwigilacji, podszywaniu się i filtrowaniu internetu opartym na DNS. Szczególnie narażone są na to odpowiedzi klientów z publicznych resolverów, takich jak publiczny DNS Google, ponieważ wiadomości mogą przechodzić przez wiele sieci. Z kolei wiadomości między rekurencyjnymi resolverami a autorytatywnymi serwerami nazw często obejmują dodatkowe zabezpieczenia.

Aby rozwiązać te problemy, w 2016 roku uruchomiliśmy DNS przez HTTPS (obecnie DoH), który oferuje szyfrowanie DNS do weryfikacji przez DNSSEC przez HTTPS i QUIC. W 2019 roku dodaliśmy obsługę standardu DNS przez TLS (DoT), który jest używany przez funkcję Prywatny DNS na Androidzie.

DoH i DoT zwiększają prywatność i bezpieczeństwo między klientami a resolverami, uzupełniając weryfikację Google publicznego DNS zabezpieczeń DNSSEC, co zapewnia kompleksowy uwierzytelnianie DNS dla domen podpisanych przez DNSSEC. Publiczny system DNS Google to szybkie, prywatne i bezpieczne rozpoznawanie nazw DNS zarówno klientom DoH, jak i DoT.

Obsługiwane wersje TLS i pakiety kryptograficzne

Google Public DNS obsługuje TLS 1.2 i TLS 1.3 zarówno w przypadku DoH, jak i DoT. Nie są obsługiwane żadne wcześniejsze wersje protokołu TLS ani SSL. Obsługiwane są tylko zestawy szyfrów z zabezpieczeniami przekierowania i uwierzytelnianiem szyfrowania z dodatkowymi danymi (AEAD). Qualys SSL Labs pokazuje bieżący zestaw obsługiwanych zestawów szyfrów.

Punkty końcowe

Publiczny serwer DNS Google korzysta z tych punktów końcowych w przypadku DoH i DoT:

DoT (port 853) dns.google

Szablony URI DoH (port 443)

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

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

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

W imieniu klientów

Istnieje wiele aplikacji klienckich, które korzystają z DoT i DoH.

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

Na stronie dnsprivacy.org znajduje się kilka innych klientów wykorzystujących DoT i DoH, ale zwykle wymagają one umiarkowanej konfiguracji technicznej.

Przykłady poleceń wiersza poleceń

Podane niżej przykłady wiersza poleceń nie są przeznaczone do użytku przez konkretnego klienta i stanowią jedynie ilustrację przedstawiającą powszechnie dostępne narzędzia diagnostyczne.

DoT

Poniższe polecenia wymagają Knot DNS kdig w wersji 2.3.0 lub nowszej. Jeśli masz wersję 2.7.4 lub nowszą, usuń znacznik komentarza z +tls‑sni, aby wysłać SNI zgodnie z wymaganiami 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 zakodowany w Base64Url w tym poleceniu to wiadomość DNS wysłana przez dig +noedns example.test A z polem identyfikatora DNS ustawionym na 0, zgodnie z zaleceniami w RFC 8484 (sekcja 4.1). Polecenie powłoki wysyła to zapytanie DNS jako treść binarnej treści danych 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"

POBIERANIE RFC 8484

Ciąg zakodowany w Base64Url w tym poleceniu to wiadomość DNS wysłana przez dig +noedns example.com A z polem identyfikatora DNS ustawionym na 0. W takim przypadku jest on przekazywany bezpośrednio 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"

POBIERANIE JSON

Korzysta ono z interfejsu JSON API 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 dla adresów URL adresów IP

TLS 1.3 wymaga, aby klienty podały identyfikator nazwy serwera (SNI).

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

„Nazwa hosta” zawiera pełną i jednoznaczną nazwę hosta DNS serwera zrozumiałą dla klienta. Nazwa hosta jest przedstawiana jako ciąg bajtowy w kodowaniu ASCII bez kropki na końcu. Umożliwia to obsługę międzynarodowych nazw domen przez wykorzystanie etykiet A zdefiniowanych w dokumencie RFC5890. W nazwach hostów DNS wielkość liter nie jest rozróżniana. Algorytm do porównywania nazw hostów został opisany w RFC5890, w sekcji 2.3.2.4.

Literowe adresy IPv4 i IPv6 nie są dozwolone w polu „HostName”.

Spełnienie tych wymagań może być trudne w przypadku aplikacji DoH lub DoT, które chcą korzystać z ulepszeń zabezpieczeń protokołu TLS 1.3. Publiczny serwer DNS Google akceptuje obecnie połączenia TLS 1.3, które nie zapewniają usługi SNI, jednak w przyszłości ze względów związanych z działaniem lub bezpieczeństwem może być konieczna zmiana tego ustawienia.

Nasze zalecenia dotyczące wniosków w DoT i DoH w odniesieniu do SNI:

  1. Wyślij nazwę hosta dns.google jako SNI w przypadku wszystkich połączeń z usługami Google Public DNS DoT lub DoH.
  2. Jeśli nie jest dostępna nazwa hosta (np. w aplikacji, która używa oportunistycznego DoT), lepiej wysłać adres IP w SNI niż pozostawiać puste.
  3. Adresy IPv6 powinny się pojawić w nagłówku Host w nawiasach kwadratowych [2001:db8:1234::5678], ale bez nawiasów w SNI.

Obcinanie odpowiedzi DNS

Chociaż Google Public DNS zazwyczaj nie skraca odpowiedzi na zapytania DoT i DoH, są 2 sytuacje, gdy ma to miejsce:

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

  2. W przypadkach, gdy odpowiedź DNS (w formie binarnego komunikatu DNS) przekroczyłaby limit 64 KiB dla wiadomości DNS TCP, Google Public DNS może ustawić flagę TC (obcinanie), jeśli standardy RFC tego wymagają.

Jednak w takich przypadkach nie muszą oni ponawiać próby przy użyciu zwykłego protokołu TCP ani innego transportu, ponieważ wynik będzie taki sam.