EC-CUBE Lab
produced by Cajiya
EC-CUBEに関するカスタマイズ方法やトラブルへの対処方法を発信

ロードバランサー経由でも管理画面IP制限を適用させるカスタマイズ方法

公開日: 2025年10月12日 | 更新日: 2025年11月03日
管理画面共通 セキュリティ強化 EC-CUBE 4系全般 イベント購読 AWS-ELB

要望や症状

ロードバランサー配下にEC-CUBEサーバを構築している環境で、管理画面IP制限設定を実施しようとすると、すべてロードバランサーのIPで制限がかかってしまいます。

EC-CUBEの標準管理画面IP制限機能では、ロードバランサーを経由した接続において実際のクライアントIPではなく、ロードバランサーのIPアドレスが参照されるため、適切なIP制限ができない状態となります。

理由や原因

EC-CUBEの管理画面IP制限機能は、PHPの$_SERVER['REMOTE_ADDR']を参照してアクセス元IPを判定しています。ロードバランサー配下では、この値がロードバランサーのIPアドレスとなり、実際のクライアントIPはX-Forwarded-Forヘッダーに格納されます。

EC-CUBEの標準機能ではX-Forwarded-Forヘッダーを考慮したIP制限には対応していないため、ロードバランサー配下での適切なIP制限を行うには、Webサーバ側またはEC-CUBE側での追加設定が必要となります。

解決策

方法1: mod_remoteip を使用する方法(推奨)

Apacheのmod_remoteipモジュールを使用することで、EC-CUBEのカスタマイズなしに対応可能です。

手順

  1. mod_remoteipモジュールを有効化します
sudo a2enmod remoteip
  1. Apache設定ファイル(httpd.confまたはバーチャルホスト設定)に以下を追加します
# ロードバランサーのIPアドレスを信頼するプロキシとして設定
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.0/8  # ロードバランサーのIPレンジに合わせて調整
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
  1. Apacheを再起動します
sudo systemctl restart apache2
  1. EC-CUBEの管理画面IP制限設定で実際のクライアントIPを設定します

方法2: EC-CUBEカスタマイズによる対応

mod_remoteipが使用できない場合は、EC-CUBE側をカスタマイズして対応します。

手順

  1. カスタマイズディレクトリにIP取得処理を作成します
// app/Customize/Service/IpService.php
<?php
namespace Customize\Service;

class IpService
{
    public function getRealIpAddress(): string
    {
        // X-Forwarded-Forヘッダーを優先的に取得
        $headers = getallheaders();
        if (isset($headers['X-Forwarded-For'])) {
            $ips = explode(',', $headers['X-Forwarded-For']);
            return trim($ips[0]); // 最初のIPを取得
        }
        
        return $_SERVER['REMOTE_ADDR'] ?? '';
    }
}
  1. 管理画面IP制限処理をカスタマイズします
// app/Customize/EventListener/AdminIpListener.php
<?php
namespace Customize\EventListener;

use Customize\Service\IpService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class AdminIpListener implements EventSubscriberInterface
{
    private $ipService;
    
    public function __construct(IpService $ipService)
    {
        $this->ipService = $ipService;
    }
    
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::REQUEST => ['onKernelRequest', 512]
        ];
    }
    
    public function onKernelRequest(RequestEvent $event)
    {
        $request = $event->getRequest();
        
        // 管理画面へのアクセスかチェック
        if (strpos($request->getPathInfo(), '/admin') === 0) {
            $realIp = $this->ipService->getRealIpAddress();
            // 元のREMOTE_ADDRを実際のIPに置き換え
            $_SERVER['REMOTE_ADDR'] = $realIp;
        }
    }
}
  1. サービス設定を追加します
# app/Customize/Resource/config/services.yaml
services:
    Customize\Service\IpService:
        public: true
        
    Customize\EventListener\AdminIpListener:
        tags:
            - { name: kernel.event_subscriber }

注意事項

X-Forwarded-Forヘッダーは改ざん可能なため、信頼できるプロキシ(ロードバランサー)からのアクセスのみを対象とすることが重要です。

ロードバランサーの設定でX-Forwarded-Forヘッダーが適切に設定されていることを事前に確認してください。

カスタマイズを行う場合は、バージョンアップ時の影響を考慮してテスト環境での検証を推奨します。

免責事項

本記事に掲載しているコードや手順は、執筆時点での情報および特定の環境下での動作確認に基づいています。 EC-CUBEのバージョン、サーバー環境、導入済みプラグインとの競合などにより、予期せぬ不具合が発生する可能性があります。

本記事の内容を実行した結果、生じた損害(データの消失、サイトの停止、機会損失など)について、当サイトおよび管理者は一切の責任を負いかねます。 実装にあたっては、必ずバックアップを取得し、検証環境(テスト環境)での動作確認を行った上で、ご自身の責任において実施してください。

この記事は参考になりましたか?

著者プロフィール: 株式会社カジヤ

