Права доступа к файлам для Laravel 5 (и других)
Я использую веб-сервер Apache, у которого установлен владелец _www:_www
. Я никогда не знаю, что лучше всего делать с разрешениями файлов, например, при создании нового проекта Laravel 5.
Laravel 5 требует /storage
папка для записи. Я нашел много разных подходов, чтобы заставить его работать, и я обычно заканчиваю тем, что делаю это 777
команду chmod рекурсивно. Я знаю, что это не лучшая идея.
официальный док говорит:
что Laravel может требуется настроить некоторые разрешения: папки внутри
storage
иvendor
требуется доступ на запись веб-сервером.
означает ли это, что веб-серверу нужен доступ к storage
и vendor
сами папки тоже или только их текущее содержимое?
Я предполагаю, что то, что намного лучше, меняет владелец вместо разрешения. Я изменил все разрешения файлов Laravel рекурсивно на _www:_www
и это делает работу сайта правильно, как будто я изменил chmod на 777
. Проблема в том, что теперь мой текстовый редактор запрашивает пароль каждый раз, когда я хочу сохранить какой-либо файл, и то же самое происходит, если я пытаюсь изменить что-либо в Finder, например, скопировать файл.
каков наиболее популярный подход к решению этих проблем?
- изменить
chmod
- сменить владельца файлов совпадают
веб-сервер и, возможно, установить текстовый редактор (и искатель?) скакать
запрос пароля, или сделать их использовать
sudo
- измените владельца веб-сервера в соответствии с пользователем ОС (я не знаю последствия)
- что-то другое
12 ответов
просто констатировать очевидное для любого просмотра этого обсуждения.... если вы даете любой из ваших папок 777 разрешений, вы позволяете любому читать, писать и выполнять любой файл в этом каталоге.... это означает, что вы дали кому-либо (любому хакеру или злоумышленнику во всем мире) разрешение загрузить любой файл, вирус или любой другой файл, а затем выполнить этот файл...
ЕСЛИ ВЫ УСТАНАВЛИВАЕТЕ ПРАВА ДОСТУПА К ПАПКЕ 777, ВЫ ОТКРЫЛИ СЕРВЕР ЛЮБОЙ, КТО МОЖЕТ НАЙТИ ЭТОТ КАТАЛОГ. Достаточно ясно??? :)
есть в основном два способа настройки вашего владения и разрешений. Либо вы даете себе право собственности, либо вы делаете веб-сервер владельцем всех файлов.
веб-сервер как владелец (как большинство людей это делают):
предполагая, что 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 (это бродяга, если вы используете 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 {} \;
ваш пользователь, как владелец
Я предпочитаю владеть всеми каталогами и файлами (это упрощает работу со всем), поэтому я делаю:
sudo chown -R my-user:www-data /path/to/your/laravel/root/directory
тогда я даю как себе, так и веб-серверу разрешения:
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \; sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
дать веб-серверу права на чтение и запись в хранилище и кэш
как бы вы ни настроили его, затем вам нужно предоставить разрешения на чтение и запись на веб-сервер для хранения, кэширования и любых других каталогов, которые веб-сервер должен загрузить или написать (в зависимости от вашей ситуации), поэтому выполните команды из bashy выше :
sudo chgrp -R www-data storage bootstrap/cache sudo chmod -R ug+rwx storage bootstrap/cache
теперь вы в безопасности и ваш сайт работает, и вы можете работать с файлами достаточно легко
разрешения storage
и vendor
папки должны остаться в 775
, по понятным причинам безопасности.
однако и ваш компьютер, и ваш сервер Apache должны иметь возможность писать в этих папках. Пример: при выполнении команд типа php artisan
, ваш компьютер должен записать в файл журналов в storage
.
все, что вам нужно сделать, это дать право собственности на папки Апача :
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
Примечание: часто groupName
и www-data
но в вашем случае, заменить его _www
измените разрешения для папки проекта, чтобы включить чтение / запись / exec для любого пользователя в группе, владеющей каталогом (который в вашем случае _www
):
chmod -R 775 /path/to/your/project
затем добавьте свое имя пользователя OS X в _www
group, чтобы разрешить ему доступ к каталогу:
sudo dseditgroup -o edit -a yourusername -t user _www
мы столкнулись со многими крайними случаями при настройке разрешений для приложений Laravel. Мы создаем отдельную учетную запись (deploy
) для владения папкой приложения Laravel и выполнения команд Laravel из CLI и запуска веб-сервера под www-data
. Одна из проблем заключается в том, что файл(ы) журнала может принадлежать www-data
или deploy
, в зависимости от того, кто написал в файл журнала первым, очевидно, не позволяя другому пользователю писать в него в будущем.
я нашел что единственным разумным и безопасным решением является использование Linux ACLs. Цель этого решения:
- чтобы разрешить пользователю, который владеет / развертывает приложение, доступ для чтения и записи кода приложения Laravel (мы используем пользователя с именем
deploy
). - разрешить
www-data
доступ пользователя для чтения кода приложения Laravel, но не для записи. - чтобы запретить другим пользователям доступ к коду/данным приложения Laravel вообще.
- чтобы разрешить the
www-data
пользователь и пользователь приложения (deploy
) запись доступа к папке хранения, независимо от того, какой пользователь владеет файлом (так что обаdeploy
иwww-data
можно писать в тот же файл журнала, например).
мы делаем это следующим образом:
- все файлы внутри
application/
папка создается с umask по умолчанию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
user только для чтения и удалить все разрешения для любых других пользователей. -
setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
установить права по умолчанию наstorage/
папка и все подпапки. Любые новые папки/файлы, созданные в папке хранения, унаследуют эти разрешения (rwx
какwww-data
иdeploy
). -
setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
чтобы установить вышеуказанные разрешения для любых существующих файлов / папок.
Как написал уже
все, что вам нужно сделать, это дать право собственности на папки Апача :
но я добавил - R на Чаун :
sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage
большинство папок должны быть нормальными " 755 "и файлами,"644"
Laravel требует, чтобы некоторые папки были доступны для записи для пользователя веб-сервера. Эту команду можно использовать в ОС на базе unix.
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
решение, опубликованное 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.
это можно частично смягчить, запустив команды 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 и добавить следующее в /etc/apache2 / envvars и перезапустить (не перезагружать) Apache:
umask 002
это заставит Apache создавать файлы как 664 по умолчанию. Само по себе это может представлять угрозу безопасности. Тем не менее, на Laravel среды в основном обсуждаются здесь (Усадьба, Бродяга, Ubuntu) веб-сервер работает как пользователь www-data в группе www-data. Поэтому, если вы произвольно не разрешаете пользователям присоединяться к группе www-data, дополнительного риска быть не должно. Если кому-то удается вырваться из веб-сервера, у них все равно есть уровень доступа к данным www, поэтому ничего не теряется (хотя это не лучшее отношение к безопасности). Так на продукции относительно безопасно, и на однопользовательской машине развития, это просто не проблема.
в конечном счете, поскольку ваш пользователь находится в группе 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
чтобы сервер создать услуги.json и составленный.php, как предложено официальным руководством по установке Laravel. Установка группового липкого бита означает, что они будут принадлежать создателю с группой www-данных.
find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage
мы делаем то же самое с папкой хранения, чтобы разрешить создание кэша, журнала, сеанса и просмотра файлов. Мы используем find для явного задания разрешений каталога по-разному для каталогов и файлов. Нам не нужно было делать это в bootstrap / cache, поскольку (обычно) нет подкаталогов в там.
вам может потребоваться повторно применить любые исполняемые флаги и удалить поставщика / * и переустановить зависимости композитора для воссоздания ссылок для phpunit и др., Например:
chmod +x .git/hooks/*
rm vendor/*
composer install -o
Я решил написать свой собственный сценарий, чтобы облегчить боль от настройки проектов.
выполните следующие действия в корне проекта:
wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh
дождитесь завершения начальной загрузки, и вы можете идти.
обзор скрипта перед использованием.
на Laravel 5.4 docs говорят:
после установки Laravel вам может потребоваться настроить некоторые разрешения. Каталоги внутри
storage
иbootstrap/cache
каталоги должен быть доступен для записи на вашем веб-сервере или Laravel не будет работать. Если вы при использовании виртуальной машины Homestead эти разрешения должны уже готово.
на этой странице есть много ответов, в которых упоминается использование 777
разрешения. не делай этого. ты выставляя себя хакеров.
вместо этого следуйте предложениям других о том, как установить разрешения 755 (или более ограничительные). Вам может потребоваться выяснить, какой пользователь работает в вашем приложении, запустив whoami
в терминале, а затем изменить право собственности на определенные каталоги с помощью chown -R
.
если у вас нет разрешения на использование sudo
как и многие другие ответы требуют...
ваш сервер, вероятно, является общим хостом, таким как Cloudways.
(в моем случае я клонировал свое приложение Laravel на второй сервер Cloudways, и он не работал полностью, потому что разрешения storage
и bootstrap/cache
каталоги были перепутаны.)
мне нужно использовать:
Cloudways Platform > Server > Application Settings > Reset Permission
тогда я мог бы запустить php artisan cache:clear
в терминале.
Я установил laravel на экземпляр EC2 и потратил 3 дня, чтобы исправить ошибку разрешения и, наконец, исправил ее. Поэтому я хочу поделиться этим опытом с другим.
проблемы пользователей Когда я вошел в экземпляр ec2, мое имя пользователя ec2-user и usergroup-ec2-user. И сайт работает под httpd пользователя: apache: apache поэтому мы должны установить разрешение для apache.
-
разрешение папки и файла А. структура папок во-первых, вы следует убедиться, что у вас есть такая структура папок, как это в разделе storage
для хранения
- основы
- кэш
- сеансы
- вид
- журналы Структура папок может отличаться в зависимости от используемой версии laravel. моя версия laravel-5.2, и вы можете найти соответствующую структуру в соответствии с вашей версией.
- основы
разрешения Б. На во-первых, я вижу инструкции по установке 777 в хранилище для удаления file_put_contents: не удалось открыть ошибку потока. Поэтому я настраиваю разрешение 777 на хранение команду chmod -Р хранения 777 Но ошибка не была исправлена. здесь вы должны рассмотреть один: кто записывает файлы в хранилище / сеансы и представления. Это не ec2-пользователь, а apache. Да, конечно. пользователь "apache" записывает файл (файл сеанса, скомпилированный файл представления) в папку сеанса и представления. Поэтому вы должны дать apache разрешение на запись в эту папку. От по умолчанию: SELinux говорит, что папка /var/www должна быть доступна только для чтения apache deamon.
поэтому для этого мы можем установить selinux как 0: setenforce 0
Это может решить проблему временно, но это делает MySQL не работает. так что это не очень хорошее решение.
вы можете установить контекст чтения-записи в папку хранения с: (не забудьте setenforce 1, чтобы проверить его)
chcon -Rt httpd_sys_content_rw_t storage/
тогда ваша проблема будет зафиксированный.
-
и не забывайте, что это обновление композитор php artisan кэш: очистить
эти команды будут полезны после или перед.
надеюсь, вы сэкономите свое время. Удача. Хакен!--2-->
добавить в composer.в JSON
"scripts": {
...
"post-update-cmd": [
"chmod -R 777 storage",
"chmod -R 775 bootstrap/cache",
"chmod 775 vendor"
]
...
}
после composer update
Я нашел еще лучшее решение для этого. Это вызвано тем, что php работает как другой пользователь по умолчанию.
Так что исправить это сделать
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
затем измените
user = "put user that owns the directories"
group = "put user that owns the directories"
затем:
sudo systemctl reload php7.0-fpm