WWDC Quick Look 💓 By SwiftGGTeam
Enable encrypted DNS

Enable encrypted DNS

元の動画を見る

ハイライト

Apple プラットフォームは、DNS over TLS と DNS over HTTPS をネイティブにサポートしています。開発者は、NEDNSSettingsManager を使用してシステム レベルの DNS 構成を公開したり、Network.framework の PrivacyContext を使用してアプリ接続用の暗号化された DNS を指定したりできます。

主要内容

アプリが Web サイトにアクセスすると、システムはまずドメイン名をサーバー アドレスに解決します。この問題は通常、ローカル ネットワーク上に構成された DNS サーバーに対処されます。リスクは言葉どおりに非常に直接的に述べられています。DNS の質問と回答は通常、暗号化されていない UDP を使用します。同じネットワーク上の他のデバイスは、あなたがチェックした名前を確認することができ、返された結果に干渉する可能性もあります。

もう 1 つの問題は、ローカル パーサー自体に起因します。公衆 Wi-Fi に接続すると、インターネットの使用状況が追跡またはブロックされる場合があります。暗号化 DNS の機能は、暗号化を使用して DNS の質問と回答を保護することです。現在のネットワークを信頼できない場合は、信頼できる DNS サーバーにクエリを送信することもできます。

2020 年以降、Apple プラットフォームは、DNS over TLS (DoT) と DNS over HTTPS (DoH) の 2 つのプロトコルをネイティブにサポートします。どちらも TLS を使用して DNS メッセージを暗号化し、DoH はパフォーマンスを向上させるために HTTP も使用します。

このセッションでは 2 つのアクセス パスが提供されます。 1 つ目はシステム レベルです。DNS サービス プロバイダーが NetworkExtension アプリを作成することも、企業が MDM 経由で DNSSettings ペイロードを発行して、単一の暗号化 DNS サーバーをシステムのデフォルト リゾルバーとして構成することもできます。 2 つ目はアプリ レベルです。開発者はアプリ内の一部またはすべての接続に対して暗号化 DNS を有効にすることができます。

システムレベルの構成では、ネットワークの互換性も扱います。企業 Wi-Fi のプライベート ドメイン名は、企業の DNS サーバーによってのみ解決できます。 VPN とキャプティブ ネットワークには独自の解決ルールがあります。 Session の焦点は、暗号化を有効にすることだけではなく、ネットワーク ルールを使用して、いつ有効にするか、いつ例外を行うかを指定することにもあります。

詳細

1. システムレベルの DNS 構成を作成する

(04:16)

システム DNS 設定は、NetworkExtension アプリで次を使用して構成できます。 NEDNSSettingsManager、または DNSSettings ペイロードを含む MDM プロファイルによって。同じことを表す 2 つの方法: DNS サーバー構成と、構成がいつ有効になるかを決定するネットワーク ルールです。

以下は、セッション内の DoH 設定のフラグメントです。

// Create a DNS configuration

import NetworkExtension

NEDNSSettingsManager.shared().loadFromPreferences { loadError in
    if let loadError = loadError {
        // ...handle error...
        return
    }
    let dohSettings = NEDNSOverHTTPSSettings(servers: [ "2001:db8::2" ])
    dohSettings.serverURL = URL(string: "https://dnsserver.example.net/dns-query")
    NEDNSSettingsManager.shared().dnsSettings = dohSettings
    NEDNSSettingsManager.shared().saveToPreferences { saveError in
        if let saveError = saveError {
            // ...handle error...
            return
        }
    }
}

キーポイント:

  • loadFromPreferences ユーザーの現在のステータスが直接上書きされるのを避けるために、最初に既存の設定を読み取ります。
  • NEDNSOverHTTPSSettings DoH サーバーを定義します。サーバーの IP アドレスはオプションです。
  • serverURL DoH 設定には必須です。
  • 設定を割り当てた後 dnsSettings、 電話 saveToPreferences それをシステムに適用します。
  • 保存後、ユーザーは設定アプリでこの DNS サーバーを有効にする必要もあります。

2. ネットワーク ルールを使用してプライベート ネットワークを処理する

(05:1206:40)

パブリック DNS サーバーは、ローカル ネットワーク上にのみ存在するプライベート名を解決できません。 Session が挙げた例は企業 Wi-Fi です。従業員がアクセスする一部のプライベート ドメイン名は、企業ネットワーク内の DNS サーバーによってのみ認識されます。

Apple はすでに、両方のタイプの互換性シナリオを自動的に処理しています。例外は、コーヒー ショップ ネットワークなどのキャプティブ ネットワークにログインする場合です。 VPN がアクティブ化されると、VPN トンネル内の解決には VPN の DNS 設定が使用されます。企業のプライベート ドメイン名などのルールでは、アプリ自体がネットワーク ルールを構成する必要があります。

// Apply network rules

let workWiFi = NEOnDemandRuleEvaluateConnection()
workWiFi.interfaceTypeMatch = .wiFi
workWiFi.ssidMatch = ["MyWorkWiFi"]
workWiFi.connectionRules =
    [ NEEvaluateConnectionRule(matchDomains: ["enterprise.example.net"],
                               andAction: .neverConnect) ]

let disableOnCell = NEOnDemandRuleDisconnect()
disableOnCell.interfaceTypeMatch = .cellular

let enableByDefault = NEOnDemandRuleConnect()

NEDNSSettingsManager.shared().onDemandRules = [
    workWiFi,
    disableOnCell,
    enableByDefault
]

