Transportasi aman untuk DNS

Kueri dan balasan DNS tradisional dikirim melalui UDP atau TCP tanpa enkripsi, membuat mereka tunduk pada pengawasan, pemalsuan, dan penyaringan internet berbasis DNS. Respons terhadap klien dari resolver publik, seperti Google Public DNS, terutama rentan terhadap hal ini, karena pesan dapat melewati banyak jaringan, sementara pesan antara {i>recursive resolver<i} dan server nama otoritatif, sering menggabungkan perlindungan tambahan.

Untuk mengatasi masalah ini, pada tahun 2016 kami meluncurkan DNS-over-HTTPS (sekarang disebut DoH) menawarkan resolusi DNS yang memvalidasi DNSSEC terenkripsi melalui HTTPS dan QUIC. Dan pada tahun 2019, kami menambahkan dukungan untuk standar DNS over TLS (DoT) yang digunakan oleh fitur DNS Pribadi Android.

DoH dan DoT meningkatkan privasi dan keamanan antara klien dan resolver, melengkapi validasi Google Public DNS terhadap DNSSEC untuk memberikan end-to-end DNS terautentikasi untuk domain bertanda tangan DNSSEC. Dengan Google Public DNS, kami berkomitmen untuk menyediakan resolusi DNS yang cepat, pribadi, dan aman untuk DoH dan klien DoT.

Versi TLS dan suite kripto yang didukung

Google Public DNS mendukung TLS 1.2 dan TLS 1.3 untuk DoH dan DoT; tidak sebelumnya yang didukung, bukan versi TLS atau SSL. Hanya paket penyandian dengan keamanan maju dan Enkripsi yang Diautentikasi dengan Data Tambahan (AEAD) didukung. Qualys SSL Labs menunjukkan kumpulan cipher suite yang didukung saat ini.

Endpoint

Google Public DNS menggunakan endpoint berikut untuk DoH dan DoT:

DoT (port 853) dns.google

DoH (port 443) Template URI

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

    • Untuk POST, URL hanya https://dns.google/dns-query dan isi dari permintaan HTTP adalah {i>payload<i} DNS UDP biner dengan tipe konten application/dns-message.
    • Untuk GET, alamat ini adalah https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • JSON API – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Parameter GET lebih lanjut dijelaskan di JSON API. Hanya parameter name yang diperlukan.

Klien

Ada sejumlah aplikasi klien yang menggunakan DoT atau DoH

  • Fitur “Private Browsing” Android 9 (Pie) – DoT
  • Intra (aplikasi Android) – DoH

Situs dnsprivacy.org mencantumkan beberapa klien lain untuk DoT dan DoH, tetapi proses ini biasanya memerlukan konfigurasi yang cukup teknis.

Contoh command line

Contoh command line berikut tidak dimaksudkan untuk digunakan di klien sebenarnya dan hanya ilustrasi menggunakan alat diagnostik yang umum tersedia.

DoT

Perintah berikut memerlukan Knot DNS kdig 2.3.0 atau yang lebih baru; dengan 2.7.4 atau nanti, hapus tanda komentar di +tls‑sni untuk mengirim SNI sesuai yang diwajibkan oleh 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

POSTINGAN RFC 8484

String yang dienkode Base64Url dalam perintah ini adalah pesan DNS yang dikirim oleh dig +noedns example.test A dengan kolom ID DNS disetel ke nol, seperti yang direkomendasikan oleh RFC 8484 bagian 4.1. Perintah {i>shell<i} mengirimkan kueri DNS itu sebagai konten isi data biner, menggunakan 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

String yang dienkode Base64Url dalam perintah ini adalah pesan DNS yang dikirim oleh dig +noedns example.com A dengan kolom ID DNS disetel ke nol. Dalam hal ini, secara eksplisit diteruskan di 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

Ini menggunakan JSON API untuk 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 dan SNI untuk URL alamat IP

TLS 1.3 mengharuskan klien memberikan Identifikasi Nama Server (SNI).

Ekstensi SNI menentukan bahwa informasi SNI adalah domain DNS (dan bukan alamat IP):

"NamaHost" berisi nama {i>host<i} DNS server yang sepenuhnya memenuhi syarat, seperti yang dipahami oleh klien. Nama host direpresentasikan sebagai string byte menggunakan pengkodean ASCII tanpa tanda titik. Hal ini memungkinkan dukungan dari nama domain internasional melalui penggunaan label A yang ditentukan dalam RFC5890. Nama host DNS tidak peka huruf besar/kecil. Algoritma yang akan dibandingkan nama host dijelaskan dalam RFC5890, Bagian 2.3.2.4.

Alamat IPv4 dan IPv6 literal tidak diizinkan di "HostName".

Persyaratan ini mungkin sulit dipenuhi untuk aplikasi Departemen Kesehatan atau DoT yang ingin memanfaatkan peningkatan keamanan di TLS 1.3. Google Public DNS saat ini menerima koneksi TLS 1.3 yang tidak menyediakan SNI, tetapi kita mungkin perlu mengubah hal ini untuk alasan operasional atau keamanan di masa depan.

Rekomendasi kami untuk permohonan Departemen Transportasi atau Departemen Kesehatan terkait SNI adalah sebagai berikut:

  1. Kirim nama host dns.google sebagai SNI untuk setiap koneksi ke Google Public DNS DoT atau DoH.
  2. Jika tidak ada nama host yang tersedia (misalnya, dalam aplikasi yang melakukan oportunistik), lebih baik mengirim alamat IP di SNI daripada daripada membiarkannya kosong.
  3. Alamat IPv6 harus muncul dalam [2001:db8:1234::5678] dalam bentuk kurung di header Host, tetapi tanpa tanda kurung di SNI.

Pemotongan Respons DNS

Meskipun Google Public DNS umumnya tidak memotong respons terhadap DoT dan DoH ada dua keadaan ketika hal itu terjadi:

  1. Jika Google Public DNS tidak bisa mendapatkan respons lengkap dan tidak terpotong dari server nama otoritatif, ia menetapkan penanda TC dalam respons.

  2. Dalam kasus di mana respons DNS (dalam bentuk pesan DNS biner) akan melebihi batas 64 KiB untuk pesan DNS TCP, Google Public DNS dapat menyetel TC (pemotongan) jika standar RFC memerlukannya.

Namun, dalam kasus ini, klien tidak perlu mencoba lagi menggunakan TCP polos atau {i>transport<i} lainnya, karena hasilnya akan sama.