SSL上のCakePHP2でロードバランサやWAFを導入する際の注意点

最近、CakePHPで作られたSSL前提のサイトでWAFを導入することになったのですが、気になったことがあったので調べて見ました。

SSLで暗号化するサイトで、ロードバランサやWAFを導入する場合、 Webサーバーではフロント側(ロードバランサやWAF)で復号化されたリクエストを受け付ける構成が多いかと思います。

この構成の場合、WebサーバーではもちろんHTTPSではなくHTTPで通信しているものと解釈されます。

ここでCakePHPで2つ問題点が出てきます。(まだあるかも)

  1. Cookieにsecure属性がつかない
  2. リダイレクト時のURLが異なる

対応方法

1. Cookieにsecure属性がつかない

CakePHPではHTTPかHTTPSかで、セッションIDを保存するCookieのsecure属性を切り替えているようです。 セッション — CakePHP Cookbook 2.x ドキュメント

このため、あまりよろしくない状態になります。

対応方法としては、公式ドキュメントを参考に、phpの設定「session.cookie_secure」を有効にすればよいです。

<? php
Configure::write('Session', array(
    'defaults' => 'php',
    'ini' => array(
        'session.cookie_secure' => true
    )
));

SSL通信だけのWebサーバーなら、php.iniで有効にしてもいいですね。

session.cookie_secure = 1
2. リダイレクト時のURLが異なる

ログインなどでリダイレクトが使われているのですが、このリダイレクト先のURLがHTTPとなるので、接続できなくなる可能性があります。 というか、HTTPSしか許可していないなら接続できないですね。

この対応は、CakePHPで用意されているRouter::fullBaseUrlメソッドで、ベースとなるサイトのURLを設定すればよいみたいです。URLの最後にスラッシュはいらないようです。 Routing — CakePHP Cookbook 2.x documentation

<? php
Router::fullbaseUrl( 'https://example.jp/hogehoge' );

こちらのサイトにある、ロードバランサ等からの情報で切り替えるようにするのも有効かもしれない。 CakePHPでロードバランサ配下のサーバでHTTPSのリクエストが正常に判断されない問題 - 【鋭利団体】PK-Brothers

<? php
if ( isset($_SERVER['HTTP_X_FORWARDED_PORT']) && 443 == $_SERVER['HTTP_X_FORWARDED_PORT'] ) {
    Router::fullbaseUrl( 'https://'.$_SERVER['HTTP_HOST'] );
}