キーポイント:

  • NEOnDemandRuleEvaluateConnection ルールは、指定されたネットワーク タイプと SSID のみに一致します。
  • NEEvaluateConnectionRule 除外します enterprise.example.net 暗号化されたDNS設定から。
  • NEOnDemandRuleDisconnect 携帯電話ネットワーク上でこの一連の DNS 設定をオフにします。
  • NEOnDemandRuleConnect は、DNS 設定をデフォルトで有効にするキャッチオール ルールです。
  • onDemandRules は順序付きリストであるため、前のルールが最初に照合されます。

3. アプリ接続で暗号化された DNS を有効にする

(10:47)

システム全体で使用できる DNS サービスを提供しない場合は、アプリ内でのみ暗号化 DNS を有効にすることもできます。セッションは、このパスが適用されることを明示的に示しています URLSessionTask、ネットワーク フレームワーク接続、および POSIX API など getaddrinfo

ネットワークフレームワークへの入り口は、 PrivacyContext。 1つ PrivacyContext DNS 設定を共有する接続のセットごとに使用されます。暗号化された解決が必要な場合は、フォールバック DNS サーバー構成を渡すことができます。システムにすでに DNS 構成がある場合は、システムレベルの構成が優先されます。それ以外の場合は、アプリのフォールバックが有効になります。

// Use encrypted DNS with NWConnection

import Network

let privacyContext = NWParameters.PrivacyContext(description: "EncryptedDNS")
if let url = URL(string: "https://dnsserver.example.net/dns-query") {
    let address = NWEndpoint.hostPort(host: "2001:db8::2", port: 443)
    privacyContext.requireEncryptedNameResolution(true,
        fallbackResolver: .https(url, serverAddresses: [ address ]))
}

let tlsParams = NWParameters.tls
tlsParams.setPrivacyContext(privacyContext)

let conn = NWConnection(host: "www.example.com", port: 443, using: tlsParams)
conn.start(queue: .main)

キーポイント:

  • NWParameters.PrivacyContext 一連の DNS プライバシー設定を保持します。
  • requireEncryptedNameResolution(true, fallbackResolver:) 暗号化された名前解決を使用する接続が必要です。
  • .https(url, serverAddresses:) DoH サーバーとそのアドレスを指します。
  • setPrivacyContext DNS設定をフックします NWParameters.tls
  • その後 NWConnection この一連のパラメータを使用して作成されたホストが開始されると、ホスト名はこの一連の設定に従って解決されます。

4. 接続で使用される実際の DNS プロトコルを確認します。

(11:3512:07)

接続の準備ができたら、 EstablishmentReport。レポートには一連の解決手順があり、それぞれの手順で DNS プロトコル (HTTPS、TLS、UDP、または TCP) が記録されます。また、Transcript は、キャッシュからの応答にプロトコル フィールドがない可能性があることも警告します。

アプリ全体で同じ設定セットを使用する場合は、デフォルトの設定を構成できます。 PrivacyContext。これは、アプリによって開始されるすべての DNS 解決に影響します。 URLSessionTask そして getaddrinfo

// Use encrypted DNS for other APIs

import Network

if let url = URL(string: "https://dnsserver.example.net/dns-query") {
    let address = NWEndpoint.hostPort(host: "2001:db8::2", port: 443)
    NWParameters.PrivacyContext.default.requireEncryptedNameResolution(true,
        fallbackResolver: .https(url, serverAddresses: [ address ]))
}

let task = URLSession.shared.dataTask(with: ...)
task.resume()

getaddrinfo(...)

キーポイント:

  • NWParameters.PrivacyContext.default は、アプリレベルのデフォルトの DNS プライバシー設定です。
  • デフォルトのコンテキストを設定した後、解析が開始されます。 URLSession この構成セットを使用します。
  • getaddrinfo 低レベル API の設定も、この設定セットの影響を受けます。
  • ネットワークがポリシーによって暗号化された DNS をブロックしている場合、Wi-Fi にはプライバシーの警告がマークされ、プライバシーを侵害する解決パスは使用されず、アプリの接続は失敗します。

重要ポイント

  • DNS サービス プロバイダー構成アプリを作成します: パブリック DNS サービスを提供する場合は、次を使用できます。 NEDNSSettingsManager DoH または DoT 設定の公開のみを担当するアプリを作成する。入り口は NEDNSOverHTTPSSettings または対応する DoT 設定。保存後、ユーザーが設定アプリで有効化できるようにします。

  • エンタープライズ ネットワーク用のルール テンプレートの作成: ユーザーがよく使用するエンタープライズ Wi-Fi SSID、プライベート ドメイン名、セルラー ネットワーク ポリシーをインターフェイス オプションに追加します。書く NEOnDemandRuleEvaluateConnectionNEEvaluateConnectionRuleNEOnDemandRuleDisconnect そして隠されたもの NEOnDemandRuleConnect 最下層で。

  • 機密性の高い接続にアプリ内 DNS ポリシーのレイヤーを追加: 専用を作成します NWParameters.PrivacyContext ログイン、支払い、同期などの接続用。使用 requireEncryptedNameResolution(true, fallbackResolver:) 信頼できる DoH サーバーを指定し、コンテキストを NWParameters.tls

  • 接続診断ページの作成: リクエスト EstablishmentReport 接続の準備ができたら、 dnsProtocol 毎回解析されます。このページには、デバイスが実際に DNS を暗号化しているかどうかを確認するために、HTTPS、TLS、UDP、TCP などのプロトコルのステータスのみが表示されます。

  • デフォルトの PrivacyContext を古いネットワーク層に接続します: 両方がある場合 URLSession そして getaddrinfo プロジェクト内で設定できます NWParameters.PrivacyContext.default まず、同じフォールバック設定セットをアプリの DNS 解決に使用できるようにします。

関連セッション

コメント

GitHub Issues · utterances