डीएनएस के लिए सुरक्षित ट्रांसपोर्ट

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

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

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

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

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

एंडपॉइंट

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

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

DoH (पोर्ट 443) यूआरआई टेंप्लेट

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

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

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

क्लाइंट

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

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

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

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

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

DoT

यहां दिए गए निर्देशों के लिए, 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

DoH

आरएफ़सी 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 और SNI

TLS 1.3 के लिए यह ज़रूरी है कि क्लाइंट, सर्वर के नाम की पहचान (एसएनआई) उपलब्ध कराएं.

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

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

"HostName" में, लिटरल IPv4 और IPv6 पतों की अनुमति नहीं है.

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

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

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

डीएनएस रिस्पॉन्स में काट-छांट

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

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

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

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