Transportes seguros para DNS

As consultas e respostas DNS tradicionais são enviadas por UDP ou TCP sem criptografia. e estão sujeitos a vigilância, spoofing e filtragem de Internet com base em DNS. As respostas aos clientes de resolvedores públicos, como o DNS público do Google, são especialmente vulnerável a isso, já que as mensagens podem passar por muitas redes, entre resolvedores recursivos e servidores de nomes autoritativos geralmente incorporam proteções adicionais.

Para resolver esses problemas, em 2016, lançamos o DNS sobre HTTPS (agora chamado de DoH). oferecendo uma resolução de DNS criptografada com validação de DNSSEC por HTTPS e QUIC (links em inglês). Em 2019, adicionamos suporte ao padrão DNS sobre TLS (DoT) usado pelo o recurso DNS particular do Android.

DoH e DoT melhoram a privacidade e a segurança entre clientes e resolvedores. complementando a validação do DNS público do Google para DNSSEC para fornecer e DNS autenticado para domínios assinados por DNSSEC. Com o DNS público do Google, estamos está comprometidos em fornecer resolução de DNS rápida, particular e segura para DoH e Clientes DoT.

Versões de TLS e pacotes de criptografia compatíveis

O DNS público do Google é compatível com TLS 1.2 e TLS 1.3 para DoH e DoT. não há mais e as versões de TLS ou SSL têm suporte. Apenas pacotes de criptografia com segurança avançada e a criptografia autenticada com dados adicionais (AEAD, na sigla em inglês). O site Qualys SSL Labs mostra o conjunto atual de pacotes de criptografia compatíveis.

Endpoints

O DNS público do Google usa os seguintes endpoints para DoH e DoT:

DoT (porta 853) dns.google

Modelos de URI do DoH (porta 443)

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

    • Para POST, o URL é apenas https://dns.google/dns-query e o corpo de a solicitação HTTP é o payload de DNS UDP binário com o tipo de conteúdo application/dns-message.
    • Para GET, é https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • API JSON: https://dns.google/resolve{?name}{&type,cd,do,…}

    • Mais parâmetros GET são descritos na API JSON. Apenas o parâmetro name é obrigatório.

Clientes

Há vários aplicativos clientes que usam DoT ou DoH

  • Recurso "Navegação privada" do Android 9 (Pie) - DoT
  • Intra (app Android): DoH

O site dnsprivacy.org lista vários outros clientes para DoT e DoH, mas geralmente exigem uma configuração moderadamente técnica.

Exemplos de linha de comando

Os exemplos de linha de comando a seguir não são destinados ao uso em um cliente real e são apenas ilustrações usando as ferramentas de diagnóstico mais comuns.

DoT

Os comandos a seguir exigem o Knot DNS kdig 2.3.0 ou mais recente. com a versão 2.7.4 ou Depois, remova a marca de comentário do +tls‑sni para enviar o SNI, conforme exigido pelo 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 (em inglês)

A string codificada em Base64Url neste comando é a mensagem DNS enviada pelo dig +noedns example.test A com o campo "ID do DNS" definido como zero, conforme recomendado pela seção 4.1 do RFC 8484 (em inglês). O comando shell envia essa consulta DNS como a conteúdo do corpo de dados binários, usando o 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"

GET RFC 8484

A string codificada em Base64Url neste comando é a mensagem DNS enviada pelo dig +noedns example.com A com o campo "ID do DNS" definido como zero. Nesse caso, é explicitamente transmitido no 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

Ele usa a API JSON para 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 e SNI para URLs de endereço IP

O TLS 1.3 exige que os clientes fornecer o Server Name Identification (SNI).

A extensão SNI especifica que as informações de SNI são um domínio DNS (e não um endereço IP):

"NomedoHost" contém o nome do host DNS totalmente qualificado do servidor, conforme entendido pelo cliente. O nome do host é representado como uma string de bytes usando codificação ASCII sem um ponto final. Isso permite o suporte de nomes de domínio internacionalizados através do uso de rótulos A definidos em RFC5890 (link em inglês). Os nomes de host de DNS não diferenciam maiúsculas de minúsculas. O algoritmo a ser comparado é descrito na RFC5890, Seção 2.3.2.4.

Endereços IPv4 e IPv6 literais não são permitidos em "HostName".

Pode ser difícil atender a esses requisitos para aplicativos de DoH ou DoT que querem aproveitar as melhorias de segurança do TLS 1.3. DNS público do Google atualmente aceita conexões TLS 1.3 que não fornecem SNI, mas pode ser necessário alterar por motivos operacionais ou de segurança no futuro.

Nossas recomendações para aplicativos DoT ou DoH referentes à SNI são as seguintes:

  1. Enviar o nome do host do dns.google como SNI para qualquer conexão com o Google Public DNS DoT ou DoH.
  2. Se nenhum nome de host estiver disponível (por exemplo, em um aplicativo que está oportunista), é melhor enviar o endereço IP no SNI em vez do que deixar em branco.
  3. Os endereços IPv6 devem aparecer entre colchetes [2001:db8:1234::5678] no cabeçalho Host, mas sem colchetes no SNI.

Truncamento da resposta de DNS

Embora o DNS público do Google geralmente não trunca as respostas a DoT e DoH consultas, há duas circunstâncias em que isso acontece:

  1. Se o DNS público do Google não conseguir respostas completas e não truncadas servidores de nomes autoritativos, ele define a flag de TC na resposta.

  2. Nos casos em que a resposta DNS (na forma de mensagem DNS binária) exceder o limite de 64 KiB para mensagens TCP DNS, o DNS público do Google poderá definir Sinalização de TC (truncamento) caso os padrões RFC exijam isso.

No entanto, nesses casos, os clientes não precisam tentar novamente usando TCP simples. ou qualquer outro transporte, já que o resultado será o mesmo.