ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
AppとサーバのDNSセキュリティの改善
App内において、インターネットアドレスの基盤であるDNSの安全性を確保する方法に関する最新情報をご確認ください。DNSSECを使用してAppでのDNSレスポンスを認証し、Discovery of Designated Resolvers(DDR)を使用してDNS暗号化を自動的に有効化する方法を紹介します。
リソース
関連ビデオ
WWDC20
-
ダウンロード
こんにちは 「AppとサーバーのDNS セキュリティの改善」 へようこそ 私はQiaoyu Dengです このビデオでは DNSが しばしば安全でない理由と DNSSECとDDRによる 暗号化DNSを使って 保護する方法について ご説明します まず なぜDNSは 安全でないのかお話します
DNSはインターネットの 電話帳です 人間が読みやすく 覚えやすいドメイン名を 機械用に作られた IPアドレスに 変換しているのです TCP TLS QUICなどの 他のインターネット プロトコルは IPアドレスを持つことに 依拠するため すべてはDNSから始まります 現在 TLSは インターネット通信の 安全性を確保するために 広く利用されています それはいいのですが 基盤となるレイヤである DNSには セキュリティ上の 問題があります DNSは歴史的に 安全とは言えません 1983年当時 セキュリティを 考慮せずに設計されました それ以来 多数のDNS攻撃が 生み出されました 例えば DNSキャッシュ ポイズニングは 攻撃者がDNSリゾルバの欠陥を 利用して 不正なIPアドレスを キャッシュさせ クライアントが 悪意のある ホストに接続するよう 仕向けるものです これは DNSの脆弱性を ひとつ明らかにしました: 認証されないということです 従来のDNSクライアントは 回答を検証する方法がなく 簡単になりすましができます DNSスニッフィングも よくある攻撃で 攻撃者は クライアントとDNSサーバー 間の DNSトラフィックを 監視し クライアントの 履歴を収集します ユーザーのプライバシーに 関わる重大な問題です この攻撃が可能な理由は もともと DNSのトラフィックは 暗号化されていないからです DNSは その上に構築される プロトコルの安全な出発点と なるために 認証と暗号化の 両方が必要です DNSSECを使用して DNSレスポンスに 署名すると 認証が提供されます TLSとHTTPSを使用して DNSの解決を暗号化すると プライバシーが確保されます 次に DNSSECについて お話しします DNSSECは IETFが策定した 拡張仕様のスイートです すでに 多くのDNSサービス プロバイダが対応済みですが クライアント側の対応は まだこれからです iOS 16とmacOS Venturaが クライアント側の DNSSEC検証に対応しています DNSSECは デジタル署名の 追加によってデータの認証を 保証するので データの整合性を保護します 答えが存在しないときに 存在を否定することを 認証するのです また 暗号による 認証も可能です DNSSECは 応答に 署名を添付することで データの整合性を保護します 攻撃者によって応答が 改ざんされた場合 改ざんされたデータの署名は 元の署名と一致しません クライアントは 変更された 応答を検出し 破棄できます また DNSSECは NSECレコードのような 特殊なDNSレコードを 用いることで ゾーン内のレコードの 存在や非存在を主張します NSECレコードは 次のレコード名が何か アルファベット順に 安全に 教えてくれます リストアップされた名前は 存在するものであり されていない名前は 存在しないものとみなします 例えば ここに3つの NSECレコードがあります レコードセットから ゾーンorgには A.org C.org E.orgの 3つのレコード名 しかないとわかります 「A.orgは存在しない」と いう攻撃者がいた場合 クライアントは この攻撃を検知できます A.orgは 最初のNSECレコードに 載っているため 存在します 同様に 攻撃者が 「D.orgが存在する」と 言った場合 2つ目の NSECレコードによれば D.orgはC.orgとE.orgの 間にあり 2つの名前の間には 名前が存在しないため クライアントも攻撃を 検知できます DNSSECは 信頼の連鎖の確立 でレコードを認証します これは その一例です あるデバイスが DNSSEC検証を有効にして www.example.org を 解決したがっています IPアドレス 署名 鍵を 要求する クエリを送信します その応答により IPアドレスから 鍵番号1までの 信頼関係が構築できます そしてクライアントは 親ゾーンのorgに問い合わせ 鍵番号1を認証できる レコードを要求することで 鍵番号1から鍵番号2への 信頼関係を構築します そのため デバイスは ルートに到達するまで このプロセスを 再帰的に繰り返します ここで 図中の鍵番号3である ルートキーが信頼できれば IPアドレスから 鍵番号3までの信頼関係が 認証できます ルートキーのハッシュは 常にデバイスに 安全に保存されます DNSSECでは ルートトラスト アンカーと呼ばれています 鍵番号3のハッシュが プリインストール済みの アンカーと一致すれば 安全に信頼の連鎖が 構築できます トラストチェーンにより これで www.example.orgの IPアドレスは認証されます AppでDNSSEC検証を 必要とする場合 必要なことは次の通りです まずは ドメインのIPv6対応 IPv6専用環境では IPv4専用アドレスは 合成IPv6アドレスに 変換されます ドメインが署名されている 場合 合成されたアドレスは DNSSECの検証を通過できず DNSSECを有効にしても 到達不可能となるので ドメインがIPv6に対応する ことを確認してください DNSサービスプロバイダが DNSSECでドメインに署名して いることを確認してください ドメインに署名せず AppでDNSSECを有効にすると 署名していないドメインの 認証を試みるため DNSトラフィックが増加し 解決が長引きます 対応するインフラサポートが 完了したら Appに DNSSECを採用するために 必要なコードがこちらです NSURLSession クライアントであれば URLリクエストに DNSSEC検証を要求できます これはその一例です まず デフォルトの セッション構成を作成します それから DNSSECの 検証を要求します 次に 変更した構成で セッションを作成します このセッションから 作成したすべての URLリクエストに対して DNSSECを有効にします セッション全体でDNSSECを 有効にしたくない場合 リクエストレベルで 行うこともできます まず DNSSECの検証を 無効にした デフォルト設定の セッションを作成します その後 リクエストで有効にします このセッションタスクは DNSSECの検証の 完了時のみ 開始されるようになります Network.frameworkの クライアントであれば 接続にDNSSECの検証を 要求することも可能です まず パラメータ オブジェクトを作成する際に DNSSECの検証を要求します 次に parameters オブジェクトで NWConnectionを作成します これで 接続を開始すると DNSSECの検証が完了し 検証済みのIPアドレスへの 接続が確立したときのみ 準備完了状態に移行します DNSSECが有効な場合 検証されたアドレスのみ 接続を確立するために 使用します HTTPSでは エラーは APIを通して報告されます DNSSECでは検証に失敗しても エラーは返しません バリデーションに失敗した 応答を受け取ることは 何も受け取らないも同然です レスポンスを改ざんする DNSプロバイダがいる場合 アドレスは認証チェックを 通過しないため そのまま破棄されます DNSプロバイダが 応答を改ざんしていない 新しいネットワークに デバイスが 参加すると 検証は再び進展し 解決は自動的に 正常に戻ります
DNSSECが失敗しうるケースを いくつか紹介します オリジナルのDNS レスポンスが変更された場合 不一致の署名はDNSSEC チェックを通過せず 検証失敗の原因となります デバイスがプリインストール されたトラストアンカーに 到達できず トラスト チェーンを確立できない場合 DNSSEC有効化ビットを 搭載する DNS over TCPや EDNS0 オプションなど DNSSECが必要とする プロトコルに ネットワークが対応しない 場合も失敗します 署名済みドメインが IPv6に対応していない場合 インターネットサービス プロバイダから提供される 合成されたIPv6アドレスは 検証に失敗します つまり DNSSECでDNS レスポンスを認証する 方法ですが 暗号化されていなければ ネットワーク上の誰でも 見ることができるのです 次に DDRでDNSの暗号化を 自動的に有効にする方法を ご説明します
iOS 14とmacOS Big Surでは プライバシー保護に役立つ 暗号化DNSを導入しました AppのNEDNSSettings Managerや プロファイルの DNSSettingsを使用して 暗号化DNSをシステム全体に 手動で設定できます また NWParametersの PrivacyContextで Appの暗号化DNSを オプトインできます 詳しくは「暗号化DNSの 有効か」をご確認ください iOS 16とmacOS Venturaの 新機能として 暗号化DNSが自動的に 使用できるようになりました ネットワークがDiscovery of Designated Resolvers (DDR) に対応する場合 DNSクエリは 自動的に TLSまたはHTTPSを 使用します 暗号化されたDNSを使うには デバイスは リゾルバが TLSまたはHTTPSに対応するか 把握する必要があり 同様に ポートまたは URLパスの学習が 必要な場合もあります DHCPやルーター アドバタイズメントなどの一般的な 仕組みでは プレーンな IPアドレスしか提供しません DDRは Appleが他の業界 パートナーと協力して IETFで開発した 新しいプロトコルです DNSクライアントが 特別な DNSクエリを使用することで この必要な情報を知る 方法を提供します デバイスが新しい ネットワークに参加すると 「dns.resolver.arpa」に 対する サービスバインディング クエリを発行します DNSサーバーがDDRに 対応している場合 1つまたは複数の構成を 返信します デバイスはこの情報を もとに 指定された リゾルバとの暗号化された 接続を設定します 暗号化されていないリゾルバ のIPアドレスが 指定された リゾルバのTLS証明書に 含まれることを確認します 暗号化されていないリゾルバ とされたリゾルバが 同じエンティティに属していることを 確認するためです 問題なければ デバイスは デフォルトで暗号化された
DNSを使用します DDRは 一度に1つのネットワークに 適用されます 現在の ネットワークが暗号化DNSに 対応する場合のみ 自動的に 暗号化DNSを使用します DNSサーバーのIPアドレスが プライベートIPアドレスだと DDRは動作しないことにも 注意してください このようなIPアドレスは 所有権が確認できないため TLS証明書では 許可されないからです iOS 16および macOS Venturaでは NEDNSSettingsManagerまたは DNSSettingsプロファイルを 使用して 設定に暗号化DNSを 使用する際に クライアント認証を指定する 機能にも対応します
クライアント認証で アクセスを許可する前に サーバーがクライアントを 認証すべき企業環境では 暗号化されたDNSサーバーが 使用できます NEDNSSettingsのidentity Referenceプロパティで クライアント証明書が 設定できるようになりました VPN用のクライアント証明書 と同じような動作をします これらは DNS over TLSと DNS over HTTPSの 両方に適用できます これがDNSのセキュリティ 確保への道筋です DNSSECでドメインに署名し IPアドレスを認証するために AppでDNSSEC検証を 要求します ネットワーク上のDDRを 有効にすることで クライアントが自動的に 暗号化DNSに切り替わり ユーザーのプライバシーを 保護できます より良いアクセス コントロールが必要な 企業では クライアント 認証を採用します 今後 より安心できる DNSの基盤作りを お手伝いいただけると 期待しています ご視聴 ありがとうございました!
-
-
9:01 - Require DNSSEC validation in your URL request at session level
let configuration = URLSessionConfiguration.default configuration.requiresDNSSECValidation = true let session = URLSession(configuration: configuration)
-
9:38 - Require DNSSEC validation in your URL request at request level
var request = URLRequest(url: URL(string: "https://www.example.org")!) request.requiresDNSSECValidation = true let (data, response) = try await URLSession.shared.data(for: request)
-
10:08 - Require DNSSEC validation in your network request
let parameters = NWParameters.tls parameters.requiresDNSSECValidation = true let connection = NWConnection(host: "www.example.org", port: .https, using: parameters)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。