Web

Как настроить права доступа к файлам в Laravel?

Я использую веб-сервер Apache, для которого установлен владелец _www:_www. Я не знаю, как лучше всего использовать права доступа к файлам, например, когда я создаю новый проект Laravel.

Laravel требует, чтобы /storage папка была доступна для записи. Я нашел множество разных подходов, чтобы заставить это работать, и обычно заканчиваю тем, что делаю 777 chmod рекурсивно. Но я знаю, что это не лучшая идея.

В официальном документе говорится:

Laravel может потребовать настройки некоторых разрешений: для папок внутри storage и vendor для доступа на запись с веб-сервера.

 

 

Означает ли это, что веб-сервер должен иметь доступ к папкам storage и vendor тоже или только к их текущему содержанию?

Я предполагаю, что гораздо лучше смена владельца вместо разрешений. Я рекурсивно изменил все права доступа к файлам Laravel на _www:_www,и это заставило сайт работать правильно, как если бы я изменил chmod на 777. Проблема в том, что теперь мой текстовый редактор запрашивает пароль каждый раз, когда я хочу сохранить какой-либо файл, и то же самое происходит, если я пытаюсь что-либо изменить в Finder, например, скопировать файл.

Как правильно решить эти проблемы?

  1. Изменить chmod

  2. Изменить владельца файлов, чтобы он соответствовал владельцу веб-сервера, и, возможно, настроить текстовый редактор (и Finder?), чтобы не запрашивать пароль, или заставить их использовать sudo

  3. Изменить владельца веб-сервера, чтобы он соответствовал пользователю ОС (я не знаю, какие будут последствия)

  4. Что-то другое

 

Ответ 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

Как подключиться к нескольким базам данных MySQL на одной веб-странице

Web

Передача массива в запрос с помощью предложения WHERE

Web

Ошибка построения модели и контроллера в моем проекте веб-сайта

Web

Сохранение изображения из URL-адреса в PHP