Truyền tải an toàn cho DNS

Các truy vấn và phản hồi DNS truyền thống được gửi qua UDP hoặc TCP mà không được mã hoá, khiến chúng trở thành mục tiêu bị giám sát, giả mạo và lọc qua Internet dựa trên DNS. Phản hồi cho khách hàng từ các trình phân giải công khai như Google Public DNS đặc biệt dễ bị tấn công, vì tin nhắn có thể truyền qua nhiều mạng, trong khi tin nhắn giữa trình phân giải đệ quy và máy chủ định danh có thẩm quyền thường kết hợp biện pháp bảo vệ bổ sung.

Để giải quyết những vấn đề này, vào năm 2016, chúng tôi đã triển khai DNS-over-HTTPS (hiện được gọi là DoH) cung cấp quy trình phân giải DNS xác thực DNSSEC được mã hoá qua HTTPS và QUIC. Và trong năm 2019, chúng tôi đã hỗ trợ thêm cho tiêu chuẩn DNS qua TLS (DoT) mà tính năng DNS riêng của Android.

DoH và DoT tăng cường quyền riêng tư và tính bảo mật giữa ứng dụng và trình phân giải, bổ sung tính năng xác thực DNSSEC cho Google Public để cung cấp hệ thống hoàn chỉnh DNS đã xác thực cho những miền có chữ ký DNSSEC. Với DNS Google Public, chúng tôi cam kết cung cấp giải pháp phân giải DNS nhanh, riêng tư và bảo mật cho cả DoH và DoT.

Các phiên bản TLS và bộ mã hoá được hỗ trợ

Google Public DNS hỗ trợ TLS 1.2 và TLS 1.3 cho cả DoH và DoT; không sớm hơn phiên bản TLS hoặc SSL đều được hỗ trợ. Chỉ bộ thuật toán mật mã có cơ chế bảo mật chuyển tiếp và Mã hoá xác thực với dữ liệu bổ sung (AEAD) đều được hỗ trợ. Qualys SSL Labs hiển thị tập hợp bộ thuật toán mật mã được hỗ trợ hiện tại.

Điểm cuối

DNS của Google Public sử dụng các điểm cuối sau đây cho DoH và DoT:

DoT (cổng 853) dns.google

Mẫu URI DoH (cổng 443)

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

    • Đối với POST, URL chỉ là https://dns.google/dns-query và phần nội dung của yêu cầu HTTP là tải trọng DNS UDP nhị phân có loại nội dung application/dns-message.
    • Để GET, địa chỉ này là https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • API JSON – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Thêm tham số GET được mô tả trên trang API JSON. Chỉ có tham số name là bắt buộc.

Khách hàng

Có một số ứng dụng khách sử dụng DoT hoặc DoH

  • Tính năng “Duyệt web ở chế độ riêng tư” của Android 9 (Pie) – DoT
  • Intra (ứng dụng Android) – DoH

Trang web dnsprivacy.org liệt kê một số ứng dụng khác cho DoT và DoH, nhưng những tính năng này thường yêu cầu cấu hình kỹ thuật ở mức vừa phải.

Ví dụ về dòng lệnh

Các ví dụ dòng lệnh sau không nhằm sử dụng trong ứng dụng thực tế và chỉ là những minh hoạ sử dụng các công cụ chẩn đoán thông dụng.

DoT

Các lệnh sau yêu cầu Knot DNS kdig 2.3.0 trở lên; với 2.7.4 hoặc sau đó, huỷ nhận xét về +tls‑sni để gửi SNI theo yêu cầu của 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

BÀI ĐĂNG RFC 8484

Chuỗi được mã hoá Base64Url trong lệnh này là thông báo DNS do dig +noedns example.test A với trường mã DNS được đặt thành 0, theo khuyến nghị theo RFC 8484 mục 4.1. Lệnh shell sẽ gửi truy vấn DNS đó dưới dạng nội dung nội dung của dữ liệu nhị phân, sử dụng 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"

TẢI RFC 8484

Chuỗi được mã hoá Base64Url trong lệnh này là thông báo DNS do dig +noedns example.com A với trường mã DNS được đặt thành 0. Trong trường hợp này, được chuyển rõ ràng vào 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"

TẢI JSON

Thao tác này sử dụng API JSON cho 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 và SNI cho URL địa chỉ IP

TLS 1.3 yêu cầu các ứng dụng cung cấp Nhận dạng tên máy chủ (SNI).

Đuôi SNI chỉ định rằng thông tin SNI là miền DNS (chứ không phải địa chỉ IP):

"Tên máy chủ" chứa tên máy chủ DNS đủ điều kiện của máy chủ, theo cách mà khách hàng hiểu. Tên máy chủ được biểu thị dưới dạng chuỗi byte sử dụng mã hoá ASCII mà không có dấu chấm ở cuối. Điều này cho phép hỗ trợ tên miền quốc tế hoá thông qua việc sử dụng nhãn A được xác định trong RFC5890. Tên máy chủ DNS không phân biệt chữ hoa chữ thường. Thuật toán so sánh tên máy chủ được mô tả trong RFC5890, Phần 2.3.2.4.

Không được phép sử dụng địa chỉ IPv4 và IPv6 theo nghĩa đen trong "HostName".

Những yêu cầu này có thể khó đáp ứng đối với những đơn đăng ký của Bộ Quốc phòng và Bộ Môi trường (DoH) muốn tận dụng các cải tiến về bảo mật trong TLS 1.3. DNS Google Public hiện tại chấp nhận các kết nối TLS 1.3 không cung cấp SNI, nhưng chúng tôi có thể cần phải thay đổi điều này vì lý do vận hành hoặc bảo mật trong tương lai.

Sau đây là một số đề xuất của chúng tôi đối với các ứng dụng của DoT hoặc DoH liên quan đến SNI:

  1. Gửi tên máy chủ dns.google dưới dạng SNI cho mọi kết nối đến Google Public Dịch vụ DNS DoT hoặc DoH.
  2. Nếu không có tên máy chủ nào (ví dụ: trong một ứng dụng đang thực hiện DoT cơ hội), bạn nên gửi địa chỉ IP trong SNI hơn là hơn là để trống trường này.
  3. Địa chỉ IPv6 phải xuất hiện ở dạng [2001:db8:1234::5678] trong dấu ngoặc vuông trong tiêu đề Host nhưng không có dấu ngoặc trong SNI.

Rút ngắn phản hồi DNS

Mặc dù DNS Google Public thường không cắt ngắn phản hồi cho DoT và DoH thì có hai trường hợp:

  1. Nếu Google Public DNS không thể nhận được phản hồi hoàn chỉnh và không bị cắt bớt từ máy chủ định danh có thẩm quyền, công cụ này sẽ đặt cờ TC trong phản hồi.

  2. Trong trường hợp phản hồi DNS (ở dạng thông báo DNS nhị phân) vượt quá giới hạn 64 KiB đối với thông báo DNS của TCP, DNS Google Public có thể đặt giá trị Gắn cờ TC (cắt bớt) nếu tiêu chuẩn RFC yêu cầu phải thực hiện việc này.

Tuy nhiên, trong những trường hợp này, máy khách không cần thử lại bằng TCP thuần tuý hoặc bất kỳ phương pháp vận chuyển nào khác, vì kết quả đều giống nhau.