डीएनएस के लिए सुरक्षित परिवहन

पारंपरिक डीएनएस क्वेरी और जवाब, यूडीपी या टीसीपी पर बिना एन्क्रिप्शन के भेजे जाते हैं. इसलिए, ये निगरानी, स्पूफ़िंग, और डीएनएस-आधारित इंटरनेट फ़िल्टर के मुताबिक होते हैं. Google सार्वजनिक डीएनएस जैसे सार्वजनिक रिज़ॉल्वर के क्लाइंट को दिए जाने वाले जवाब खास तौर पर जोखिम भरे होते हैं, क्योंकि मैसेज कई नेटवर्क से होकर गुज़र सकते हैं. हालांकि, बार-बार होने वाले रिज़ॉल्वर और आधिकारिक नाम सर्वरों के बीच मैसेज अक्सर ज़्यादा सुरक्षा देते हैं.

इन समस्याओं को हल करने के लिए, हमने 2016 में एचटीटीपीएस पर डीएनएस लॉन्च किया (जिसे अब DoH कहा जाता है). यहां एचटीटीपीएस और QUIC पर डीएनएसएसईसी की पुष्टि करने के लिए इस्तेमाल किया गया डीएनएस रिज़ॉल्यूशन दिखाया गया. इसके बाद, 2019 में, हमने Android प्राइवेट डीएनएस की सुविधा के लिए इस्तेमाल किए जाने वाले TLS (DoT) स्टैंडर्ड के हिसाब से, डीएनएस के लिए सहायता जोड़ी थी.

DoH और DoT, क्लाइंट और रिज़ॉल्वर के बीच निजता और सुरक्षा को बेहतर बनाते हैं. ये डीएनएसएसईसी पर हस्ताक्षर करने वाले डोमेन के लिए, पूरी तरह से पुष्टि किए गए डीएनएस को डीएनएस पब्लिक डीएनएस की पुष्टि के तौर पर पूरा करते हैं. Google की सार्वजनिक डीएनएस सेवा के ज़रिए, हम DoH और DoT क्लाइंट, दोनों के लिए तेज़, निजी, और सुरक्षित डीएनएस रिज़ॉल्यूशन उपलब्ध कराने के लिए प्रतिबद्ध हैं.

साथ काम करने वाले TLS वर्शन और क्रिप्टो सुइट

Google की सार्वजनिक डीएनएस सेवा, DoH और DoT, दोनों के लिए TLS 1.2 और TLS 1.3 के साथ काम करती है. TLS या एसएसएल के पुराने वर्शन काम नहीं करते. सिर्फ़ आगे की सुरक्षा वाले साइफ़र सुइट और ज़्यादा डेटा के साथ पुष्टि किया गया एन्क्रिप्शन (AEAD) इस्तेमाल किए जा सकते हैं. Qualys SSL लैब, काम करने वाले साइफ़र सुइट का मौजूदा सेट दिखाता है.

एंडपॉइंट

Google की सार्वजनिक डीएनएस सेवा, DoH और DoT के लिए, नीचे दिए गए एंडपॉइंट का इस्तेमाल करती है:

DoT (पोर्ट 853) dns.google

डीओएच (पोर्ट 443) यूआरआई टेंप्लेट

  • आरएफ़सी 8484 – https://dns.google/dns-query{?dns}

    • POST के लिए, यूआरएल सिर्फ़ https://dns.google/dns-query है और एचटीटीपी अनुरोध का मुख्य हिस्सा, बाइनरी यूडीपी डीएनएस पेलोड है. इसमें कॉन्टेंट के लिए ऐप्लिकेशन/डीएनएस-मैसेज मौजूद है.
    • जीईटी के लिए, यह https://dns.google/dns-query?dns=BASE64URL_OF_QUERY है.
  • JSON एपीआई – https://dns.google/resolve{?name}{&type,cd,do,…}

    • ज़्यादा जीईटी पैरामीटर के बारे में JSON एपीआई पेज पर बताया गया है. सिर्फ़ name पैरामीटर ज़रूरी है.

क्लाइंट की ओर से

ऐसे कई क्लाइंट ऐप्लिकेशन हैं जो DoT या DoH का इस्तेमाल करते हैं

  • Android 9 (पाई) “निजी ब्राउज़िंग” सुविधा – DoT
  • Intra (Android ऐप्लिकेशन) – DoH

dnsprivacy.org वेबसाइट पर, DoT और DoH के लिए कई दूसरे क्लाइंट की सूची दी गई है. हालांकि, आम तौर पर इनमें कुछ हद तक तकनीकी कॉन्फ़िगरेशन की ज़रूरत होती है.

कमांड लाइन के उदाहरण

नीचे दिए गए कमांड-लाइन के उदाहरणों का इस्तेमाल किसी क्लाइंट के लिए नहीं किया जा सकता और ये सिर्फ़ उदाहरण के तौर पर उपलब्ध गड़बड़ी की जानकारी देने वाले टूल का इस्तेमाल करने वाले उदाहरण हैं.

डॉट

इन निर्देशों के लिए, ज़रूरी है कि आप Knot DNS kdig 2.3.0 या इसके बाद का वर्शन इस्तेमाल करें; 2.7.4 या इसके बाद के वर्शन में, TLS 1.3 के मुताबिक, SNI को भेजने के लिए +tls‑sni की टिप्पणी पर क्लिक न करें.

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

