bglesによって投稿された解決策は、最初に権限を正しく設定するという点で私にとっては定評があります(私は2番目の方法を使用します)が、Laravelには潜在的な問題がまだあります。
デフォルトでは、Apacheは644の権限を持つファイルを作成します。ですから、それはstorage /のほとんどすべてです。したがって、storage / framework / viewsのコンテンツを削除した場合、Apacheを介してページにアクセスすると、キャッシュされたビューが次のように作成されていることがわかります。
-rw-r--r-- 1 www-data www-data 1005 Dec 6 09:40 969370d7664df9c5206b90cd7c2c79c2
「artisan serve」を実行して別のページにアクセスすると、CLI PHPの動作がApacheとは異なるため、異なる権限が付与されます。
-rw-rw-r-- 1 user www-data 16191 Dec 6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e
本番環境ではこれを行わないため、これ自体は大した問題ではありません。しかし、Apacheが後でユーザーが書き込む必要のあるファイルを作成すると、失敗します。そして、これは、ログインしたユーザーと職人を使用してデプロイするときに、キャッシュファイル、キャッシュビュー、およびログに適用できます。「artisan cache:clear」の簡単な例は、www-data:www-data 644であるキャッシュファイルの削除に失敗します。
これは、artisanコマンドをwww-dataとして実行することで部分的に軽減できるため、次のようなすべてのことを実行/スクリプト化します。
sudo -u www-data php artisan cache:clear
または、この面倒な作業を避け、これを.bash_aliasesに追加します。
alias art='sudo -u www-data php artisan'
これで十分であり、セキュリティにはまったく影響しません。ただし、開発マシンでは、「sudo -u www-data」を使用してphpunitを実行するエイリアスを設定したり、ビルドをチェックしたりしてファイルが作成される可能性があるすべての場合を除いて、テストおよびサニテーションスクリプトを実行するとこれは扱いにくくなります。
解決策は、bglesアドバイスの2番目の部分に従い、以下を/ etc / apache2 / envvarsに追加し、Apacheを再起動する(リロードしない)ことです。
umask 002
これにより、Apacheはデフォルトで664としてファイルを作成します。これ自体、セキュリティ上のリスクをもたらす可能性があります。ただし、ここで主に説明されているLaravel環境(Homestead、Vagrant、Ubuntu)では、Webサーバーはwww-dataグループのユーザーwww-dataとして実行されます。したがって、ユーザーがwww-dataグループへの参加を勝手に許可しない場合、追加のリスクはありません。誰かがWebサーバーから抜け出すことができたとしても、いずれにしてもwww-dataアクセスレベルを持っているので、何も失われません(ただし、セキュリティに関係することは明らかに最善の態度ではありません)。したがって、本番環境では比較的安全であり、シングルユーザー開発マシンでは問題になりません。
最終的にユーザーがwww-dataグループに属し、これらのファイルを含むすべてのディレクトリがg + s(ファイルは常に親ディレクトリのグループの下に作成されます)であるため、ユーザーまたはwww-dataによって作成されたものはすべてr /になります。他のw。
そして、それがここの目的です。
編集する
上記の方法でアクセス許可をさらに設定することを検討すると、それでも十分に見えますが、いくつかの微調整が役立ちます。
デフォルトでは、ディレクトリは775、ファイルは664で、すべてのファイルには、フレームワークをインストールしたばかりのユーザーの所有者とグループがあります。したがって、その時点から始めると仮定します。
cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./
私たちが最初に行うことは、他の全員へのアクセスをブロックし、グループをwww-dataにすることです。www-dataの所有者とメンバーのみがディレクトリにアクセスできます。
sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache
公式のLaravelインストールガイドで提案されているように、ウェブサーバーがservices.jsonとcompiled.phpを作成できるようにします。グループのスティッキービットを設定すると、これらはwww-dataのグループを持つ作成者によって所有されます。
find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage
キャッシュ、ログ、セッション、ビューファイルの作成を可能にするために、ストレージフォルダーでも同じことを行います。findを使用して、ディレクトリとファイルに対して異なる方法でディレクトリのアクセス許可を明示的に設定します。(通常は)サブディレクトリがないため、ブートストラップ/キャッシュでこれを行う必要はありませんでした。
phpunitなどへのリンクを再作成するには、実行可能フラグを再適用し、vendor / *を削除してcomposer依存関係を再インストールする必要がある場合があります。例:
chmod +x .git/hooks/*
rm vendor/*
composer install -o
それでおしまい。上で説明したApacheのumaskを除いて、これは、プロジェクトルート全体をwww-dataで書き込み可能にすることなく必要なすべてです。これは、他のソリューションで発生することです。したがって、www-dataとして実行されている侵入者の書き込みアクセスが制限されるという点で、この方法はわずかに安全です。
編集を終了
Systemdの変更
これはphp-fpmの使用に適用されますが、他の場合も同様です。
標準のsystemdサービスを上書きし、override.confファイルにumaskを設定して、サービスを再起動する必要があります。
sudo systemctl edit php7.0-fpm.service
Use:
[Service]
UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service
777
すべての人のすべての権限が含まれているため、自由が多すぎると思います。