Giải pháp được đăng bởi bgles là tại chỗ đối với tôi về mặt thiết lập quyền chính xác ban đầu (tôi sử dụng phương pháp thứ hai), nhưng nó vẫn có vấn đề tiềm ẩn đối với Laravel.
Theo mặc định, Apache sẽ tạo các tệp có 644 quyền. Vì vậy, đó là khá nhiều bất cứ điều gì trong lưu trữ /. Vì vậy, nếu bạn xóa nội dung lưu trữ / khung / khung nhìn, sau đó truy cập một trang thông qua Apache, bạn sẽ thấy chế độ xem được lưu trong bộ nhớ cache đã được tạo như sau:
-rw-r--r-- 1 www-data www-data 1005 Dec 6 09:40 969370d7664df9c5206b90cd7c2c79c2
Nếu bạn chạy "nghệ nhân phục vụ" và truy cập một trang khác, bạn sẽ nhận được các quyền khác nhau vì CLI PHP hoạt động khác với Apache:
-rw-rw-r-- 1 user www-data 16191 Dec 6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e
Bản thân nó không phải là vấn đề lớn vì bạn sẽ không làm điều này trong sản xuất. Nhưng nếu Apache tạo một tệp mà sau đó người dùng cần phải viết, nó sẽ thất bại. Và điều này có thể áp dụng cho các tệp bộ đệm, chế độ xem và nhật ký được lưu trong bộ nhớ cache khi triển khai bằng người dùng và nghệ nhân đã đăng nhập. Một ví dụ dễ hiểu là "artisan cache: clear" sẽ không xóa bất kỳ tệp bộ đệm nào là www-data: www-data 644.
Điều này có thể được giảm thiểu một phần bằng cách chạy các lệnh thủ công dưới dạng dữ liệu www, vì vậy bạn sẽ thực hiện / viết kịch bản mọi thứ như:
sudo -u www-data php artisan cache:clear
Hoặc bạn sẽ tránh sự tẻ nhạt của điều này và thêm nó vào .bash_aliases của bạn:
alias art='sudo -u www-data php artisan'
Điều này là đủ tốt và không ảnh hưởng đến an ninh dưới bất kỳ hình thức nào. Nhưng trên các máy phát triển, việc chạy các kịch bản kiểm tra và vệ sinh khiến việc này trở nên khó sử dụng, trừ khi bạn muốn thiết lập bí danh để sử dụng 'sudo -u www-data' để chạy phpunit và mọi thứ khác mà bạn kiểm tra các bản dựng của mình có thể khiến các tệp được tạo.
Giải pháp là làm theo phần thứ hai của lời khuyên của bgles và thêm phần sau vào / etc / apache2 / envvars và khởi động lại (không tải lại) Apache:
umask 002
Điều này sẽ buộc Apache tạo các tệp theo 664 theo mặc định. Trong chính nó, điều này có thể gây ra rủi ro bảo mật. Tuy nhiên, trên các môi trường Laravel chủ yếu được thảo luận ở đây (Homestead, Vagrant, Ubuntu), máy chủ web chạy dưới dạng dữ liệu www của người dùng trong dữ liệu www của nhóm. Vì vậy, nếu bạn không tự ý cho phép người dùng tham gia nhóm dữ liệu www, sẽ không có rủi ro bổ sung. Nếu ai đó quản lý thoát ra khỏi máy chủ web, dù sao họ cũng có cấp truy cập dữ liệu www nên không có gì bị mất (mặc dù đó không phải là thái độ tốt nhất để liên quan đến bảo mật được thừa nhận). Vì vậy, về sản xuất, nó tương đối an toàn và trên một máy phát triển một người dùng, đó không phải là vấn đề.
Cuối cùng, khi người dùng của bạn thuộc nhóm dữ liệu www và tất cả các thư mục chứa các tệp này là g + s (tệp luôn được tạo trong nhóm của thư mục mẹ), mọi thứ được tạo bởi người dùng hoặc bởi dữ liệu www sẽ là r / w cho người khác.
Và đó là mục đích ở đây.
biên tập
Khi nghiên cứu cách tiếp cận ở trên để thiết lập quyền hơn nữa, nó vẫn có vẻ đủ tốt, nhưng một vài điều chỉnh có thể giúp:
Theo mặc định, thư mục là 775 và tệp là 664 và tất cả các tệp có chủ sở hữu và nhóm người dùng vừa cài đặt khung. Vì vậy, giả sử chúng ta bắt đầu từ thời điểm đó.
cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./
Điều đầu tiên chúng tôi làm là chặn quyền truy cập vào những người khác và biến nhóm thành dữ liệu www. Chỉ chủ sở hữu và các thành viên của dữ liệu www có thể truy cập vào thư mục.
sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache
Để cho phép máy chủ web tạo services.json và comp.php, như được đề xuất bởi hướng dẫn cài đặt chính thức của Laravel. Đặt bit dính nhóm có nghĩa là những thứ này sẽ được sở hữu bởi người tạo với một nhóm dữ liệu www.
find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage
Chúng tôi làm điều tương tự với thư mục lưu trữ để cho phép tạo bộ đệm, nhật ký, phiên và xem tệp. Chúng tôi sử dụng find để thiết lập rõ ràng các quyền thư mục khác nhau cho các thư mục và tệp. Chúng tôi không cần phải làm điều này trong bootstrap / cache vì không có (thường) bất kỳ thư mục con nào trong đó.
Bạn có thể cần phải áp dụng lại bất kỳ cờ thực thi nào và xóa nhà cung cấp / * và cài đặt lại các phụ thuộc của trình soạn thảo để tạo lại các liên kết cho phpunit et al, ví dụ:
chmod +x .git/hooks/*
rm vendor/*
composer install -o
Đó là nó. Ngoại trừ cái ô cho Apache đã giải thích ở trên, đây là tất cả những gì cần thiết mà không làm cho toàn bộ dự án có thể ghi được bằng dữ liệu www, đó là những gì xảy ra với các giải pháp khác. Vì vậy, nó an toàn hơn một chút theo cách này khi kẻ xâm nhập chạy dưới dạng dữ liệu www có quyền truy cập ghi hạn chế hơn.
kết thúc chỉnh sửa
Thay đổi cho Systemd
Điều này áp dụng cho việc sử dụng php-fpm, nhưng có lẽ những người khác cũng vậy.
Dịch vụ systemd tiêu chuẩn cần được ghi đè, ô được đặt trong tệp override.conf và dịch vụ được khởi động lại:
sudo systemctl edit php7.0-fpm.service
Use:
[Service]
UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service
777
là quá nhiều tự do, bởi vì nó bao gồm tất cả các quyền cho tất cả mọi người.