レンタルサーバーにPHPのライブラリをインストールしようとして困ったことはありませんか? ロリポップのライトプランはSSHでログインできませんが、Composerを利用することはできます。さくらのレンタルサーバーのライトプランでも概ね同様です。
ロリポップの特徴
Webサーバー(Apache)では、公開するためのファイルを配置するディレクトリパスの設定(ディレクティブ)をDocumentRootと呼びます。さて、レンタルサーバーによってはDocumentRootの外(上)のディレクトリにもアクセスできます。しかし、ロリポップのライトプランのFTP機能では、ApacheのDocumentRoot = ルート(アクセスできる一番上のディレクトリ)なので、その外にファイルを置けるような概念ではありません。
この仕様がなぜ良くないかと申しますと、PHPファイルにはDocumentRootに配置してWeb上からアクセスされるもの(典型的にはURLとphpファイル名が一致するもの)と、関数やクラス定義だけをするファイルなどがあるからです。プロジェクトの構成によっては「PHPで書かれた設定ファイル」や「部分テンプレート(共通テンプレート)」などがあるかもしれません。
要は、PHPファイルは直接起動されたいファイルと、直接起動されたくないファイルに分かれるのです。ロリポップ以外のレンタルサーバーではDocumentRootの外に配置することで簡単に分けることができますが、ロリポップの構成ではそれはできません。
よい
.
├── cache
├── config.php
├── lib
│ └── functions.php
├── public
│ └── index.php
├── template
│ ├── body.tpl.php
│ ├── footer.tpl.php
│ └── header.tpl.php
└── vendor
だめ
.
├── cache
├── config.php
├── functions.php
├── index.php
├── template
│ ├── body.tpl.php
│ ├── footer.tpl.php
│ └── header.tpl.php
└── vendor
DocumentRootに置くべきファイルとは
伝統的なPHP(CGI)ではURLとphpファイル名が一致するので、Webページとしてアクセスされたいファイルとユーザーに直接公開するファイル(CSS, JavaScript, 画像ファイルなど)のみをDocumentRootに置きます。
一方で、ユーザーに直接公開/実行されたくないPHPファイルは理想的にはDocumentRootに置いてはいけません。典型的には関数定義ファイル、設定ファイル、コマンドラインから実行する前提のPHPスクリプト、Webページを表示するためのinclude
される前提の部分テンプレートファイル、ログファイル、コンパイルキャッシュファイル、セッションファイルなどです。
しかしながら、ロリポップではその理想的な構成をとることができません。
.htaccess
でディレクトリのアクセスを拒否する
サーバーの仕様 / サービス - レンタルサーバーならロリポップ!によれば、2018年9月28日現在でロリポップはApache 2.4.xを利用していて、 .htaccess
での設定が利用可能になっています。
.htaccess
はディレクトリ単位でApacheの設定を変更するためのファイルです。これを使ってアクセス権限を制御する方法はApacheの公式ドキュメントAccess Control - Apache HTTP Server Version 2.4で紹介されてます。
一番単純には、内容を公開したくないディレクトリに以下のような内容のファイルを配置してください。
Require all denied
Require
ディレクティブの書式についてはmod_authz_core - Apache HTTP Server Version 2.4#requireを読んでください。この記述は古い書式Deny from All
と、やりたいことの意味は同じです。
また、設定を行った後は必ず意図通りにアクセスが拒否できるか動作確認をしましょう。セキュリティ対策をしたつもりが設定を間違ったせいで有効化されてないと悲しいですからね。ダミーの内容のファイルを配置してみて、設定を外したときにそのファイルが読み取れてしまうことを確認してみてもよいでしょう。
Composerはローカルでセットアップする
お手持ちの作業用のPCでセットアップしてください。
-
composer
コマンドがなければ https://getcomposer.org/download/ に従って取得- コマンドとしてインストールしない場合は
php composer.phar ...
のように実行することもできます
- コマンドとしてインストールしない場合は
- コマンドラインで
composer install --no-dev --prefer-dist --optimize-autoloader
を実行する - FTPSなどで
vendor/
ファイルの内容ごと転送する
ただし依存するパッケージやフレームワークによってはcomposer install
時に独自のスクリプトが動作して環境依存のファイルが作成されることも(もしかすると)ありうるので、これだけでは完動せず別の設定が必要なこともありえます。注意して検証してくださいね。
特にフレームワークや既存のWebアプリ/CMSを利用する際はdevelopmentモード(開発モード)の設定のままで公開サーバーに設置しないように十分気をつけてください。
おまけ
フレームワークで作ったアプリケーションをロリポップでホストできるか?
やればできるけど、やらない方がいいんじゃないでしょうか。Laravelであればpublic
、CakePHPであればwebroot
などがデフォルトのDocumentRoot名ですが、どちらもDocumentRootの上の階層にファイルを置ける前提の構成です。
ロリポップのようにDocumentRoot外に置けない構成のレンタルサーバーに無理に設置した場合、考慮漏れで設定ファイルが漏洩するようなリスクは容易に想像がつきます。
Don't 👏 put 👏 your 👏 .env 👏 files 👏 in 👏 the 👏 web-server 👏directory https://t.co/DWHmT6r6E3 pic.twitter.com/Qp5tun3CZh
— svbl (@svblxyz) September 26, 2018
今回の記事の本筋とは関係ないですが設定ファイルの漏洩はコワイですね。 .env
が不意に公開されないようにするための.htaccess
の記述方法は読者への課題とします。