डोह

आरएफ़सी 8484 पोस्ट

इस निर्देश में, Base64Url के कोड में बदली गई स्ट्रिंग, डीएनएस मैसेज फ़ील्ड है, जिसे dig +noedns example.test A ने डीएनएस आईडी फ़ील्ड के साथ शून्य पर सेट किया है. जैसा कि आरएफ़सी 8484 सेक्शन 4.1 में सुझाया गया है. शेल कमांड, कॉन्टेंट के प्रकार 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"

आरएफ़सी 8484 पाएं

इस निर्देश में Base64Url के कोड में बदली गई स्ट्रिंग वह डीएनएस मैसेज है जिसे dig +noedns example.com A ने भेजा है. इसमें डीएनएस आईडी फ़ील्ड को शून्य पर सेट किया गया है. इस मामले में, यह यूआरएल में साफ़ तौर पर दिखता है.

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 पाएं

यह DoH के लिए JSON API का इस्तेमाल करता है.

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 और IP पता URL के लिए SNI

TLS 1.3 के लिए यह ज़रूरी है कि क्लाइंट सर्वर के नाम की पहचान (SNI) दें.

SNI एक्सटेंशन से पता चलता है कि SNI जानकारी एक डीएनएस डोमेन है (न कि आईपी पता):

"HostName" में सर्वर का पूरी तरह क्वालिफ़ाइड डीएनएस होस्टनेम शामिल है, जैसा कि क्लाइंट ने समझ लिया है. होस्टनेम को बाइट स्ट्रिंग के तौर पर दिखाया जाता है. इसके लिए, ट्रेलिंग बिंदु के बिना, ASCII कोड में बदलने का तरीका इस्तेमाल किया जाता है. इससे, आरएफ़सी5890 में बताए गए A-लेबल का इस्तेमाल करके, अंतरराष्ट्रीय डोमेन नामों का इस्तेमाल किया जा सकता है. डीएनएस होस्टनेम केस-इनसेंसिटिव होते हैं. होस्टनेम की तुलना करने वाले एल्गोरिदम के बारे में, आरएफ़सी5890, सेक्शन 2.3.2.4 में बताया गया है.

लिटरल IPv4 और IPv6 पते की अनुमति "HostName". में नहीं दी जा सकती

इन ज़रूरी शर्तों को DoH या DoT ऐप्लिकेशन के लिए पूरा करना मुश्किल हो सकता है. साथ ही, इन्हें TLS 1.3 में सुरक्षा से जुड़े सुधारों का फ़ायदा भी चाहिए. फ़िलहाल, Google की सार्वजनिक डीएनएस सेवा, TLS 1.3 कनेक्शन के लिए अनुमति देती है. यह कनेक्शन, SNI के लिए उपलब्ध नहीं है, लेकिन हमें आने वाले समय में, इसमें सुरक्षा या सुरक्षा से जुड़ी वजहों से बदलाव करना पड़ सकता है.

SNI के लिए DoT या DoH ऐप्लिकेशन के लिए हमारे सुझाव नीचे दिए गए हैं:

  1. Google की सार्वजनिक डीएनएस सेवा से जुड़ी DoT या DoH सेवाओं के लिए, dns.google होस्टनेम को SNI के तौर पर भेजें.
  2. अगर कोई भी होस्टनेम उपलब्ध नहीं है (उदाहरण के लिए, किसी ऐसे ऐप्लिकेशन में जो मौकों के साथ DoT इस्तेमाल करता है), तो आईपी पते को खाली छोड़ने के बजाय SQL में भेज देना ही बेहतर है.
  3. IPv6 पते, Host हेडर में [2001:db8:1234::5678] ब्रैकेट में दिखनी चाहिए, लेकिन SNI में बिना ब्रैकेट में दिखने चाहिए.

डीएनएस के जवाब की ट्रंकिंग

आम तौर पर, Google की सार्वजनिक डीएनएस सेवा, DoT और DoH क्वेरी के जवाबों को नहीं काटती है, लेकिन ऐसा दो मामलों में होता है:

  1. अगर Google की सार्वजनिक डीएनएस सेवा को, आधिकारिक नाम सर्वर से पूरा और फ़िट नहीं किया जा सका, तो वह टीसी फ़्लैग को जवाब में सेट करता है.

  2. ऐसे मामलों में जहां डीएनएस डीएनएस के रिस्पॉन्स, बाइनरी डीएनएस मैसेज फ़ॉर्म में भेजे गए डीएनएस के जवाब के लिए, 64 केबी की सीमा से ज़्यादा हो जाएंगे. अगर आरएफ़सी स्टैंडर्ड के तहत ऐसा करना ज़रूरी हो, तो Google सार्वजनिक डीएनएस, टीसी (काट-छांट) फ़्लैग को सेट कर सकता है.

हालांकि, इन मामलों में क्लाइंट को सादे टीसीपी या किसी और परिवहन का इस्तेमाल करके फिर से कोशिश करने की ज़रूरत नहीं है, क्योंकि नतीजा एक जैसा होगा.