MASTG-KNOW-0071 iOS App Transport Security
iOS 9 以降、Apple は App Transport Security (ATS) を導入しました。これは URL Loading System を使用して行われる接続 (通常 URLSession
経由) に対して常に HTTPS を使うようにオペレーティングシステムが強制する一連のセキュリティチェックです。アプリは Apple のベストプラクティス に従って、適切に接続を保護すべきです。
ATS はデフォルトのサーバー信頼性評価を行い、最低限のセキュリティ要件を要求します。
デフォルトのサーバー信頼性評価:
アプリがリモートサーバーに接続する際、サーバーは X.509 デジタル証明書を使用してそのアイデンティティを提供します。ATS のデフォルトのサーバー信頼性評価には以下に示す証明書の妥当性確認も含まれています。
有効期限が切れていないこと。
サーバーの DNS 名と一致する名前を持っていること。
有効な (改竄されていない) デジタル署名を持ち、オペレーティングシステムの Trust Store に含まれる信頼できる認証局 (Certificate Authority, CA) にさかのぼることができるか、ユーザーもしくはシステム管理者がクライアントにインストールしたものであること。
接続に必要な最低限のセキュリティ要件:
さらに ATS は以下に示す一連の 最低限のセキュリティ要件 を満たさない接続をブロックします。
TLS バージョン 1.2 以上。
AES-128 または AES-256 でのデータ暗号化。
証明書は RSA 鍵 (2048 ビット以上)、ECC 鍵 (256 ビット以上) で署名されていなければならない。
証明書のフィンガープリントは SHA-256 以上を使用しなければならない。
リンクは Elliptic Curve Diffie-Hellman Ephemeral (ECDHE) 鍵交換による Perfect Forward Secrecy (PFS) をサポートしなければならない。
証明書の有効性チェック:
Apple によると、「TLS 証明書の信頼ステータスの評価は RFC 5280 で規定されているように確立された業界標準に従って行われ、RFC 6962 (Certificate Transparency) などの新しい標準も取り入れられています。iOS 11 以降では、Apple デバイスは定期的に失効した証明書と制約のある証明書の最新リストで更新されます。このリストは Apple が信頼するビルトインの各ルート認証局およびその下位の CA 発行者が発行する証明書失効リスト (CRL) から集約されています。このリストには Apple の裁量で他の制約が含まれていることもあります。この情報はネットワーク API 関数を使用してセキュア接続を行う際に参照されます。CA から失効した証明書が多すぎて個別にリストアップできない場合、信頼性評価では代わりにオンライン証明書ステータス応答 (Online Certificate Status Response, OCSP) が必要となり、応答が得られない場合には信頼性評価は失敗します。」
ATS が適用されないのはどのような場合か?
低レベル API を使用する場合: ATS は URLSession に含まれる URL Loading System とその上にレイヤー化された API にのみ適用されます。低レベル API (BSD ソケットなど) を使用するアプリには適用されません。その低レベル API 上に TLS を実装しているものも同様です (アーカイブされた Apple Developer ドキュメントの "Using ATS in Apple Frameworks" セクションを参照してください) 。
IP アドレス、非修飾ドメイン名、ローカルホストに接続する場合: ATS はパブリックホスト名に対して行われた接続にのみ適用されます (アーカイブされた Apple Developer ドキュメントの "Availability of ATS for Remote and Local Connections" セクションを参照してください) 。システムは以下に示す接続に対して ATS 保護を提供しません。
インターネットプロトコル (Internet Protocol, IP) アドレス
非修飾ホスト名
.local トップレベルドメイン (Top-Level Domain, TLD) を使用するローカルホスト
ATS 例外を含む場合: アプリが ATS 互換 API を使用する際、ATS 例外 を使用して特定のシナリオで ATS を無効にできます。
さらに学ぶために:
ATS 例外
ATS の制限は Info.plist
ファイルの NSAppTransportSecurity
キーに例外を設定することで無効にできます。これらの例外には以下を適用できます。
セキュアではない接続 (HTTP) の許可
最小 TLS バージョンの引き下げ
Perfect Forward Secrecy (PFS) の無効化
ローカルドメインへの接続の許可
ATS 例外はグローバルまたはドメイン単位で適用できます。アプリケーションは ATS をグローバルに無効化できますが、個々のドメインをオプトインできます。Apple Developer ドキュメントの以下のリストでは NSAppTransportSecurity
Dictionary の構造を示しています。
NSAppTransportSecurity : Dictionary {
NSAllowsArbitraryLoads : Boolean
NSAllowsArbitraryLoadsForMedia : Boolean
NSAllowsArbitraryLoadsInWebContent : Boolean
NSAllowsLocalNetworking : Boolean
NSExceptionDomains : Dictionary {
<domain-name-string> : Dictionary {
NSIncludesSubdomains : Boolean
NSExceptionAllowsInsecureHTTPLoads : Boolean
NSExceptionMinimumTLSVersion : String
NSExceptionRequiresForwardSecrecy : Boolean // Default value is YES
NSRequiresCertificateTransparency : Boolean
}
}
}
以下の表はグローバル ATS 例外をまとめたものです。これらの例外の詳細については、公式の Apple Developer ドキュメントの Table 2 を参照してください。
NSAllowsArbitraryLoads
NSExceptionDomains
の下に指定された個々のドメインを除いてグローバルに ATS 制限を無効化する
NSAllowsArbitraryLoadsInWebContent
WebView から作成されたすべての接続に対して ATS 制限を無効化する
NSAllowsLocalNetworking
非修飾ドメイン名と .local ドメインへの接続を許可する
NSAllowsArbitraryLoadsForMedia
AV Foundation フレームワークからロードされたメディアのすべての ATS 制限を無効化する
以下の表はドメインごとの ATS 例外をまとめたものです。これらの例外の詳細については、公式の Apple Developer ドキュメントの Table 3 を参照してください。
NSIncludesSubdomains
ATS 例外を名前付きドメインのサブドメインに適用すべきかどうかを示す
NSExceptionAllowsInsecureHTTPLoads
名前付きドメインへの HTTP 接続を許可するが、TLS 要件には影響しない
NSExceptionMinimumTLSVersion
TLS バージョン 1.2 未満のサーバーへの接続を許可する
NSExceptionRequiresForwardSecrecy
Perfect Forward Secrecy (PFS) を無効化する
例外の正当性:
2017年1月1日から Apple App Store レビューでは以下の ATS 例外の一つが定義されている場合に 正当な理由を要求 します。
NSAllowsArbitraryLoads
NSAllowsArbitraryLoadsForMedia
NSAllowsArbitraryLoadsInWebContent
NSExceptionAllowsInsecureHTTPLoads
NSExceptionMinimumTLSVersion
これはアプリが意図した目的の一部であるかどうかを判断して、慎重に修正しなければなりません。Apple はアプリのセキュリティを低下させる例外について警告し、ATS の障害に直面した場合には 必要な場合にのみ例外を設定し、サーバーの修正を優先する ようにアドバイスしています。
例:
以下の例では、ATS はグローバルに有効 (グローバルな NSAllowsArbitraryLoads
は定義されていない) ですが、 example.com
ドメイン (とそのサブドメイン) に対して例外が 明示的に設定 されています。このドメインをアプリケーション開発者が所有し、適切な正当性があることを考慮すると、他のすべてのドメインに対して ATS のすべての利点を維持しているため、この例外は許容されるでしょう。しかし、上記のようにサーバーを修正することが常に望ましいと思われます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
</dict>
</dict>
ATS 例外の詳細については Apple Developer ドキュメント の記事 "Preventing Insecure Network Connections" のセクション "Configure Exceptions Only When Needed; Prefer Server Fixes" および ATS に関するブログ投稿 を参照してください。
Last updated
Was this helpful?