EC-CUBE3がELB配下のEC2サーバーにある場合の管理ページのアクセス制限を行う
かなり限定的な構成ではあるがELBの下にEC2にEC-CUBE3がインストールされている。
しかもELBにSSLをインストールしているSSL Terminationを利用している場合
そのままEC-CUBEをインストールし、管理画面のアクセス制限をしてもアクセス制限が出来ない。
過去の記事にも掲載したが、一旦ELBを経由しEC2に到達するのでアクセス元はELBのIPアドレスになるのだ
index.phpで$_SERVERをダンプする
[REMOTE_ADDR] => ELBのIPアドレス
と出てしまっている。
この為、ELBのIPアドレスを許可するとELB経由のアクセスは許可=全許可と言う事で意味がない。
しかしREMOTE_ADDRを他のモノに変えるとどこでどう使っているかが不明な為、あまりコレをいじるのはよろしくない。と言う事で以下
/src/Eccube/Application.php
if (count($allowHost) > 0) { if (array_search($app['request']->getClientIp(), $allowHost) === false) { throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException(); } }
この getClientIpはREMOTE_ADDRを取得しに来ている。
そして、ここで許可ホストに一致しなければエラーに飛ばすと言う処理を行っているので以下に変更
$realip = $_SERVER['HTTP_X_FORWARDED_FOR']; if (count($allowHost) > 0) { if (array_search($realip, $allowHost) === false) { throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException(); } }
リアルのIPアドレスはどれよ。って事を$_SERVER変数から確認し、そのIPアドレスに判定を書き換える。
多分EC-CUBEがSSL Terminationを想定していない造り、って言うかそう言う使い方するもんじゃねーからコレ。と言われかねないが
ELB経由のEC2でEC-CUBEを使う人がハマる所かと。