DNS のセキュアなトランスポート

従来の DNS クエリと応答は、暗号化されずに UDP または TCP 経由で送信されます。 監視、なりすまし、DNS ベースのインターネット フィルタリングの対象になります。 Google Public DNS のようなパブリック・リゾルバからのクライアントへの応答は特に メールが多くのネットワークを通過する可能性がある一方で、 ネームサーバーと再帰リゾルバの間には、 追加の保護機能を使用できます。

こうした問題に対処するため、Google は 2016 年に DNS over HTTPS(現在の「DoH」)を導入しました。 HTTPS と QUIC を介した暗号化された DNSSEC 検証 DNS 解決を提供します。 2019 年には、Google で使用される DNS over TLS(DoT)標準のサポートを追加しました。 Android の限定公開 DNS 機能。

DoH と DoT は、クライアントとリゾルバの間のプライバシーとセキュリティを強化します。 Google Public DNS による DNSSEC 検証を補完し、 DNSSEC 署名ドメイン用の認証済み DNS です。Google Public DNS を使用すると、 DoH と DoH のどちらの DNS でも 高速でプライベートかつ安全な DNS 解決が DoT クライアント。

サポートされている TLS バージョンと暗号スイート

Google Public DNS は、DoH と DoT の両方で TLS 1.2 と TLS 1.3 をサポートしています。それ以前 サポートされているかどうかがわかります。フォワード セキュリティのある暗号スイートのみ 認証付き暗号化(AEAD)がサポートされています。 Qualys SSL Labs では、現在サポートされている暗号スイートのセットをご覧いただけます。

エンドポイント

Google Public DNS は、DoH と DoT に次のエンドポイントを使用します。

DoT(ポート 853)dns.google

DoH(ポート 443)URI テンプレート

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

    • POST の場合、URL は https://dns.google/dns-query のみで、本文は HTTP リクエストはコンテンツ タイプのバイナリ UDP DNS ペイロード application/dns-message.
    • GET の場合は https://dns.google/dns-query?dns=BASE64URL_OF_QUERY になります。
  • JSON API - https://dns.google/resolve{?name}{&type,cd,do,…}

    • GET パラメータの詳細については、 JSON API のページ。 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‑sni のコメント化を解除して、TLS 1.3 で要求されている 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

RFC 8484 POST

このコマンドの Base64Url エンコード文字列は、 dig +noedns example.test A は、DNS ID フィールドが 0 に設定されたもの(推奨)に置き換えます。 RFC 8484 セクション 4.1 に準拠しています。シェルコマンドはその DNS クエリを 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"

RFC 8484 GET

このコマンドの Base64Url エンコード文字列は、 dig +noedns example.com A は、DNS ID フィールドが 0 に設定されたものに置き換えます。この例では 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"

JSON GET

これには、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":[]}

IP アドレス URL に対する TLS 1.3 と SNI

TLS 1.3 では、 Server Name Identification(SNI)を指定します。

SNI 拡張機能は、SNI 情報が(IP アドレスではなく)DNS ドメインであることを指定します。

「ホスト名」には、サーバーの完全修飾された DNS ホスト名が含まれます。 認識されるようにする必要がありますホスト名はバイト文字列として表されます。 使用できます。これにより で定義される A ラベルを使用した国際化ドメイン名の使用 RFC5890。DNS ホスト名では、大文字と小文字は区別されません。比較するアルゴリズム ホスト名については、RFC5890 のセクション 2.3.2.4 をご覧ください。

「HostName」にはリテラルの IPv4 アドレスと IPv6 アドレスを使用できません。

DoH または DoT のアプリケーションでは、これらの要件を満たすことが難しい場合があります。 TLS 1.3 で強化されたセキュリティ機能を活用しています。現在 Google Public DNS は SNI を提供しない TLS 1.3 接続を受け入れますが、 運用上またはセキュリティ上の理由で更新する必要はありません。

SNI に関する DoT または DoH アプリケーションの推奨事項は次のとおりです。

  1. Google Public への接続のため、dns.google ホスト名を SNI として送信します。 DNSDoT または DoH サービス。
  2. ホスト名を取得できない場合(ホスト名を 日和見的 DoT など)、SNI で IP アドレスを送信することをおすすめします。 空白のままにできます。
  3. IPv6 アドレスは、[2001:db8:1234::5678] Host ヘッダーがありますが、SNI では角かっこは付けません。

DNS 応答の切り捨て

Google Public DNS は通常、DoT や DoH に対するレスポンスを切り捨てませんが、 その場合、次の 2 つの状況が考えられます。

  1. Google Public DNS が IP アドレスから完全なレスポンスを レスポンスに TC フラグを設定します。

  2. DNS レスポンス(バイナリ DNS メッセージ形式)が 64 KiB の制限を超える場合、Google Public DNS は RFC 標準で義務付けられている場合は、TC(切り捨て)フラグを指定します。

ただし、これらのケースでは、クライアントが通常の TCP ポートを使用して 他のトランスポートを使用してはいけません。