App Transport Security設定の最適化

Appleでは、プライバシーは基本的人権であると考えています。公共のWi-Fiホットスポットに接続する際、近くの誰かが接続を傍受して暗号化されていないデータにアクセスする危険性などを心配せずに、Appを使用してデータを送受信できることをユーザーは期待します。無害なように見えるデータを暗号化しないないままにしてしまうことで、 ネットワーク上の誰かによるスヌーピングやフィンガープリンティングにさらされてしまう可能性があります.

トランスポート・レイヤー・セキュリティ(TLS)は暗号化を使用して接続を詮索好きな目から保護し、URLSessionはデフォルトでApp Transport Security(ATS)を使用した強力なTLS接続を提供します.

TLSをサポートしていない古いサーバに接続する必要がある場合、Appに対しATSの例外を追加することできます。 理想的には、この例外はセキュアでない接続が必要となる特定のドメインまたはフレームワークにのみ適用し、リクエストに対するこれらの例外の適用は最小限に留める必要があります。Appを機能させるためにどうしても必要な場合を除いて、暗号化されていないデータを送信しないようにしてください。

必要となるATSの例外の特定

App、またApp内で利用されているデータを可能な限りセキュアにするために、現時点でセキュアでない接続をしているのかどうかをまず把握することが重要です。

その確認のためには、アクティブなATSの例外をすべて無効にするためにInfo.plistの値を「NO」に設定します。そこから、Appを開いたり、ユニットテストを走らせます。Appがセキュアでない接続を行った場合、それぞれの接続に対しXcode上でランタイムエラーが発生します。

Preventing Insecure Network Connections

Appがセキュアでない接続を行っている場合、それらの接続を削除するためにいくつかの手順が必要となります。

サーバをセキュアにする

Appが管理下にあるサーバに接続する場合は、サーバがセキュアな接続をサポートしていることを確認してください。TLS証明書が必要となります。ホスティングサービスを使用している場合は、ホスティングサービスが証明書を提供しているかどうかを確認し、その証明書が「Preventing Insecure Network Connections(セキュアでないネットワーク接続を防ぐ) 」で詳述されている要件を満たしていることを確認してください。

HTTPSの利用

Appが自身が管理下にないサーバに接続する場合は、常にHTTPではなくHTTPS経由でそれらのサーバに接続するようにしてください。サーバがHTTPSをサポートしているかどうかは、URL文字列の「http://」を「https://」に変更し、そのWebサイトからデータをロードするだけで識別可能です。ブラウザで手動で確認するか、次のコードの実行による確認も可能です:

let request = URLRequest(url: URL(string: “https://www.example.com”)!)

多くのWebサイトは、HTTP接続をHTTPSにリダイレクトします。つまり、最初からHTTPS経由で接続することによって、Appのパフォーマンスが向上する場合があります。 ただし、ウェブサイトがHTTPSを使用している場合であっても、それがATS互換であることを意味することではないことに注意してください。 たとえば、古いバージョンのTLSを使用しているような場合、Safariでは「この接続はプライベートではありません」という警告が表示されます。

不要な例外の削除 ATSランタイムエラーが発生しなくなったWebサイトでは、例外を削除することが可能です。 Info.plistの「App Transport Security Settings(App Transport Security設定)」にて、「-」アイコンをクリックして、該当する例外を削除します。

例外ドメインの設定

Appが特定のドメインに対し依然としてセキュアでない接続を行わなければならない場合、該当ドメインに対しATSの例外を設定することが可能です。

例外ドメインをAppのInfo.plistに直接追加するか、プロジェクトエディタで追加します。 「Signing & Capabilities(署名と機能)」に移動し、「+ Capability」オプションを選択します。

リストからの「App Transport Security Exception(App Transport Securityの例外)」を選択します。

これにより、Capabilitiesに「App Transport Security Exception」のセクションが追加されます。

  • 「+」アイコンをクリックし、Appがセキュアでない接続を行う必要のあるドメインを追加します。 HTTP経由でそのドメインとそのサブドメインに接続するためのドメインを入力します。 これらの設定を変更する必要がある場合は、Info.plistに直接変更を加えることができます。

フレームワークとクラスに対する例外設定

まれに、不明なドメインに対しセキュアでない接続が必要となる場合があります。 この場合、検討可能なオプションとして、2つのより広範囲な例外が存在します。

AppがWKWebViewを介してセキュアでない接続が必要となる場合は、Info.plistに「Allows Arbitrary Loads In Web Content(Webコンテンツの任意ロードを許可)」を追加します:

AppがAVFoundationを介してセキュアでない接続が必要となる場合は、「Allows Arbitrary Loads for Media(メディアの任意ロードを許可)」を追加します。

これらの例外により、AppがAVFoundationまたはWKWebViewを介する場合でのみセキュアでない接続を行い、Appのその他の部分はATSによって保護された状態となります。 ただし、これらの例外は比較的広範囲な例外となるため、App内でAVFoundationまたはWKWebViewを使用する全ての箇所において、傍受や検閲などが可能となってしまうセキュアでない接続を行うことを意味します。

Appのセキュアな状態の維持

人々はAppを信頼したいと考えます。ATSは、データの転送中に責任を持ってデータを処理することにより、その信頼を構築するのに役立ちます。 ATSを最大限に活用するには:

  • AppがHTTPではなくHTTPS経由でサーバに接続していることを確認してください。
  • ATSの例外をAppに可能なかぎり最適化させて形で適用してください。 適用している例外を定期的に確認し、サーバがHTTPSのサポートを開始したかどうか、あるいはAppにおけるセキュアでないサーバへの接続が不要になったかどうかを確認してください。

リソース

NSAppTransportSecurity

Preventing Insecure Network Connections

NSExceptionDomains

NSAllowsArbitraryLoadsForMedia

NSAllowsArbitraryLoadsInWebContent

WKWebView

Learn more about App Transport Security on the Developer Forums