ハイライト
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ユーザーの現在のステータスが直接上書きされるのを避けるために、最初に既存の設定を読み取ります。NEDNSOverHTTPSSettingsDoH サーバーを定義します。サーバーの IP アドレスはオプションです。serverURLDoH 設定には必須です。- 設定を割り当てた後
dnsSettings、 電話saveToPreferencesそれをシステムに適用します。 - 保存後、ユーザーは設定アプリでこの DNS サーバーを有効にする必要もあります。
2. ネットワーク ルールを使用してプライベート ネットワークを処理する
パブリック 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 サーバーとそのアドレスを指します。setPrivacyContextDNS設定をフックしますNWParameters.tls。- その後
NWConnectionこの一連のパラメータを使用して作成されたホストが開始されると、ホスト名はこの一連の設定に従って解決されます。
4. 接続で使用される実際の DNS プロトコルを確認します。
接続の準備ができたら、 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 サービスを提供する場合は、次を使用できます。
NEDNSSettingsManagerDoH または DoT 設定の公開のみを担当するアプリを作成する。入り口はNEDNSOverHTTPSSettingsまたは対応する DoT 設定。保存後、ユーザーが設定アプリで有効化できるようにします。 -
エンタープライズ ネットワーク用のルール テンプレートの作成: ユーザーがよく使用するエンタープライズ Wi-Fi SSID、プライベート ドメイン名、セルラー ネットワーク ポリシーをインターフェイス オプションに追加します。書く
NEOnDemandRuleEvaluateConnection、NEEvaluateConnectionRule、NEOnDemandRuleDisconnectそして隠されたものNEOnDemandRuleConnect最下層で。 -
機密性の高い接続にアプリ内 DNS ポリシーのレイヤーを追加: 専用を作成します
NWParameters.PrivacyContextログイン、支払い、同期などの接続用。使用requireEncryptedNameResolution(true, fallbackResolver:)信頼できる DoH サーバーを指定し、コンテキストをNWParameters.tls。 -
接続診断ページの作成: リクエスト
EstablishmentReport接続の準備ができたら、dnsProtocol毎回解析されます。このページには、デバイスが実際に DNS を暗号化しているかどうかを確認するために、HTTPS、TLS、UDP、TCP などのプロトコルのステータスのみが表示されます。 -
デフォルトの PrivacyContext を古いネットワーク層に接続します: 両方がある場合
URLSessionそしてgetaddrinfoプロジェクト内で設定できますNWParameters.PrivacyContext.defaultまず、同じフォールバック設定セットをアプリの DNS 解決に使用できるようにします。
関連セッション
- 最新のネットワーキングでパフォーマンスとセキュリティを向上: IPv6、HTTP/2、TLS 1.3、暗号化された DNS をカバーする、同じトピックに基づく最新のネットワーキング API の概要。
- アプリでローカル ネットワーク プライバシーをサポート: この記事と同様に、ネットワーク アクセスにおけるプライバシーの透明性に注意を払い、iOS 14 のローカル ネットワークのアクセス許可について説明します。
- 制限付きネットワーク用のローカル プッシュ接続を構築する: 制限付きネットワークでのローカル プッシュ接続については、NetworkExtension 関連の構成と合わせて読むのが適しています。
- プライバシーの向上による信頼の構築: プラットフォームのプライバシー機能の観点からユーザーの信頼を構築する方法の説明は、この記事の暗号化 DNS の上位レベルの背景として使用できます。
コメント
GitHub Issues · utterances