Estou usando o Apache Web Server com o proprietário definido _www:_www
. Nunca sei qual é a melhor prática com permissões de arquivo, por exemplo, quando crio o novo projeto do Laravel 5.
O Laravel 5 requer que a /storage
pasta seja gravável. Eu encontrei muitas abordagens diferentes para fazê-lo funcionar e geralmente termino fazendo-o 777
chmod recursivamente. Sei que não é a melhor ideia.
O documento oficial diz:
O Laravel pode exigir que algumas permissões sejam configuradas: pastas dentro
storage
evendor
exigir acesso de gravação pelo servidor da web.
Isso significa que o servidor da Web também precisa acessar as próprias pastas storage
e vendor
ou apenas o conteúdo atual?
Presumo que o que é muito melhor, está mudando o proprietário em vez de permissões. Alterei recursivamente todas as permissões de arquivos do Laravel _www:_www
e isso fez o site funcionar corretamente, como se eu tivesse mudado o chmod para 777
. O problema é que agora meu editor de texto solicita uma senha sempre que eu quero salvar qualquer arquivo e o mesmo acontece se eu tentar alterar alguma coisa no Finder, como por exemplo copiar um arquivo.
Qual é a abordagem correta para resolver esses problemas?
- mudança
chmod
- Altere o proprietário dos arquivos para coincidir com os do servidor da web e talvez defina o editor de texto (e o Finder?) Para ignorar a solicitação de senha ou usá-los
sudo
- Mude o proprietário do servidor da web para corresponder ao usuário do sistema operacional (não sei as consequências)
- Algo mais
777
é muita liberdade, porque inclui todas as permissões para todos.storage
e nosbootstrap/cache
diretórios devem ser graváveis pelo seu servidor webRespostas:
Apenas para declarar o óbvio para qualquer pessoa que esteja visualizando esta discussão .... se você der permissões a qualquer uma das suas pastas 777, estará permitindo que ALGUÉM leia, escreva e execute qualquer arquivo nesse diretório .... o que isso significa é que você forneceu QUALQUER PESSOA (qualquer hacker ou pessoa mal-intencionada em todo o mundo) permissão para fazer upload de QUALQUER arquivo, vírus ou qualquer outro arquivo e, em seguida, executar esse arquivo ...
Existem basicamente duas maneiras de configurar sua propriedade e permissões. Você se torna proprietário ou torna o servidor da web o proprietário de todos os arquivos.
Servidor Web como proprietário (da maneira que a maioria das pessoas faz e da maneira do documento do Laravel):
assumindo que www-data (poderia ser outra coisa) é o usuário do servidor da web.
se você fizer isso, o servidor da web possui todos os arquivos, e também é o grupo, e você terá alguns problemas ao fazer o upload de arquivos ou ao trabalhar com arquivos via FTP, porque o seu cliente FTP efetuará login como você, não como seu servidor da Web. seu usuário ao grupo de usuários do servidor da web:
Obviamente, isso pressupõe que seu servidor da web esteja sendo executado como www-data (o padrão Homestead) e seu usuário é ubuntu (é vago se você estiver usando o Homestead).
Em seguida, você define todos os seus diretórios para 755 e seus arquivos para 644 ... SET permissões de arquivo
Permissões do diretório SET
Seu usuário como proprietário
Prefiro possuir todos os diretórios e arquivos (isso facilita muito o trabalho), então faço:
Então, eu concedo a mim e ao servidor da web permissões:
Em seguida, conceda ao servidor da web o direito de ler e gravar no armazenamento e no cache
Qualquer que seja a forma de configuração, você precisa conceder permissões de leitura e gravação ao servidor da Web para armazenamento, cache e quaisquer outros diretórios que o servidor da Web precise carregar ou gravar também (dependendo da sua situação); portanto, execute os comandos do bashy acima:
Agora, você está seguro e seu site funciona, E você pode trabalhar com os arquivos com bastante facilidade
fonte
anyone
conceito. Aanyone
bandeira do Linux significa qualquer usuário , não qualquer pessoa. Você ainda precisa de acesso ao servidor.write
permissão ao grupo?As permissões para as pastas
storage
evendor
devem permanecer em775
, por razões óbvias de segurança.No entanto, tanto o seu computador quanto o servidor Apache precisam ser capazes de escrever nessas pastas. Ex: quando você executa comandos como
php artisan
, seu computador precisa gravar no arquivo de logsstorage
.Tudo que você precisa fazer é atribuir a propriedade das pastas ao Apache:
Então você precisa adicionar seu computador (referenciado por ele
username
) ao grupo ao qual o servidor Apache pertence. Igual a :NOTA: Na maioria das vezes,
groupName
éwww-data
mas no seu caso, substitua-o_www
fonte
chown
comandos devem incluir o sinalizador -R. Além disso, no laravel 5.1 e 5.2, em vez do diretório do fornecedor, você deve dar acesso ao diretório bootstrap / cache.Nós encontramos muitos casos extremos ao configurar permissões para aplicativos Laravel. Criamos uma conta de usuário separada (
deploy
) para possuir a pasta do aplicativo Laravel e executar comandos do Laravel a partir da CLI, e executamos o servidor web emwww-data
. Um problema que isso causa é que o (s) arquivo (s) de log podem pertencer a,www-data
oudeploy
, dependendo de quem escreveu o arquivo de log primeiro, obviamente impedindo que o outro usuário o grave no futuro.Descobri que a única solução sã e segura é usar ACLs do Linux. O objetivo desta solução é:
deploy
).www-data
usuário acesso de leitura ao código do aplicativo Laravel, mas não acesso de gravação.www-data
usuário eo usuário do aplicativo (deploy
) acesso de gravação para a pasta de armazenamento, independentemente de qual usuário possui o arquivo (assim tantodeploy
ewww-data
pode escrever para o mesmo arquivo de log, por exemplo).Realizamos isso da seguinte maneira:
application/
pasta são criados com o umask padrão0022
, o que resulta em pastas comdrwxr-xr-x
permissões e arquivos-rw-r--r--
.sudo chown -R deploy:deploy application/
(ou simplesmente implante seu aplicativo comodeploy
usuário, e é isso que fazemos).chgrp www-data application/
para dar aowww-data
grupo acesso ao aplicativo.chmod 750 application/
para permitir adeploy
leitura / gravação dowww-data
usuário, somente leitura e remover todas as permissões para outros usuários.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
para definir as permissões padrão nastorage/
pasta e em todas as subpastas. Quaisquer novas pastas / arquivos criados na pasta de armazenamento herdarão essas permissões (rwx
para amboswww-data
edeploy
).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
para definir as permissões acima em qualquer arquivo / pasta existente.fonte
Altere as permissões da pasta do projeto para ativar a leitura / gravação / exec para qualquer usuário dentro do grupo que possui o diretório (que no seu caso é
_www
):Em seguida, adicione seu nome de usuário do OS X ao
_www
grupo para permitir que ele acesse o diretório:fonte
dseditgroup
fornecido por você, eu estou recebendo um erro:Username and password must be provided.
.sudo
no início._www:_www
oumyuser:_www
também?_www:_www
, porque 775 significa que qualquer usuário do grupo_www
terá permissões totais para ler / gravar / sair nessa pasta e você acabou de adicionar seu nome de usuário a esse grupo.chown myuser:_www
? Sei que o primeiro é o usuário e o segundo é o grupo, mas significa "esse usuário E QUALQUER PESSOA DO GRUPO" ou "esse usuário, MAS SOMENTE SE Pertencer a esse grupo"?Como já publicado
mas eu adicionei -R para o comando chown :
sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
fonte
A maioria das pastas deve ser "755" normal e arquivos, "644"
O Laravel exige que algumas pastas sejam graváveis para o usuário do servidor web. Você pode usar este comando em sistemas operacionais baseados em unix.
fonte
Depois de
composer install
fonte
Os documentos do Laravel 5.4 dizem:
Há muitas respostas nesta página que mencionam o uso de
777
permissões. Não faça isso. Você estaria se expondo a hackers.Em vez disso, siga as sugestões de outras pessoas sobre como definir permissões 755 (ou mais restritivas). Pode ser necessário descobrir qual usuário seu aplicativo está executando executando
whoami
no terminal e depois alterar a propriedade de determinados diretórios usandochown -R
.Se você não tem permissão para usar,
sudo
como muitas outras respostas exigem ...Seu servidor provavelmente é um host compartilhado, como o Cloudways.
(No meu caso, eu havia clonado meu aplicativo Laravel em um segundo servidor Cloudways meu e não estava funcionando completamente porque as permissões dos diretórios
storage
ebootstrap/cache
estavam danificadas.)Eu precisava usar:
Cloudways Platform > Server > Application Settings > Reset Permission
Então eu poderia correr
php artisan cache:clear
no terminal.fonte
A solução postada pelo bgles é excelente para mim em termos de configuração correta de permissões inicialmente (eu uso o segundo método), mas ainda tem problemas em potencial para o Laravel.
Por padrão, o Apache criará arquivos com permissões 644. Então, isso é praticamente tudo em armazenamento /. Portanto, se você excluir o conteúdo de storage / framework / views, acesse uma página pelo Apache e verá que a exibição em cache foi criada como:
Se você executar o "artisan serve" e acessar uma página diferente, obterá permissões diferentes porque o CLI PHP se comporta de maneira diferente do Apache:
Por si só, isso não é grande coisa, pois você não fará nada disso na produção. Mas se o Apache criar um arquivo que posteriormente precise ser gravado pelo usuário, ele falhará. E isso pode se aplicar a arquivos em cache, visualizações e logs em cache ao implantar usando um usuário conectado e artesão. Um exemplo fácil é "cache artesanal: limpar", que falhará em excluir os arquivos de cache www-data: www-data 644.
Isso pode ser parcialmente mitigado pela execução de comandos artesanais como www-data, portanto, você estará executando / scripts como:
Ou você evitará o tédio disso e o adicionará às suas .bash_aliases:
Isso é bom o suficiente e não está afetando a segurança de forma alguma. Mas em máquinas de desenvolvimento, a execução de scripts de teste e saneamento torna isso pesado, a menos que você queira configurar aliases para usar 'sudo -u www-data' para executar o phpunit e tudo o mais que você verifica nas suas compilações que pode causar a criação de arquivos.
A solução é seguir a segunda parte do conselho do bgles e adicionar o seguinte ao / etc / apache2 / envvars e reiniciar (não recarregar) o Apache:
Isso forçará o Apache a criar arquivos como 664 por padrão. Em si, isso pode representar um risco de segurança. No entanto, nos ambientes Laravel que estão sendo discutidos aqui (Homestead, Vagrant, Ubuntu), o servidor da Web é executado como usuário www-data no grupo www-data. Portanto, se você não permitir que os usuários participem arbitrariamente do grupo www-data, não haverá riscos adicionais. Se alguém conseguir sair do servidor da Web, ele terá o nível de acesso a dados www de qualquer maneira, para que nada se perca (embora essa não seja a melhor atitude a ter em relação à segurança). Portanto, na produção, é relativamente seguro e, em uma máquina de desenvolvimento de usuário único, isso não é um problema.
Por fim, como o usuário está no grupo www-data, e todos os diretórios que contêm esses arquivos são g + s (o arquivo é sempre criado no grupo do diretório pai), qualquer coisa criada pelo usuário ou pelo www-data será r / w para o outro.
E esse é o objetivo aqui.
editar
Ao investigar a abordagem acima para definir ainda mais as permissões, ela ainda parece boa o suficiente, mas alguns ajustes podem ajudar:
Por padrão, os diretórios são 775 e os arquivos 664 e todos os arquivos têm o proprietário e o grupo do usuário que acabou de instalar a estrutura. Então, assuma que começamos a partir desse ponto.
A primeira coisa que fazemos é bloquear o acesso a todos os outros e tornar o grupo www-data. Somente o proprietário e os membros do www-data podem acessar o diretório.
Para permitir que o servidor web crie services.json e compiled.php, conforme sugerido pelo guia de instalação oficial do Laravel. Definir o bit fixo do grupo significa que eles pertencerão ao criador com um grupo de www-data.
Fazemos o mesmo com a pasta de armazenamento para permitir a criação de cache, log, sessão e exibição de arquivos. Usamos o find para definir explicitamente as permissões de diretório de maneira diferente para diretórios e arquivos. Não precisamos fazer isso no bootstrap / cache, pois não há (normalmente) nenhum subdiretório lá.
Pode ser necessário reaplicar qualquer sinalizador executável e excluir vendor / * e reinstalar as dependências do compositor para recriar links para phpunit et al, por exemplo:
É isso aí. Exceto pelo umask para o Apache explicado acima, isso é tudo o que é necessário sem tornar toda a inicialização do projeto gravável por www-data, que é o que acontece com outras soluções. Portanto, é marginalmente mais seguro dessa maneira, pois um invasor executando como www-data tem acesso de gravação mais limitado.
finalizar edição
Alterações para Systemd
Isso se aplica ao uso de php-fpm, mas talvez outros também.
O serviço systemd padrão precisa ser substituído, o umask definido no arquivo override.conf e o serviço reiniciado:
fonte
Isso funcionou para mim:
O que faz:
Nota: Talvez você não possa, ou não precise, fazê-lo com o prefixo sudo. depende das permissões do seu usuário, grupo, etc ...
fonte
Decidi escrever meu próprio roteiro para aliviar um pouco a dor da criação de projetos.
Execute o seguinte na raiz do projeto:
Aguarde o bootstrapping para concluir e você está pronto para ir.
Revise o script antes de usar.
fonte
Instalei o laravel na instância do EC2 e passei 3 dias para corrigir o erro de permissão e, finalmente, corrigi-lo. Então, eu quero compartilhar essa experiência com outra.
problema do usuário Quando efetuei login na instância ec2, meu nome de usuário é ec2-user e usergroup é ec2-user. E o site funciona sob o usuário httpd: apache: apache, portanto devemos definir a permissão para o apache.
permissão de pasta e arquivo A. estrutura da pasta primeiro, verifique se você possui essa estrutura de pastas como esta em armazenamento
armazenamento
B. Permissão No início, vejo as instruções para definir 777 sob armazenamento para remover file_put_contents: falha ao abrir erro de fluxo. Então eu configurei a permissão 777 para armazenamento chmod -R 777 storage Mas o erro não foi corrigido. aqui, você deve considerar um: quem grava arquivos em armazenamento / sessões e visualizações. Isso não é ec2-user, mas apache. Sim certo. O usuário "apache" grava o arquivo (arquivo de sessão, arquivo de exibição compilado) na pasta de sessão e exibição. Portanto, você deve dar ao apache permissão de gravação para essa pasta. Por padrão: o SELinux diz que a pasta / var / www deve ser somente leitura pelo apache deamon.
Portanto, para isso, podemos definir o selinux como 0: setenforce 0
Isso pode resolver o problema temporariamente, mas isso faz o mysql não funcionar. então essa não é uma solução tão boa.
Você pode definir um contexto de leitura e gravação para a pasta de armazenamento com: (lembre-se de definir o force 1 para testá-lo)
Então seu problema será corrigido.
e não se esqueça desta atualização do compositor php artisan cache: clear
Esses comandos serão úteis antes ou depois.
Espero que você economize seu tempo. Boa sorte. Hacken
fonte
Eu tinha a seguinte configuração:
nginx
)E aplicou as permissões corretamente, como @bgies sugerido na resposta aceita. O problema no meu caso foi o usuário e grupo em execução do php-fpm, que era originalmente
apache
.Se você estiver usando NGINX com php-fpm, deverá abrir o arquivo de configuração do php-fpm:
E substitua
user
egroup
o valor das opções por um NGINX está configurado para trabalhar; no meu caso, ambos foramnginx
:... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...
Salve-o e reinicie os serviços nginx e php-fpm.
fonte
Para desenvolvedores do Laravel, problemas de diretório podem ser um pouco problemáticos. No meu aplicativo, eu estava criando diretórios rapidamente e movendo arquivos para esse diretório no meu ambiente local com sucesso. Então, no servidor, eu estava recebendo erros ao mover arquivos para o diretório recém-criado.
Aqui estão as coisas que eu fiz e obtive um resultado bem-sucedido no final.
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 {} \;
chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
mkdir($save_path, 0755, true);
Depois de fazer essas alterações no servidor de produção, criei novos diretórios com sucesso e movi os arquivos para eles.
Por fim, se você usa a fachada File no Laravel, pode fazer algo assim:
File::makeDirectory($save_path, 0755, true);
fonte
Encontrei uma solução ainda melhor para isso. É causado porque o php está sendo executado como outro usuário por padrão.
Então, para corrigir isso, faça
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
depois edite o
user = "put user that owns the directories" group = "put user that owns the directories"
então:
sudo systemctl reload php7.0-fpm
fonte