Apache を ATS(App Transport Security)に対応する方法

Linux
Linux
スポンサーリンク

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_256_GCM_SHA384
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 のバージョン

$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Nov 19 2015 21:43:13

OpenSSL のバージョン

$ openssl version
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 -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
 ↓
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 を再起動します。

systemctl reload httpd

設定確認

最後に ATS の対応チェックと、SSL の設定に問題がないかを確認します。

ATS に対応しているかの確認

OS X El Caption(10.11)に付属している nscurl コマンドで確認できます。すべて「PASS」であればOKです。

$ nscurl --ats-diagnostics https://example.com/
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 が必須になる日が来るかもしれませんね。

コメント

タイトルとURLをコピーしました