ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
暗号化DNSの有効化
App内でWebにアクセスする場合は、そのプライバシーが非常に重要になります。当社のプラットフォーム全体で暗号化DNSを活用することによってその情報を守り、App内でプライベートかつ安全な接続性を提供しましょう。システムのDNS設定を使用して暗号化サーバに接続する、または標準的なネットワークAPIを使用してApp内で暗号化DNSを有効化する方法をご紹介します。 暗号化DNSの有効化は、Appで顧客のプライバシーを保護し、より安全で好ましいエクスペリエンスを提供するためのもう1つの方法でもあります。
リソース
関連ビデオ
WWDC23
WWDC22
WWDC20
-
ダウンロード
ようこそWWDCへ “暗号化DNSの有効化” トミー・パウリです プライバシー保護にDNS暗号化は必須です Appleプラットフォームでは― デベロッパ向けにこの機能が ネイティブサポートされています パブリックDNSサービス提供のために 暗号化したサーバーを使用し アプリや構成プロファイルが作成できます
アプリ内の特定接続に DNS暗号化のオプトインも可能です DNS暗号化の使用説明に入る前に DNSとプライバシーの重要性を話します DNSとはドメインネームシステム サファリのWebページアドレスを IPアドレスに変換するシステムです インターネットを使用する度に 使用しています アプリ起動時に システムがクエリという質問をし アドレス名に置き換えます 質問はローカルネットワークの DNSサーバーに送られます では プライバシーとの関係性は? 通常 DNSの質問と回答は 未暗号化のUDPで送受信されるので 検索ページがネットワーク上の 外部デバイスに知られる可能性があります 偽装すら可能なのです ローカルネットワークのDNSリゾルバーの 信頼性が低いことも問題で 公共のWi-Fiにアクセスした場合 追跡やブロックされる可能性もあります DNSを暗号化すれば どうでしょう?
暗号を使い DNSの質問と回答を保護するのです
ネットワークを信頼できなければ 信頼性の高いDNSサーバーに 質問することもできます
今年 Appleプラットフォームは DNS暗号化のサポートを開始しました 保護用のプロトコルは2つで DoTと呼ばれるDNS over TLSと DoHと呼ばれるDNS over HTTPSです 両者ともTLSを使用し DNSメッセージを暗号化します さらに DoHはHTTPを使用し パフォーマンスを改善します DNS暗号化には 2通りの方法があります デフォルトのリゾルバーとしてすべてのアプリに 1つのDNSサーバーを選択します そうすれば パブリックDNSサーバーの提供のため システムを設定する NetworkExtensionアプリを作成できます
もし MDMを使ってデバイス上の エンタープライズ設定を行うのであれば プロファイルをプッシュダウンし ネットワークに対し暗号化を設定できます もう1つは アプリから 直接オプトインする方法です アプリに対してだけでも暗号化を望むなら 特定のサーバーを選択し 選んだアプリの接続に使用できます
システム全体のDNS設定を説明します NEDNSSettingsManagerを使用する NetworkExtensionアプリか DNSSettingsペイロードを含む MDMプロファイルで設定します
どちらでも 同じ内容を指定することができます
サーバーとプロトコルを特定する DNSサーバーコンフィグレーションと 設定のタイミングをカスタマイズする ネットワークルールのセットです
NetworkExtensionで サーバーコンフィグレーションを指定しましょう
NEDNSSettingsManagerオブジェクトで 既存のコンフィグレーションでロードします
そうすれば DoHかDoTサーバーの いずれかの設定を 定義することができます ここではDoHを使用します オプションのサーバーのIPアドレスと 必須のサーバーURLを提供できます これを“dnsSettings”プロパティ内に設定し
saveToPreferencesをコールし コンフィグレーションをシステムに適用します これでユーザーはDNSサーバーを 設定アプリ内で有効にできます
次はコンフィグレーションの ネットワークルールに移りましょう ネットワークルールの指定により 別のネットワークとの互換性を保証します 暗号化はプライバシー保護に最適ですが パブリックDNSサーバはローカルネットワーク上 だけのプライベートネームを解決しません つまり エンタープライズWi-Fiネットワーク上の DNSサーバーのみが 従業員がアクセスする プライベートネームを解決します 互換性の中には 自動的に処理されるものもあり ネットワークルールを 指定する必要はありません カフェなどのキャプティブネットワークは 自動的に例外として検出されます 同様にVPNがアクティブだと VPNトンネル内での解決に VPNのDNS設定が使用されます システム全体の設定ではありません
ただし エンタープライズWi-Fiネットワーク上の プライベートネームを処理するには ネットワークルールの設定が必要です ネットワークルールは Wi-Fiやセルラー特定のWi-Fi SSIDのような ネットワークタイプの挙動を定義します 適合済みのネットワークでは DNS設定を完全に無効にするか 特定のプライベートドメインに対してのみ 例外を与えられます これはアプリ内で ネットワークルールを設定する方法で ユーザーは これらのルール設定が可能となります
社内ネットワークの例外作成のため 特定SSIDでWi-Fiのルールを定義し 接続ルールの一覧がドメイン 今回はenterprise.example.netを定義します DNS設定を使ってはいけません
DNS設定は プライベートエンタープライズドメインを除いて すべてに対し 社内Wi-Fiネットワークで使用可能です
また Disconnectルールでネットワークの カテゴリー全体で設定を無効にできます ここでは セルラーネットワーク上での DNS設定を無効にしています
そして常に キャッチオールである必要があります ここで Connectルールを使って 設定がデフォルトでオンである確認し
ネットワークルールを順序付きリストとして 保存してからコンフィグレーションも保存します
DNS設定アプリの作動を 確認する準備が完了しました
これはシステム全体のDNS設定を 設定する事例プロジェクトです アプリ内でNEDNSSettingsManagerを使います ここでサーバーコンフィグレーションが定義でき
ユーザープリファレンスに基づいて ネットワークルールの設定もできます このアプリはセルラーとWi-Fi上で 有効と無効の両方をサポートします
アプリ実行前にXcodeで DNS設定機能が有効か確認します 確認のため プロジェクト設定の―
Signing and Capabilitiesに行きます
DNS設定機能は NetworkExtension機能の1つです システムがサポートする プロトコルを設定するので 拡張ポイントを実行する必要はなく アプリをビルドするだけです
アプリを実行しましょう
コンフィグレーションがインストールされますが 即座にアクティブにはなりません
Wi-Fiやセルラーで 設定を有効か無効にできて 設定アプリ内でコンフィグレーション全体を 有効にします
“設定”に行きます
“一般”に行き―
“VPN接続”を確認します ここがDNSのセクションです インストールが完了するとアプリが表示され
設定を選択すると システム全体に自動的に適用されます アプリに戻ると コンフィグレーションが アクティブになっています この時点で DNS設定はシステム上の すべてのアプリに適用されます ネットワークによっては ポリシーで 暗号化サーバーをブロックするものもあり クエリを見て トラフィックを フィルタリングする可能性があります これが発生すると Wi-Fiネットワークに プライバシー警告が付きます プライバシー侵害の前に アプリの接続が失敗となります システム全体ではなく アプリ内でDNS暗号化を使いたい場合は アプリ全体や特定の接続に対して 有効にできます この方法は どのAPIでも機能します URLSessionタスクや Networkフレームワーク接続 それにgetaddrinfoのような POSIX APIsでも機能します Networkフレームワークで DNS暗号化を有効にします PrivacyContextでオプションを選択し DNS設定を共有する接続ごとに 1つのPrivacyContextを作成します
フォールバックを使用するために DNSサーバーコンフィグレーションを提供します システム全体のDNSコンフィグレーションが 優先されます そうでなければ アプリのフォールバックがキックインします DoHサーバーのURLを使用し
接続のパラメーターの作成に 以前 作成したPrivacyContextを設定します
接続を開始するとDNS暗号化が使われます
また 適正な接続が使われたか確認できます
接続できたら EstablishmentReportをリクエストすると
解決ステップの一覧があります 使用したプロトコルを確認できます HTTPSやTLSやUDPまたはTCPです キャッシュからの回答にはプロトコルのセットが 入っていない場合もあります アプリ全体を通して使用したいなら デフォルトのPrivacyContextを設定できます アプリで開始されたDNSの解決に コンフィグレーションが適用されます
それはURLSessionタスクか
getaddrinfoのような 下層APIを使用する場合です
DNS暗号化を試す準備はできました パブリックDNSサービスを提供するのであれば NEDNSSettingsManagerでアプリを書いて 設定を供給してください
エンタープライズMDMソリューションがあるなら プロファイルを使い有効にしてください アプリからオプトインする場合 Network フレームワークでPrivacyContextsを選択 詳細な情報は 次のセッションURLをご確認ください では さようなら
-
-
4:16 - Create a DNS configuration
// 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 } } }
-
6:40 - Apply network rules
// 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 ]
-
10:47 - Use encrypted DNS with NWConnection
// 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)
-
11:35 - Validate which DNS protocol was used
// Validate which DNS protocol was used import Network conn.requestEstablishmentReport(queue: .main) { report in if let report = report { for resolution in report.resolutions { switch resolution.dnsProtocol { case .https, .tls: print("Used encrypted DNS!”) case .udp, .tcp: print("Used unencrypted DNS") default: // Ignore unknown protocols } } }
-
12:07 - Use encrypted DNS for other APIs
// 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(...)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。