だ。ログ。

開発とかスノボとかやきうとか。

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-CUBESSL Terminationを想定していない造り、って言うかそう言う使い方するもんじゃねーからコレ。と言われかねないが
ELB経由のEC2でEC-CUBEを使う人がハマる所かと。