Problema de permissões: como o Apache pode acessar arquivos no meu diretório Home?

33

Eu sei que as permissões de arquivo já foram abordadas aqui antes, mas estou lutando para entender o conceito do meu cenário.

  • Criei os arquivos em uma instalação antiga do ubuntu.
  • Copiei os arquivos para minha nova instalação do ubuntu e os coloquei no meu webroot.
  • Quando tento executar os arquivos (eles são arquivos PHP), recebo um erro relacionado às permissões

em uma tentativa de corrigir isso, presumi que eles ainda devessem pertencer ao proprietário anterior; portanto, corri chown -Rno diretório, com meu nome de usuário como argumento, a fim de assumir a propriedade de todos os arquivos no diretório. Deve-se notar que os nomes de usuário entre as instalações novas e antigas do ubuntu eram os mesmos.

Quando tento executar os arquivos novamente, o mesmo problema: erro 500 devido a problemas de permissões. Alguém pode me dizer que outras medidas devo tomar?

O webroot para minha instalação do apache está dentro da minha pasta pessoal. Se eu criar novos arquivos no meu webroot, eles também funcionarão conforme o esperado, são apenas os arquivos antigos que estão causando o problema.

richzilla
fonte
Não tenho certeza de que as permissões de arquivo sejam copiadas quando o arquivo for, alguém pode confirmar isso? Caso contrário, seria possível fornecer os arquivos para outro usuário (ou root) e depois recuperá-los?
Tag
Ok, resolvi o meu problema de os arquivos não serem executados, mas o fiz simplesmente executando chmod -R 777 dirno diretório em questão. Eu não posso deixar de pensar theres uma maneira melhor de fazê-lo embora
richzilla
3
As permissões 777 em um arquivo permitirão que todos gravem seus arquivos, o que pode resultar em danos às suas páginas ou pirataria. Você deve tentar o 755, que normalmente é usado para arquivos php. Certifique-se de não precisar ativar a "permitir execução" para um arquivo; nesse caso, você pode executar chmod [filename] -x. Informações sobre o comando chmod podem ser acessadas clicando no próximo link: catcode.com/teachmod/chmod_cmd.html
Geppettvs D'Constanzo
O que mostra o log de erros do Apache?
Kees Cook #:

Respostas:

14

Os diretórios acima de seu webroot devem ter o bit de execução definido para permitir que o Apache desça nos diretórios.

Se você tiver seu webroot localizado na /home/user/htdocs, o /, /home, /home/usere /home/user/htdocsdeve ter o conjunto bit de execução.


A solução acima "funciona", mas não é o ideal. Se você criou uma pasta, o Apache não pode gravar nela. O inverso também acontece.

Isso pode ser "corrigido" configurando umask 0007 e adicionando-se ao grupo Apache (www-data, se não me engano), para que arquivos e pastas criados recentemente sejam graváveis ​​pelo grupo.

Como alternativa, você pode instalar um Apache MPM: Apache2 MPM ITK ( informações sobre configuração ) e ajustar a configuração para que o Apache seja executado sob seu usuário.

Lekensteyn
fonte
Para obter instruções explícitas sobre como accmplish resposta esta Sé de Marco abaixo
Placas
2
@hobs Mesmo melhor, askubuntu.com/a/46371/6969
Lekensteyn
44

Se os documentos do servidor estiverem no /home/$USER/public_htmldiretório, você precisará executar

sudo chown -R www-data:www-data /home/$USER/public_html

para dar a propriedade da pasta DocumentRoot ao usuário www-datae grupo www-data.

Então você pode se adicionar ao grupo www-data

sudo adduser $USER www-data

Por fim, você precisa tornar a pasta DocumentRoot gravável pelo proprietário (usuário de dados www) e por si próprio (como parte do www-datagrupo):

sudo chmod -R 775 /home/$USER/public_html

Por conveniência, você pode criar um script nomeado public_html_fix.shcom o conteúdo:

#!/bin/bash

sudo adduser $USER www-data
sudo chown -R www-data:www-data /home/$USER/public_html
sudo chmod -R 775 /home/$USER/public_html

Salve-o por dentro /home/$USER/bine torne-o executável usando:

sudo chmod +x /home/$USER/bin/public_html_fix.sh

Você pode chamá-lo sempre que precisar, de qualquer lugar do sistema de arquivos que se encontre assim:

public_html_fix.sh
Marko
fonte
1
trabalhou para mim ....
Emmanuel Okeke
Ótima resposta! - Com exemplos e até um script de conveniência e como usar / instalar o Excellent!
Andre
2
Se isso for feito em um host compartilhado, como você impede que outros usuários do www-datagrupo leiam seus arquivos ou gravem para esse assunto?
Jozxyqk
Resposta realmente incrível ... você salvou minha vida
NullPoiиteя
1
chmod -R 775 /home/$USER/public_htmlrealmente terrível. find /home/$USER/public_html -type d -exec chmod 775 {} \;e find /home/$USER/public_html -type f -exec chmod 664 {} \;é muito melhor
iharob
1

Além de chmodar arquivos e editar arquivos .conf do apache, quero dizer que nada funcionou para mim porque meus arquivos estavam em uma partição que eu havia montado automaticamente via nautilus. Isso limita a partição apenas para seu usuário.

Para verificar se seus arquivos estão visíveis por www-rootou qualquer usuário que execute o apache (execute ps -aux | grep apache2para verificar), execute o seguinte comando:

sudo su -l www-data -s /bin/bash

e tente ler um arquivo da raiz do documento.

Se o arquivo não estiver legível, verifique se:

1) você definiu todas as outras permissões de arquivo

2) você usou FollowSymlinksem seus .confarquivos, se necessário

3) você configurou o DocumentRoot

3) monte sua partição para todos os usuários. Eu tive que editar /etc/fstabe especificar minha partição através do seu UUID:

UUID=afdee1d3-5bb8-4652-892f-e83a9b5ff72e /mnt/4tb      ext4    rw,nosuid,nodev,errors=remount-ro

Em seguida, desmonte sua partição via nautilus e faça a sudo mount -a. Se tudo correr bem, seus arquivos estão agora em baixo /mnt. Atualize seus links simbólicos e pronto.

alexg
fonte
1

A melhor maneira que eu encontrei para sempre configurar isso é a maneira como o VirtualMin faz isso.

criar usuário e grupo "myhome"

Faça do usuário apache um membro do grupo "myhome". Não o contrário, como algumas das explicações aqui descrevem

Então agora o apache leu e executou o acesso a / home / myhome, além de / home / myhome / www

O usuário "myhome" possui acesso de gravação

user458431
fonte
Eu gosto desse conceito, mas não parece estar funcionando para mim. Usuário www-datapertence ao grupo myhome. Todos os arquivos e diretórios têm permissões de gravação em grupo e pertencem myhome:myhome. Eu reiniciei o apache. O Apache ainda não pode gravar novos arquivos e pastas. (Script PHP usando www-data: usuário / grupo www-data)
squarecandy