ATS(App Transport Security)は、iOS 9.0 や OS X 10.11以上で導入された、セキュリティ機能です。この機能により、アプリとWEBサービス間の接続のプライバシーと、データの整合性を向上させることができます。ATS が有効なアプリは HTTP を使った通信ができないため、WEBサーバには HTTPS が必須になります。加えて、TLSのバージョンや、暗号化スイート等も Apple が指定するものを設定しなければ、アプリからWEBサーバに接続することができません。そこで今回は、WEBサーバの Apache を ATS(App Transport Security)に対応する方法を調べてみました。
ATS に対応するための要件
ATS が有効なアプリと WEBサーバが接続できるようにするための要件は、iOS Developer Library「Requirements for Connecting Using ATS」で確認できます。簡単にまとめると要件は以下の通りです。(2016年3月25日現在)
サーバ証明書に関する要件
- パブリック認証局(CA)が発行していること(オレオレ証明書はNG)
- 証明書鍵長は RSA 2048ビット以上 または ECC(楕円曲線暗号) 256ビット以上であること
- 署名アルゴリズムは SHA-256 以上であること
WEBサーバに関する要件
- HTTPS のみで通信を行うこと
- SSL/TLS のバージョンは TLS1.2 を使うこと
- Forward Secrecy に対応している以下の暗号化スイートを使うこと
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
Forward Secrecy は、誰かがSSL/TLSで暗号化された通信データをためておき、仮に将来、その通信に使われた秘密鍵を入手できたとしても、通信データを解読できなくするための仕組みです。NSAやFBIの通信傍受を意識して、Appleはこのような要件にしているかもしれませんね。
(参考資料)IPA「SSL/TLS暗号設定ガイドライン」P36
サーバ証明書要件への対応
シマンテック(旧ベリサイン)やグローバルサインなど、ほとんどの認証局は、鍵長RSA2048ビット、SHA-256での署名に対応していますので、対応したサーバ証明書を発行してもらえばOKです。
無料でサーバ証明書を発行してくれる認証局 Let's Encrypt も上記要件を満たしていますので、費用をかけずに WEBサーバを ATS 対応にできます。もし興味があれば「Let's Encrypt サーバー証明書の取得と自動更新設定メモ」もご参照ください。
Apache(WEBサーバ)への対応
Apache への対応は、利用可能なSSL/TLSバージョンの設定と、暗号化スイートの設定です。Apache のバージョンが古すぎると、ATSの要件に対応できない場合もありますので、最新バージョンにアップデートすることをオススメします。
WEBサーバへの対応の注意点
Apacheの設定を ATSの要件に限定してしまうと、古いブラウザからWEBサイトの閲覧が、できなくなる可能性もありますので、ATSの要件を満たしつつ、ほどよい設定にする必要があります。ただ、これがなかなか至難の技なのですが「Mozilla SSL Configuration Generator」を使えば、高いセキュリティレベルを保ちつつ「ほどよい設定」を生成してくれます。
Mozilla SSL Configuration Generator の使い方
まず、Apache と OpenSSL のバージョンを確認しておきます。
Apache のバージョン
Server version: Apache/2.4.6 (CentOS)
Server built: Nov 19 2015 21:43:13
OpenSSL のバージョン
OpenSSL 1.0.1e-fips 11 Feb 2013
「Mozilla SSL Configuration Generator」のページに、確認した Apache と OpenSSL のバージョンを入力すれば、Apache など WEBサーバの設定パラメータを生成してくれます。
Apache の設定
生成したパラメータを、Apache の 設定ファイルに反映します。(Apache2.4.6 OpenSSL1.0.1での設定です。必ずご自分の環境に合ったパラメータを設定してください)
vim /etc/httpd/conf.d/ssl.conf
※Apache2.4からSSLv2はデフォルトで無効のため「-SSLv2」は不要です。
↓
SSLProtocol all -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
↓
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
ATSの要件にはありませんが、セキュリティ向上のため以下も設定することをオススメします。
↓
SSLHonorCipherOrder on
(追加)
# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000"
SSLHonorCipherOrder はSSLダウングレード攻撃対策、HSTSは「HTTPSを使ってね!」とブラウザに伝える仕組みです。
設定が終わったら Apache を再起動します。
設定確認
最後に ATS の対応チェックと、SSL の設定に問題がないかを確認します。
ATS に対応しているかの確認
OS X El Caption(10.11)に付属している nscurl コマンドで確認できます。すべて「PASS」であればOKです。
Starting ATS Diagnostics
Configuring ATS Info.plist keys and displaying the result of HTTPS loads to https://example.com/.
A test will "PASS" if URLSession:task:didCompleteWithError: returns a nil error.
Use '--verbose' to view the ATS dictionaries used and to display the error received in URLSession:task:didCompleteWithError:.
================================================================================
Default ATS Secure Connection
---
ATS Default Connection
Result : PASS
---
(以下省略)
SSL 設定の確認
設定にミスはつきものです(^^;)「SSL Server Test」などのSSL脆弱性診断サイトで、設定に問題がないか必ず確認しましょう。
Handshake Simulation セクションで、OSやブラウザの対応状況を確認できます。
下の方に「Apple ATS 9 / iOS 9」がありますので、こちらでもATS対応を確認できますね。
終わりに
現状(2016年3月25日)では、iOSアプリからWEBサーバへの通信を、すべてHTTPSにすることは非常に難しいため、アプリを開発する時に、ATS を無効にしたり、要件を下げることで対応しているそうです。
ただ、Apple のティム・クックCEOは、FBIとの問題で「iPhoneは非常にパーソナルな端末だ。Appleには、あなたがデータとプライバシーを守るのを助ける責任がある」と発言しています。もしかしたら近い将来 ATS が必須になる日が来るかもしれませんね。
コメント