当社はWeb業界の専門家として、培った経験や技術、自社事業を通して得た知見を土台に、 お客様の事業の成長を後押しすることを提供価値として活動する、Web事業の成長支援会社です。 EC-CUBE公式のパートナー制度「EC-CUBE インテグレートパートナー」に登録してしており、上位11%にあたる「ゴールドランク」に認定された実績があり、新しい通販サイトの構築から、カスタマイズ、リニューアルまで幅広く対応します。

管理画面共通 の関連記事

管理画面共通 パフォーマンス劣化 EC-CUBE 4系全般
EC-CUBEのlogフォルダ肥大化の管理方法

var/log/prodフォルダ内のログファイルが肥大化し、ディスク容量を圧迫している状況が発生しま...

👍 1 / 👎 0 2025年10月12日
管理画面共通 機能不動作 EC-CUBE 4系全般
.htaccessを使用したIPアドレス制限とメンテナンス画面表示の設定方法

EC-CUBE 4系において、機能リリースなどのタイミングで一般のユーザーにはメンテナンスモードを表...

👍 1 / 👎 0 2025年10月12日
管理画面共通 表示/テンプレート調整 EC-CUBE 4系全般
管理画面左上のEC-CUBEロゴをカスタマイズする方法

管理画面の左上に表示されているEC-CUBEのデフォルトロゴを、自社のロゴに変更したいと考えています...

👍 0 / 👎 0 2025年10月12日
管理画面共通 データ不整合 EC-CUBE 4系全般
CloudFrontやロードバランサー経由でも実際のアクセス元IPアドレスをログに記録する方法

AWS CloudFrontやロードバランサー、クラウド型WAFを使用している環境において、EC-C...

👍 0 / 👎 0 2025年09月23日

セキュリティ強化 の関連記事

会員登録 セキュリティ強化 EC-CUBE 4系全般
悪意のあるボットによる大量の会員登録を制限する方法

不正なbot等によって、大量の会員登録リクエストが送信されるケースがあります。これらの不正登録では基...

👍 0 / 👎 0 2025年09月23日

EC-CUBE 4系全般 の関連記事

商品 データ不整合 EC-CUBE 4系全般
EC-CUBEで取り扱い終了商品の削除ができない理由と対応方法

EC-CUBEでは、取り扱いを終了した商品を削除したい場合に、削除ができない状態になることがあります...

👍 1 / 👎 0 2025年10月12日
インストール・セットアップ EC-CUBE 4系全般 設定変更
EC-CUBEサイトのドメイン変更時の設定変更方法

EC-CUBEで構築したサイトを新しいドメインで公開する際に、どのような設定変更が必要かわからない場...

👍 0 / 👎 0 2025年10月12日
メール通知 通知/コミュニケーション EC-CUBE 4系全般
メール件名のショップ名を英語表記に変更する方法

EC-CUBE 4系で、メール件名の先頭に自動挿入される店舗名を英語表記に変更したい場合があります。...

👍 0 / 👎 0 2025年10月12日
フロント共通 機能不動作 EC-CUBE 4系全般
CloudFrontを利用時にリンクのドメインがEC2のパブリックDNSになってしまう問題の解決方法

EC-CUBE 4.2をAWS ECS on EC2上で構築し、CloudFrontをCDNとして利...

👍 1 / 👎 0 2025年10月12日
サイト全体 500エラー EC-CUBE 4系全般
EC-CUBEでメモリ不足エラーが発生した場合の対処方法

EC-CUBEの運用中に以下のようなメモリ不足エラーが発生することがあります。 ### エラー...

👍 1 / 👎 0 2025年10月12日

イベント購読 の関連記事

ログイン・ログアウト 情報構造・ルーティング設計 EC-CUBE 4.1系 / Symfony 4.4
ログアウト時のリダイレクト先をカスタマイズする方法(EventListener)

EC-CUBE 4.1系において、ログアウトボタンを押した際にトップページではなく、特定のページ(u...

👍 0 / 👎 0 2025年09月23日
購入フロー 通知/コミュニケーション EC-CUBE 4系全般
EC-CUBE4で購入通知をSlackで送信するカスタマイズ方法

EC-CUBE 4系において、注文が発生した際に運用チームへSlackで自動通知を送りたいという要望...

👍 0 / 👎 0 2025年09月23日

AWS-ELB の関連記事

フロント共通 機能不動作 EC-CUBE 4系全般
CloudFrontを利用時にリンクのドメインがEC2のパブリックDNSになってしまう問題の解決方法

EC-CUBE 4.2をAWS ECS on EC2上で構築し、CloudFrontをCDNとして利...

👍 1 / 👎 0 2025年10月12日
管理画面共通 データ不整合 EC-CUBE 4系全般
CloudFrontやロードバランサー経由でも実際のアクセス元IPアドレスをログに記録する方法

AWS CloudFrontやロードバランサー、クラウド型WAFを使用している環境において、EC-C...

👍 0 / 👎 0 2025年09月23日