AWS ELBとsecureモードCookieの挙動を調べてみた

ELB

はじめに

secureモードでない通常のCookieは、SSL/TLS による経路のセキュリティ保護を受けることが出来ません。
ELBでSSL終端する場合にsecureモードのCookieを利用できるか確認してみました。
検証の結果、Webサーバの種類(nginx,apache2.4)とELBの種類(ALB,CLB)に関係なく、利用出来ました。
secureモードのCookieについては、IPAのページををご覧下さい。

secureモードの動作確認

SSL/TLS 通信を使わないページでは、secureモードのCookieが送信されずセッションを作成出来ません。
テストコードを利用して、動作を確認しました。

secureモード無効時は、セッションが作成/維持される

まずは、secureモードが無効の時の動作を確認します。
EC2にhttpでアクセスします。
初めて接続すると「初回の訪問」と表示され、セッションが開始されます。
初回

2回目以降は、セッションIDが表示されます。
2回目のアクセス

cookieを削除すると「初回の訪問」と表示されます。
再接続すると、新しいセッションIDが表示されます。
初回

secureモード有効化

secureモードを有効にします。
php.iniにて、session.cookie_secureを指定します。

$ diff /etc/php.ini /etc/php.ini.org
1365d1364
< session.cookie_secure = 1

secureモード有効時は、httpページでセッションを作成出来ない

EC2にhttpでアクセスします。
「初回の訪問」と表示されます。2回目以降の接続も同様です。
SSL/TLS 通信を使わないページでは、Cookieが送信されずセッションを作成出来ない事がわかります。

初回

httpsページではセッションを作成できる

EC2に自己証明書を配置し、https接続します。
「初回の訪問 on」と表示されます。
"on"はテストコード中のgetenv('HTTPS')の値です。HTTPSで接続する場合は"on"がセットされます。

Session_Test_Page

2回目以降の接続では、IDが表示されます。
httpsページではセッションを作成できることがわかります。
2回目

ELB経由でのアクセスでは、セッションを作成できる

ELB経由でアクセスしてみます。
ELBのリスナーをhttpsとし、EC2にhttpでルーティングします。
https://ELBのDNS名に接続し、テストコードの動作を確認します。
結果、Webサーバの種類(nginx/apache2.4)とELBの種類(ALB/CLB)に関係なく、セッションを作成出来ました。

nginx + php

セッションを作成/維持出来ます。
2回目以降のアクセスはセッションIDが表示されます。

2回目以降

apache2.4 + php

セッションを作成/維持出来ます。
2回目以降のアクセスはセッションIDが表示されます。

検証環境

nginx + php

  • CentOS 7
  • nginx.x86_64 1:1.10.3-1.el7.ngx
  • php-common.x86_64 5.4.16-42.el7
  • php-fpm.x86_64 5.4.16-42.el7

Apache2.4 + php

  • CentOS 7
  • httpd.x86_64 2.4.6-45.el7.centos
  • php-common.x86_64 5.4.16-42.el7
  • php-fpm.x86_64 5.4.16-42.el7

テストコード

<?php
    session_start();
?>

<html>
<head><title>Session Test Page</title></head>
<body>
<?php
  if (!isset($_COOKIE["PHPSESSID"])){
    print('初回の訪問');
  }
  else{
    print('セッションID: '.$_COOKIE["PHPSESSID"]);
  }

  $protocol = getenv('HTTPS');
?>

<?=$protocol?>

</body>
</html>

おわりに

ELBでSSL終端する場合にsecureモードのCookieを利用できるか確認しました。
今回の検証では、Webサーバの種類とELBの種類に関係なく利用出来ました。

参考