web-dev-qa-db-pt.com

Como configurar permissões de arquivo para Laravel 5 (e outros)

Estou usando o Apache Web Server que tem o proprietário definido como _www:_www. Eu nunca sei qual é a melhor prática com permissões de arquivo, por exemplo, quando eu crio o novo projeto Laravel 5.

O Laravel 5 requer que a pasta /storage seja gravável. Eu encontrei muitas abordagens diferentes para fazê-lo funcionar e eu geralmente termino fazendo 777 chmod recursivamente. Eu sei que não é a melhor ideia embora.

O documento oficial diz:

O Laravel pode exigir que algumas permissões sejam configuradas: as pastas dentro de storage e vendor exigem acesso de gravação pelo servidor web.

Isso significa que o servidor da Web também precisa acessar as pastas storage e vendor ou apenas seu conteúdo atual?

Eu suponho que o que é muito melhor, está mudando o proprietário em vez de permissões. Mudei todas as permissões de arquivos do Laravel recursivamente para _www:_www e isso fez com que o site funcionasse corretamente, como se eu mudasse o chmod para 777. O problema é que agora meu editor de texto me pede senha toda vez que eu quero salvar qualquer arquivo e o mesmo acontece se eu tentar mudar alguma coisa no Finder, como por exemplo copiar um arquivo.

Qual é a abordagem correta para resolver esses problemas?

  1. Alterar chmod
  2. Altere o proprietário dos arquivos para que correspondam aos do servidor da Web E, talvez, configure o editor de texto (e o Finder?) Para pular Pedindo senha ou fazer com que eles usem Sudo
  3. Altere o proprietário do servidor da Web para que corresponda ao usuário do SO (não sei As conseqüências)
  4. Algo mais
121
Robo Robok

Apenas para declarar o óbvio para qualquer um que esteja vendo esta discussão ... se você der alguma de suas pastas 777 permissões, você está permitindo que QUALQUER pessoa leia, escreva e execute qualquer arquivo nesse diretório .... o que isto significa é que você deu Qualquer pessoa (qualquer hacker ou pessoa maliciosa em todo o mundo) permissão para fazer upload de qualquer arquivo, vírus ou qualquer outro arquivo, e então executar esse arquivo ... 

SE VOCÊ ESTIVER CONFIGURANDO AS PERMISSÕES DO SEU PASTAO PARA O 777, ABRIRÁ O SEU SERVIDOR PARA QUALQUER PESSOA QUE PODE ENCONTRAR ESSE DIRETÓRIO. Claro o suficiente ??? :)

Existem basicamente duas maneiras de configurar sua propriedade e suas permissões. Ou você se dá a propriedade ou torna o servidor da Web o proprietário de todos os arquivos.

Webserver como proprietário (a maneira como a maioria das pessoas faz isso, e o caminho do Laravel doc):

assumindo www-data (pode ser outra coisa) é o seu usuário do servidor web.

    Sudo chown -R www-data: www-data/caminho/para/seu/laravel/root/diretório

se você fizer isso, o servidor web possui todos os arquivos, e também é o grupo, e você terá alguns problemas para fazer o upload de arquivos ou trabalhar com arquivos via FTP, porque seu cliente FTP estará logado como você, não no seu servidor web, então adicione seu usuário para o grupo de usuários do servidor web:

   Sudo usermod -a -G www-data ubuntu

Claro, isso pressupõe que seu servidor está rodando como www-data (o padrão Homestead), e seu usuário é o Ubuntu (é vagabundo se você estiver usando Homestead).

Então você configura todos os seus diretórios para 755 e seus arquivos para 644 ... SET permissões de arquivos

Sudo find/path/to/seu/laravel/root/directory -tipo f -exec chmod 644 {} \; 

Permissões do diretório SET

Sudo find/path/to/seu/laravel/root/directory -tipo d -exec chmod 755 {} \;

Seu usuário como proprietário

Eu prefiro possuir todos os diretórios e arquivos (isso facilita muito o trabalho com tudo), então eu faço: 

Sudo chown -R meu-usuário: www-data/caminho/para/seu/laravel/root/diretório

Então eu dou a mim mesmo e as permissões do servidor: 

Sudo find/path/to/seu/laravel/root/directory -tipo f -exec chmod 664 {} \; 
 Sudo find/path/to/seu/laravel/root/directory -tipo d -exec chmod 775 {} \;

Em seguida, dê ao servidor da web os direitos para ler e gravar em armazenamento e cache

Seja qual for a maneira que você configurar, então você precisa dar permissões de leitura e gravação para o servidor web para armazenamento, cache e quaisquer outros diretórios que o servidor precisa fazer upload ou gravação também (dependendo da sua situação), então execute os comandos acima:

