planet-green.com

[備忘録] EC-CUBE4をnginx上で動かす



EC-CUBE4をnginx環境にインストールした時の作業メモ。

EC-CUBE 3(前バージョン)とnginxの組み合わせであればGoogleで検索するといくつか設定例が出てきますが、そのままEC-CUBE 4に適用するとセキュリティ上の問題があるので、ここに安全な設定方法について記したいと思います。

nginxの設定

#
# EC-CUBE 4
#
server {
	listen 80;
	server_name hoge-shop.com; #ドメイン

	root /home/hoge-shop/pubic/; #ドキュメントルート
	index index.html index.htm index.php;
	access_log /var/log/nginx/hoge-shop.log;
	error_log /var/log/nginx/hoge-shop.error.log;
       
	client_max_body_size 16M; #アップロード最大サイズ。商品画像を扱うのでこのくらいあった方がいいでしょう。

	location / {
		try_files $uri $uri/ /index.php?$args;
	}

	# クリックジャッキング対策
	add_header X-Frame-Options SAMEORIGIN;

	# XSS対策
	add_header X-XSS-Protection "1; mode=block"; 
	add_header X-Content-Type-Options nosniff;

	# 403 Forbidden対応方法
	# ページアクセスできない時シンボリックリンクが有効になっていない可能性あります、
	# オプションを追加してください
	disable_symlinks on from=$document_root;

	# Authorization ヘッダが取得できない環境への対応
	#proxy_set_header Authorization $http_authorization;

	# .htaccess, .htpasswd, .env等の.(ピリオド)から始まる不可視ファイルをアクセス禁止に
	location ~ /\. {
	 	 deny all;
	}

	# アクセス禁止ファイル
	location ~* (?:/(?:src|app|tests|var|vendor|node_modules|codeception|bin)/.*|/(?:composer|COPYING|Procfile|app.json|gulpfile.js|package.json|package-lock.json|web.config))$ {
		deny all;
	}
	
	# 画像などの静的ファイル
	location ~* ^.+\.(?:mp4|ttf|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|ppt|tar|mid|midi|wav|bmp|rtf|wmv)$ {
		# ログ出力の有無はお好みで
		access_log off;
		log_not_found off; 
		if (-f $request_filename) {
			#ブラウザキャッシュの有効時間。ここもお好みに応じて。
			expires 60m;
			break;
		}
	}

	# PHP設定
	location ~ \.php$ {
		# このディレクティブの設定はディストリビューション/パッケージに依る。
		# (これはCentOS 7での設定例)
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		include fastcgi_params;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		# Authorization ヘッダが取得できない環境への対応
		#fastcgi_param HTTP_AUTHORIZATION $http_authorization; 
		fastcgi_pass   127.0.0.1:9000;
	}
}


アクセス禁止ファイルの箇所は強引に1つにまとめたので、ややトリッキーな記述になりました。
2つに分けるなら次にようになります。

# アクセス禁止ディレクトリ
location ~* /(?:src|app|tests|var|vendor|node_modules|codeception|bin)/ {
	deny all;
}

# アクセス禁止ファイル
location ~* /(?:composer|COPYING|Procfile|app.json|gulpfile.js|package.json|package-lock.json|web.config)$ {
	deny all;
}

 

PHP-FPMで環境変数を設定する際の注意点

EC-CUBE4公式ドキュメントでは、環境変数はサーバー設定ファイルに記述することを推奨しています。

.env ファイルは、開発用途での環境変数を設定するためのものであり、本番環境での使用は推奨されません。 本番環境では、環境変数をサーバー設定ファイルに設定することを推奨します。 サーバー設定ファイルに環境変数を設定することにより、環境変数が外部に暴露される危険性が減り、安全に運用できます。

http://doc4.ec-cube.net/quickstart_install

その場合、上記nginx設定ファイルのPHP設定ディレクティブに

fastcgi_param APP_ENV prod;
fastcgi_param APP_DEBUG 0
fastcgi_param DATABASE_URL pgsql://dbuser:password@127.0.0.1/cube4_dev
・
・
・・・以下略

・・・と追記していくことになりますが、その際に注意しないといけないことがあります。

PHP-FPMの特性上、fastcgi_param で環境変数を設定すると、そのプールでは環境変数がずっと残ってしまうため、同じプールから起動された他のバーチャルホストでも環境変数を参照できてしまいます。

専用サーバーであれば問題ないのですが、共用サーバーの場合、EC-CUBE以外の他のユーザーからもDBパスワード等を見ることが可能になるということです。

対応策として、php-fpmのプール設定である /etc/php-fpm.d/www.conf (CentOS 7の場合)を同じディレクトリに www-eccube.conf 等の名前で別名コピーします。
そしてlisten項目をユニーク(一意)なものに変更して、nginx側のphp設定もそれに合わせます。

例)
もし 
listen = 127.0.0.1:9000
だったら
listen = 127.0.0.1:9001 に、

listen = /run/php-fpm/php-fpm.sock
だったら
listen = /run/php-fpm/php-fpm-eccube.sock に。

そうすることで、通常のプールとEC-CUBE専用プールの2つが立ち上がるので、環境変数の露呈を防止できます。

※注) 本記事は動作検証しながら追記していってます。不具合が見つかった際は訂正・加筆いたします。

コメントを残す

メールアドレスが公開されることはありません。

※ URLを含んだコメントは承認後に表示されます。

* 画像に書かれている英数字を入力してください。