DNS için güvenli aktarımlar

Geleneksel DNS sorguları ve yanıtları, şifreleme olmadan UDP veya TCP üzerinden gönderilir. Bu sayede izleme, adres sahteciliği ve DNS tabanlı internet filtrelemesine tabi tutulur. Mesajların birçok ağ üzerinden iletilebilmesi ve yinelemeli çözümleyiciler ile yetkili alan adı sunucuları arasındaki mesajlar ise genellikle ek korumalar içerdiğinden, istemcilere Google Açık DNS gibi herkese açık çözümleyicilerden gelen istemcilere verilen yanıtlar, bu konuda özellikle savunmasızdır.

Bu sorunları ele almak için 2016'da HTTPS üzerinden DNS'yi kullanıma sunduk (artık DoH olarak adlandırılıyor), HTTPS ve QUIC üzerinden şifrelenmiş DNSSEC doğrulamalı DNS çözümlemesi sunuyoruz. 2019'da ise Android Gizli DNS özelliği tarafından kullanılan TLS üzerinden DNS (DoT) standardı için destek ekledik.

DoH ve DoT, istemciler ve çözümleyiciler arasındaki gizliliği ve güvenliği iyileştirerek DNSSEC'nin Google Açık DNS doğrulamasını tamamlar ve DNSSEC imzalı alanlar için uçtan uca kimlik doğrulaması yapılmış DNS sağlamak amacıyla DNSSEC'nin Google Açık DNS doğrulamasını tamamlar. Google Açık DNS ile hem DoH hem de DoT istemcileri için hızlı, gizli ve güvenli DNS çözümlemesi sunmayı taahhüt ediyoruz.

Desteklenen TLS sürümleri ve şifreleme paketleri

Google Açık DNS, hem DoH hem de DoT için TLS 1.2 ve TLS 1.3'ü destekler. TLS veya SSL'nin önceki sürümleri desteklenmez. Yalnızca ileri düzey güvenliği olan şifre paketleri ve Ek Verilerle Kimliği Doğrulanmış Şifreleme (AEAD) desteklenir. Qualys SSL Labs, desteklenen mevcut şifre paketi grubunu gösterir.

Uç noktalar

Google Açık DNS, DoH ve DoT için aşağıdaki uç noktaları kullanır:

DoT (853 bağlantı noktası) dns.google

DoH (443 numaralı bağlantı noktası) URI şablonları

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

    • POST için URL yalnızca https://dns.google/dns-query şeklindedir ve HTTP isteğinin gövdesi, uygulama/dns-mesaj içerik türüne sahip ikili UDP DNS yüküdür.
    • GET için bu: https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • JSON API - https://dns.google/resolve{?name}{&type,cd,do,…}

    • JSON API sayfasında daha fazla GET parametresi açıklanmıştır. Yalnızca name parametresi gereklidir.

Müşteriler

DoT veya DoH kullanan birkaç istemci uygulaması vardır

  • Android 9 (Pie) "Gizli Tarama" özelliği - DoT
  • Intra (Android uygulaması) – DoH

dnsprivacy.org web sitesinde DoT ve DoH için başka birkaç istemci listelenmektedir ancak bunlar genellikle orta düzeyde teknik yapılandırma gerektirir.

Komut satırı örnekleri

Aşağıdaki komut satırı örnekleri gerçek bir istemcide kullanım için tasarlanmamıştır ve yalnızca yaygın olarak bulunan teşhis araçlarının kullanımına yönelik çizimlerdir.

DoT

Aşağıdaki komutlar için Knot DNS kdig 2.3.0 veya sonraki sürümler gerekir. 2.7.4 veya sonraki sürümlerde, TLS 1.3'ün gerektirdiği şekilde SNI göndermesi için +tls‑sni ile ilgili açıklamayı kaldırın.

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 POSTA

Bu komuttaki Base64Url kodlamalı dize, RFC 8484 bölüm 4.1 tarafından önerildiği gibi, dig +noedns example.test A tarafından DNS Kimliği alanı sıfır olarak ayarlanmış şekilde gönderilen DNS mesajıdır. Kabuk komutu, bu DNS sorgusunu application/dns-message Content-Type kullanarak ikili veri gövdesi içeriği olarak gönderir.

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 ALMA

Bu komuttaki Base64Url kodlamalı dize, DNS kimliği alanı sıfır olarak ayarlanmış şekilde dig +noedns example.com A tarafından gönderilen DNS mesajıdır. Bu durumda, URL'de açık bir şekilde iletilir.

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 ALMA

DoH için JSON API'yi kullanır.

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":[]}

IP adresi URL'leri için TLS 1.3 ve SNI

TLS 1.3, istemcilerin Sunucu Adı Tanımlama (SNI) sağlamasını gerektirir.

SNI uzantısı, SNI bilgilerinin bir DNS alanı olduğunu (IP adresi değil) belirtir:

"HostName", istemci tarafından anlaşıldığı şekilde sunucunun tam DNS ana makine adını içerir. Ana makine adı, sonunda nokta olmadan ASCII kodlaması kullanılarak bayt dizesi olarak gösterilir. Bu, RFC5890'da tanımlanan A etiketlerinin kullanımı aracılığıyla uluslararası alan adlarının desteklenmesine olanak tanır. DNS ana makine adları büyük/küçük harfe duyarlı değildir. Adları karşılaştıran algoritma, RFC5890, Bölüm 2.3.2.4'te açıklanmıştır.

"BarındırıcıAdı"nda, gerçek IPv4 ve IPv6 adreslerine izin verilmez.

TLS 1.3'teki güvenlik iyileştirmelerinden yararlanmak isteyen DoH veya DoT uygulamalarının bu gereksinimleri karşılaması zor olabilir. Google Açık DNS, şu anda SNI sağlamayan TLS 1.3 bağlantılarını kabul etmektedir ancak gelecekte operasyonel veya güvenlikle ilgili nedenlerle bu ayarı değiştirmemiz gerekebilir.

SNI ile ilgili DoT veya DoH uygulamalarına yönelik önerilerimiz şunlardır:

  1. Google Genel DNS DoT veya DoH hizmetlerine olan tüm bağlantılar için dns.google ana makine adını SNI olarak gönderin.
  2. Ana makine adı yoksa (örneğin, fırsatçı DoT işlemi yapan bir uygulamada) IP adresini boş bırakmak yerine SNI'da göndermek daha iyi olur.
  3. IPv6 adresleri, Host başlığında [2001:db8:1234::5678] parantez içine alınmış biçimde olmalı, ancak SNI'da köşeli parantezler kullanılmamalıdır.

DNS Yanıtı Kesintisi

Google Açık DNS, genellikle DoT ve DoH sorgularına verilen yanıtları kısaltamasa da bu durum iki şekilde gerçekleşir:

  1. Google Açık DNS, yetkili alan adı sunucularından eksiksiz ve kısaltılmamış yanıtlar alamazsa yanıtta TC işaretini ayarlar.

  2. DNS yanıtının (ikili DNS mesajı biçiminde) TCP DNS mesajları için 64 KiB sınırını aştığı durumlarda, RFC standartları gerektirdiği takdirde Google Açık DNS, TC (kesme) işaretini ayarlayabilir.

Yine de aynı sonuç elde edileceği için bu durumlarda istemcilerin düz TCP veya başka bir taşıma yöntemini kullanarak tekrar denemesine gerek yoktur.