Sudo chgrp -R armazenamento/cache de armazenamento de dados www 
 Sudo chmod -R ug + bootstrap/cache de armazenamento rwx

Agora, você está seguro e seu site funciona E você pode trabalhar com os arquivos com bastante facilidade

376
bgies

As permissões para as pastas storage e vendor devem permanecer em 775, por motivos óbvios de segurança.

No entanto, tanto o seu computador quanto o seu servidor Apache precisam ser capazes de escrever nessas pastas. Ex: quando você executa comandos como php artisan, seu computador precisa escrever no arquivo de logs em storage.

Tudo o que você precisa fazer é dar posse das pastas para o 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

Então você precisa adicionar seu computador (referenciado por ele username) ao grupo ao qual o servidor Apache pertence. Igual a : 

Sudo usermod -a -G www-data userName

NOTA: Frequentemente, groupName é www-data mas no seu caso, substitua por _www

36
BassMHL

Altere as permissões para a pasta do seu projeto para ativar leitura/gravação/exec para qualquer usuário dentro do grupo que possui o diretório (que no seu caso é _www):

chmod -R 775 /path/to/your/project

Em seguida, adicione seu nome de usuário do OS X ao grupo _www para permitir o acesso ao diretório:

Sudo dseditgroup -o edit -a yourusername -t user _www
12
Bogdan

Encontramos muitos casos de Edge ao configurar permissões para aplicativos Laravel. Criamos uma conta de usuário separada (deploy) para possuir a pasta de aplicativo Laravel e executar comandos Laravel da CLI e executar o servidor da Web em www-data. Um problema que isso causa é que o (s) arquivo (s) de log pode ser de propriedade de www-data ou deploy, dependendo de quem escreveu primeiro no arquivo de log, obviamente impedindo que outro usuário grave nele no futuro.

Descobri que a única solução sensata e segura é usar as ACLs do Linux. O objetivo desta solução é:

  1. Para permitir que o usuário que possui/implanta o aplicativo leia e grave acesso ao código de aplicativo Laravel (usamos um usuário chamado deploy).
  2. Para permitir que o usuário www-data acesse o código do aplicativo Laravel, mas não o acesso de gravação.
  3. Para evitar que outros usuários acessem o código/dados do aplicativo Laravel.
  4. Para permitir que tanto o usuário www-data quanto o usuário do aplicativo (deploy) escrevam acesso à pasta de armazenamento, independentemente de qual usuário possui o arquivo (assim, deploy e www-data podem gravar no mesmo arquivo de log, por exemplo).

