DNS over HTTPS(DoH)は、RFC 8484で定義されたネットワークプロトコルであり、DNSクエリと応答をポート443上のHTTPS接続内にカプセル化して暗号化し、リゾルバのトラフィックを監視や改ざんから保護します。 企業にとっての主な運用上の課題は、独自のDoHサーバーを使用するアプリケーションやブラウザが内部リゾルバーをバイパスし、その結果、DNSフィルタリング、スプリットホライズンレコード、クエリのログ記録、および脅威検知機能が機能しなくなることです。 DoHを効果的に管理するには、組織が内部のDoH対応リゾルバーを承認し、クライアントポリシーを適用するとともに、不正なDoHサーバーへの接続を監視またはブロックして、DNSの可視性とセキュリティ態勢を維持する必要があります。
DoHの仕組み
DoHクライアントは、通常のDNSメッセージをHTTPSリクエストでカプセル化し、それをDoHサーバーに送信します。サーバーは、HTTPSレスポンスとしてDNSの応答を返します。
- DoHサーバーの特定:クライアントには、DoHサーバー用のURIテンプレートが設定されています。必要に応じてサーバーのホスト名を解決し、URIで別のポートが指定されていない限り、ポート443へのTCP接続を確立します。
- TLSの確立:クライアントとサーバーがTLSセッションをネゴシエートし、クライアントがサーバー証明書を検証します。これによりサーバーの認証が行われ、その後のすべての通信が暗号化されます。
- クエリの送信:クライアントは、DNSクエリを標準のワイヤ形式でエンコードし、GETまたはPOSTメソッドを使用したHTTPリクエストとして送信します。メッセージには、media-typeとして「application/dns-message」が使用されます。
- 応答の返却:サーバーはホスト名を解決し、HTTPレスポンスの本文にDNS応答を返します。クライアントは、これを他のDNS応答と同様に利用します。RFC 8484では、推奨される最低限のHTTPバージョンとしてHTTP/2を指定しており、これにより複数のクエリで1つの接続を共有することが可能になります。
セッションは暗号化されているため、経路上のデバイスはDoHサーバーへのTLS接続しか認識できず、クエリ名を読み取ったり変更したりすることはできません。DoHはクライアントとリゾルバー間のホップのみを保護します。リゾルバーから権威サーバーへのトラフィックは暗号化されず、リゾルバーの運用者は依然としてすべてのクエリを把握しています。
DoHの一般的な問題点
独自のDoHリゾルバ設定を持つブラウザやアプリケーションは、クエリを内部リゾルバを経由せずに直接パブリックサーバーに送信します。その結果、内部ゾーンはNXDOMAINエラーまたはタイムアウトとなり、スプリットホライズンレコード、フィルタリングポリシー、およびクエリのログ記録は、そのクライアントに対して適用されなくなります。
ポート53のトラフィックを検査または記録するセキュリティツールは、DoHクライアントからの通信を一切検知できません。ブロックリスト、シンクホール、およびレスポンスポリシーゾーンは機能せず、調査担当者はそれらのホストに関するクエリ履歴に欠落があることに気づきます。
DoHはTLSに依存しているため、システムクロックの誤り、信頼できない証明書チェーン、またはTLSを検査するプロキシが存在すると、クライアントがDoHサーバーへの接続に失敗する可能性があります。設定によっては、クライアントは暗号化されていないDNSにフォールバックするか、または解決処理が停止します。
DoHはWebトラフィックとポート443を共有しているため、HTTPSを無効にしない限り、このポートをブロックすることはできません。既知のDoHサーバーアドレスをブロックしているチームでも、新しいサーバーや自己ホスト型のサーバーが依然として通過してしまうため、リストの継続的なメンテナンスが必要となります。
一部のクライアントは、DoHサーバーに接続できない場合、暗号化されていないDNS経由で再試行を行います。ポリシーをテストしているエンジニアは、ポート53でのクエリを確認し、DoHが無効になっていると誤解する可能性があります。実際には、クライアントが単にフォールバックパスを使用しているだけなのです。