Рішення, розміщене bgles, є для мене місцем з точки зору правильного встановлення дозволів спочатку (я використовую другий метод), але це все ще має потенційні проблеми для Laravel.
За замовчуванням Apache створить файли з 644 дозволами. Тож це майже все на зберіганні /. Отже, якщо ви видалите вміст сховища / фреймворка / переглядів, то відкрийте сторінку через 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 створить файл, який згодом повинен бути записаний користувачем, він вийде з ладу. І це може стосуватися кеш-файлів, кешованих представлень та журналів під час розгортання з використанням зареєстрованого користувача та ремісника. Чудовий приклад "кеш-ремесла: очистити", який не зможе видалити файли кешу, що є www-data: www-data 644.
Це можна частково пом'якшити, виконавши команди ремісників як 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 порад та додати наступне до / etc / apache2 / envvars та перезапустити (не перезавантажувати) Apache:
umask 002
Це змусить Apache створити файли як 664 за замовчуванням. Саме по собі це може становити ризик для безпеки. Однак у середовищах Laravel, про які переважно йде мова (Homestead, Vagrant, Ubuntu), веб-сервер працює як www-дані користувача під груповими www-data. Отже, якщо ви не дозволите довільно долучати користувачів до групи даних www, даних додаткового ризику не повинно бути. Якщо комусь вдається вирватися з веб-сервера, він все одно має рівень доступу до даних www, тому нічого не втрачається (хоча це, мабуть, не найкраще ставитись до безпеки). Тож на виробництві це відносно безпечно, а на машині розвитку для одного користувача це просто не проблема.
Зрештою, оскільки ваш користувач знаходиться у групі даних www, а всі каталоги, що містять ці файли, є 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
Дозволити веб-серверу створити services.json та compiled.php, як це запропоновано в офіційному посібнику з встановлення Laravel. Встановлення липкого біту групи означає, що їм належить творець із групою 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 та ін, наприклад:
chmod +x .git/hooks/*
rm vendor/*
composer install -o
Це воно. За винятком поясненого вище umask для Apache, це все, що потрібно, не роблячи всю проектну кореневу програму за допомогою www-data, що саме відбувається з іншими рішеннями. Тож це гранично безпечніше таким чином, коли зловмисник, що працює як www-data, має обмежений доступ для запису.
завершити редагування
Зміни для Systemd
Це стосується використання php-fpm, але, можливо, і інших.
Стандартну службу systemd потрібно скасувати, встановити umask у файлі override.conf, і служба перезапустити:
sudo systemctl edit php7.0-fpm.service
Use:
[Service]
UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service
777
це занадто велика свобода, оскільки вона включає всі дозволи для всіх.