Я использую веб-сервер Apache, для которого установлен владелец _www:_www. Я не знаю, как лучше всего использовать права доступа к файлам, например, когда я создаю новый проект Laravel.
Laravel требует, чтобы /storage папка была доступна для записи. Я нашел множество разных подходов, чтобы заставить это работать, и обычно заканчиваю тем, что делаю 777 chmod рекурсивно. Но я знаю, что это не лучшая идея.
В официальном документе говорится:
Laravel может потребовать настройки некоторых разрешений: для папок внутри storage и vendor для доступа на запись с веб-сервера.
Означает ли это, что веб-сервер должен иметь доступ к папкам storage и vendor тоже или только к их текущему содержанию?
Я предполагаю, что гораздо лучше смена владельца вместо разрешений. Я рекурсивно изменил все права доступа к файлам Laravel на _www:_www,и это заставило сайт работать правильно, как если бы я изменил chmod на 777. Проблема в том, что теперь мой текстовый редактор запрашивает пароль каждый раз, когда я хочу сохранить какой-либо файл, и то же самое происходит, если я пытаюсь что-либо изменить в Finder, например, скопировать файл.
Как правильно решить эти проблемы?
Изменить chmod
Изменить владельца файлов, чтобы он соответствовал владельцу веб-сервера, и, возможно, настроить текстовый редактор (и Finder?), чтобы не запрашивать пароль, или заставить их использовать sudo
Изменить владельца веб-сервера, чтобы он соответствовал пользователю ОС (я не знаю, какие будут последствия)
Что-то другое
Ответ 1
Если вы установили права 777 на любую из ваших папок, вы разрешаете ЛЮБОМУ читать, писать и исполнять любой файл в этой директории — это значит, что любой хакер или злоумышленник во всем мире имеет разрешение загрузить ЛЮБОЙ файл или вирус, а затем исполнить его.
ЕСЛИ ВЫ УСТАНАВЛИВАЕТЕ РАЗРЕШЕНИЯ 777 НА ПАПКУ, ВЫ ОТКРЫВАЕТЕ СВОЙ СЕРВЕР ДЛЯ ЛЮБОГО, КТО МОЖЕТ НАЙТИ ЭТУ ДИРЕКТОРИЮ.
Есть два способа установить права доступа и разрешения. Либо вы назначаете владельцем себя, либо вы делаете веб-сервер владельцем всех файлов.
Веб-сервер как владелец (способ, которым пользуется большинство людей, и способ, описанный в Laravel doc):
Предположим, что www-data (может быть что-то другое) — это пользователь вашего веб-сервера.
sudo chown -R www-data:www-data /path/to/your/laravel/root/directory
Если вы сделаете это, веб-сервер будет владеть всеми файлами, а также группой, и у вас возникнут проблемы с загрузкой файлов или работой с файлами через FTP, потому что ваш FTP-клиент будет входить в систему как вы, а не как веб-сервер, поэтому добавьте своего пользователя в группу пользователей веб-сервера:
sudo usermod -a -G www-data ubuntu
Конечно, это предполагает, что ваш веб-сервер работает под именем www-data (Homestead по умолчанию), а ваш пользователь — ubuntu (это vagrant, если вы используете Homestead).
Затем вы устанавливаете разрешения для всех ваших каталогов 755, а для файлов — 644…
Устанавливаем разрешения на файлы:
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 644 {} \;
Устанавливаем права доступа к каталогам:
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 755 {} \;
Я предпочитаю быть владельцем всех каталогов и файлов (это значительно упрощает работу), поэтому перейдите в корневой каталог laravel:
cd /var/www/html/laravel >>
предполагая, что это ваш текущий корневой каталог:
sudo chown -R $USER:www-data.
Затем я даю разрешения и себе, и веб-серверу:
sudo find . -type f -exec chmod 664 {} \;
sudo find . -type d -exec chmod 775 {} \;
Затем дайте веб-серверу права на чтение и запись в хранилище и кэш.
Какой бы способ вы ни выбрали, вам нужно дать веб-серверу права на чтение и запись в хранилище, кэш и любые другие каталоги, в которые веб-серверу нужно загружать или записывать (в зависимости от ситуации), поэтому выполните команды из bash:
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
Теперь вы в безопасности, ваш сайт работает, и вы можете работать с файлами довольно легко.
Ответ 2
Разрешения для папок storage и vendor должны оставаться 775 по очевидным соображениям безопасности.
Однако и ваш компьютер, и ваш сервер Apache должны иметь возможность записи в эти папки. Например: когда вы запускаете такие команды, как php artisan, ваш компьютер должен записывать в файл журнала в storage.
Все, что вам нужно сделать, — это передать права доступа на папки Apache:
sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage
Затем вам нужно добавить своего пользователя (на которого он ссылается username) в группу, к которой принадлежит сервер Apache. Вот так:
sudo usermod -a -G www-data userName
Чаще всего используется имя группы, www-data, но в вашем случае замените его на_www.
Ответ 3
Мы столкнулись с множеством нестандартных ситуаций при настройке прав доступа для приложений Laravel. Мы создаем отдельную учетную запись пользователя (deploy) для владения папкой приложения Laravel и выполнения команд Laravel из CLI, а веб-сервер запускаем под www-data. Одна из проблем, которую это вызывает, заключается в том, что файл(ы) журнала могут принадлежать www-data или deploy, в зависимости от того, кто первым записал в файл журнала, что, очевидно, не позволит другому пользователю писать в него в будущем.
Я обнаружил, что единственным разумным и безопасным решением является использование Linux ACLs. Цель этого решения заключается в следующем:
Предоставить пользователю, который владеет/развертывает приложение, доступ на чтение и запись к коду приложения Laravel (мы используем пользователя с именем deploy).
Разрешить пользователю www-data доступ на чтение к коду приложения Laravel, но не на запись.
Запретить другим пользователям доступ к коду/данным приложения Laravel вообще.
Разрешить пользователю www-data и пользователю приложения (deploy) доступ на запись в папку хранения, независимо от того, кто из пользователей владеет файлом (например, чтобы и deploy, и www-data могли писать в один и тот же файл журнала).
Мы добиваемся этого следующим образом:
Все файлы в папке application создаются с маской по умолчанию 0022, в результате чего папки имеют права drwxr-xr-x, а файлы — -rw-r--r--.
sudo chown -R deploy:deploy application
(или просто разверните ваше приложение под пользователем deploy, что мы и делаем).
chgrp www-data application/,
чтобы дать группе www-data доступ к приложению.
chmod 750 application/,
чтобы разрешить пользователю deploy чтение/запись, пользователю www-data — только чтение, и удалить все разрешения для любых других пользователей.
setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/,
чтобы установить разрешения по умолчанию для папки storage/ и всех вложенных папок. Любые новые папки/файлы, созданные в папке storage, унаследуют эти разрешения (rwx для www-data и deploy).
setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/,
чтобы установить вышеуказанные разрешения для всех существующих файлов/папок.
Web