Nós realizamos isso da seguinte maneira:

  1. Todos os arquivos dentro da pasta application/ são criados com o umask padrão de 0022, que resulta em pastas com permissões drwxr-xr-x e arquivos com -rw-r--r--.
  2. Sudo chown -R deploy:deploy application/ (ou simplesmente implemente seu aplicativo como o usuário deploy, que é o que fazemos).
  3. chgrp www-data application/ para dar ao grupo www-data acesso ao aplicativo.
  4. chmod 750 application/ para permitir que o usuário deploy leitura/gravação, o usuário www-data somente leitura e para remover todas as permissões para quaisquer outros usuários.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/ para definir as permissões padrão na pasta storage/ e em todas as subpastas. Quaisquer novas pastas/arquivos criados na pasta de armazenamento herdarão essas permissões (rwx para www-data e deploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ para definir as permissões acima em quaisquer arquivos/pastas existentes.
11
Chris Schwerdt

Como postado já 

Tudo o que você precisa fazer é dar posse das pastas para o Apache:

mas eu adicionei -R para chown command: Sudo chown -R www-data:www-data /path/to/your/project/vendor Sudo chown -R www-data:www-data /path/to/your/project/storage

7
Stanislav Potapenko

A maioria das pastas deve ser normal "755" e arquivos, "644"

O Laravel requer que algumas pastas sejam graváveis ​​para o usuário do servidor da web. Você pode usar este comando em sistemas operacionais baseados em unix.

Sudo chgrp -R www-data storage bootstrap/cache
Sudo chmod -R ug+rwx storage bootstrap/cache
4
Siddharth Joshi

A solução postada por bgles está correta para mim em termos de definir corretamente as permissões inicialmente (eu uso o segundo método), mas ainda tem problemas potenciais para o Laravel.

Por padrão, o Apache criará arquivos com 644 permissões. Então, isso é praticamente tudo no armazenamento /. Portanto, se você excluir o conteúdo de storage/framework/views e, em seguida, acessar uma página através do Apache, verá que a visualização em cache foi criada como:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

Se você executar "artisan serve" e acessar uma página diferente, obterá permissões diferentes porque o CLI PHP se comporta de maneira diferente do Apache:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

Em si, isso não é grande coisa, pois você não estará fazendo nada disso em produção. Mas se o Apache criar um arquivo que subseqüentemente precise ser escrito pelo usuário, ele falhará. E isso can se aplica a arquivos de cache, exibições em cache e logs ao implantar usando um usuário e artesão conectados. Um exemplo fácil é "cache artesanal: transparente", que não conseguirá excluir nenhum arquivo em cache que seja www-data: www-data 644.

Isso pode ser parcialmente mitigado executando comandos artisan como www-data, então você estará fazendo/scripting tudo como:

Sudo -u www-data php artisan cache:clear

Ou você evitará o tédio disso e adicionará isso ao seu .bash_aliases:

alias art='Sudo -u www-data php artisan'

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 difícil, a menos que você deseje configurar aliases para usar 'Sudo -u www-data' para executar o phpunit e tudo mais que você verificar em suas compilações para criar arquivos.

A solução é seguir a segunda parte do aviso bgles, e incluir o seguinte em/etc/Apache2/envvars e reiniciar (não recarregar) o Apache:

umask 002

Isso forçará o Apache a criar arquivos como 664 por padrão. Em si, isso pode apresentar um risco de segurança. No entanto, nos ambientes Laravel que estão sendo discutidos aqui (Homestead, Vagrant, Ubuntu), o servidor web é executado como usuário www-data no grupo www-data. Portanto, se você não permitir arbitrariamente que os usuários ingressem no grupo www-data, não haverá risco adicional. Se alguém conseguir sair do servidor da Web, ele terá acesso a www-data de qualquer forma, então nada será perdido (embora essa não seja a melhor atitude em relação à segurança). Então, na produção é relativamente seguro, e em uma máquina de desenvolvimento de usuário único, não é um problema. 

Por fim, como seu usuário está no grupo de dados www, e todos os diretórios que contêm esses arquivos são g + s (o arquivo é sempre criado sob o grupo do diretório pai), qualquer coisa criada pelo usuário ou por www-data será r/w para o outro. 

E esse é o objetivo aqui.

edit

Ao investigar a abordagem acima para definir as permissões, ainda parece bom o suficiente, mas alguns ajustes podem ajudar:

Por padrão, os diretórios são 775 e os arquivos são 664 e todos os arquivos têm o proprietário e o grupo do usuário que acabou de instalar a estrutura. Então, vamos supor que partimos desse ponto.

cd /var/www/projectroot
Sudo chmod 750 ./
Sudo chgrp www-data ./

A primeira coisa que fazemos é bloquear o acesso a todos os outros e fazer com que o grupo seja www-data. Somente o proprietário e os membros do www-data podem acessar o diretório.

Sudo chmod 2775 bootstrap/cache
Sudo chgrp -R www-data bootstrap/cache

Para permitir que o servidor da Web crie services.json e compiled.php, conforme sugerido pelo guia de instalação Laravel oficial. Definir o grupo sticky bit significa que estes serão de propriedade do criador com um grupo de www-data.

find storage -type d -exec Sudo chmod 2775 {} \;
find storage -type f -exec Sudo chmod 664 {} \;
Sudo chgrp -R www-data storage

Fazemos o mesmo com a pasta de armazenamento para permitir a criação de arquivos de cache, log, sessão e visualização. Usamos find para definir explicitamente as permissões de diretório de maneira diferente para diretórios e arquivos. Nós não precisávamos fazer isso no bootstrap/cache, pois não há (normalmente) nenhum subdiretório lá.

Pode ser necessário reaplicar quaisquer flags executáveis ​​e excluir o fornecedor/* e reinstalar as dependências do composer para recriar links para phpunit et al, por exemplo:

chmod +x .git/hooks/*
rm vendor/*
composer install -o

É isso aí. Exceto pelo umask do Apache explicado acima, isso é tudo o que é necessário sem tornar todo o projectroot gravável pelo www-data, que é o que acontece com outras soluções. Portanto, é um pouco mais seguro dessa forma que um invasor que esteja executando o www-data tenha acesso de gravação mais limitado.

end edit

Alterações para Systemd

Isso se aplica ao uso do php-fpm, mas talvez outros também.

O serviço systemd padrão precisa ser substituído, o umask configurado no arquivo override.conf e o serviço reiniciado:

Sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
Sudo systemctl daemon-reload
Sudo systemctl restart php7.0-fpm.service
3
markdwhite

O Laravel 5,4 docs diz:

Depois de instalar o Laravel, você pode precisar configurar algumas permissões. Os diretórios dentro dos diretórios storage e bootstrap/cache Devem ser graváveis ​​pelo seu servidor web ou o Laravel não será executado. Se você Estiver usando a máquina virtual Homestead, essas permissões devem Já estar definidas.

Há muitas respostas nesta página que mencionam o uso de permissões 777. Não faça isso Você estaria expondo-se a hackers.

Em vez disso, siga as sugestões de outras pessoas sobre como definir permissões de 755 (ou mais restritivas). Pode ser necessário descobrir qual usuário seu aplicativo está executando como executando whoami no terminal e, em seguida, alterar a propriedade de determinados diretórios usando chown -R.

Se você não tem permissão para usar Sudo como tantas outras respostas exigem ...

Seu servidor é provavelmente um host compartilhado, como o Cloudways.

(No meu caso, eu tinha clonado meu aplicativo Laravel em um segundo servidor Cloudways e não estava funcionando completamente porque as permissões dos diretórios storage e bootstrap/cache estavam desordenadas.)

Eu precisava usar:

Cloudways Platform > Server > Application Settings > Reset Permission

Então eu poderia executar php artisan cache:clear no terminal.

2
Ryan

Eu decidi escrever meu próprio roteiro para aliviar a dor de criar projetos. 

Execute o seguinte dentro da raiz do seu projeto:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

Aguarde o bootstrapping para concluir e você está pronto para ir.

Revise o script antes de usar.

1
Jonathan

Eu instalei o laravel na instância do EC2 e gastei 3 dias para corrigir o erro de permissão e finalmente corrigi-lo. Então, quero compartilhar essa experiência com outra.

  1. problema do usuário Quando eu fiz o login ec2 instance, meu nome de usuário é ec2-user e usergroup é ec2-user. E o website funciona sob httpd user: Apache: Apache devemos definir a permissão para o Apache.

  2. permissão de pasta e arquivo estrutura de pastas primeiro, você deve se certificar de que você tem essa estrutura de pastas como esta em armazenamento

    armazenamento

    • estrutura
      • esconderijo
      • sessões
      • visualizações
    • logs A estrutura da pasta pode ser diferente de acordo com a versão laravel que você usa. minha versão laravel é 5.2 e você pode encontrar a estrutura apropriada de acordo com sua versão.

B. permissão Em primeiro lugar, eu vejo as instruções para definir 777 sob armazenamento para remover file_put_contents: falhou ao abrir erro de fluxo. Então eu configure permissão 777 para armazenamento Chmod -R 777 armazenamento Mas o erro não foi corrigido. Aqui, você deve considerar um: quem escreve arquivos em armazenamento/sessões e visualizações. Isso não é ec2-user, mas Apache Sim, certo. O usuário "Apache" grava um arquivo (arquivo de sessão, arquivo de visão compilado) na sessão e visualiza a pasta. Então você deve dar ao Apache permissão para escrever estas pastas Por padrão: o SELinux diz que a pasta/var/www deve ser somente leitura pelo deamon do Apache.

Então, para isso, podemos definir o selinux como 0: Setenforce 0

Isso pode resolver o problema temporariamente, mas isso faz com que o mysql não funcione. Então essa não é uma solução tão boa.

Você pode definir um contexto de leitura-gravação para a pasta de armazenamento com: (lembre-se de setenforce 1 para testá-lo)

chcon -Rt httpd_sys_content_rw_t storage/

Então seu problema será corrigido.

  1. e não esqueça esta atualização do compositor cache do artesão php: clear

    Estes comandos serão úteis depois ou antes.

    Espero que você poupe seu tempo. Boa sorte. Hacken

1
Hacken Lee

Eu tinha a seguinte configuração:

  • NGINX (usuário em execução: nginx)
  • PHP-FPM

E aplicou as permissões corretamente como @bgies sugeridas na resposta aceita. O problema no meu caso foi o usuário e grupo em execução configurado do php-fpm que era originalmente Apache.

Se você está usando o NGINX com o php-fpm, você deve abrir o arquivo de configuração do php-fpm:

nano /etc/php-fpm.d/www.config

E substitua o valor das opções user e group com um NGINX está configurado para trabalhar com; no meu caso, ambos eram nginx:

... ; 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 e reinicie os serviços nginx e php-fpm.

0
Amirreza Nasiri

Adicionar ao composer.json

"scripts": {
...
"post-install-cmd": [
      "chgrp -R www-data storage bootstrap/cache",
      "chmod -R ug+rwx storage bootstrap/cache"
    ]
...
}

Depois de composer update

0
Davron Achilov