Problemas de permissões com / var / www / html e meu próprio diretório pessoal para uma raiz de documento de site

34

Estou tentando não dar permissão 777 na minha /var/www/htmlpasta, mas quero editar meus arquivos sem sudo. Então, eu criei um link simbólico de uma pasta no meu diretório pessoal dentro /var/www/html. Eu criei usando sudo ln -sT /home/andre/www/moodle/ moodle, e a ls -lasaída é esta:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Então, minha pasta do moodle tem permissões de leitura, gravação e execução para todos, e não é isso que eu quero. Eu usei o comando sudo chmod -R 775 moodle/tentando alterá-lo, mas ele permaneceu com permissões de leitura, gravação e execução para todos. Tentei o mesmo com a pasta moodle /home/andre/www/moodle, mas permaneceu a mesma. A saída de ls -lain /home/andre/www/é:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Assim, a pasta moodleno /home/andre/www/tem as permissões que eu quero.

Como um problema adicional, ao acessar localhost/moodle, recebo o erro 403 Proibido.

O que eu estou fazendo errado aqui?

André Carvalho
fonte

Respostas:

63

Você nunca deve ter que executar um site no diretório inicial . SEMPRE. Caso contrário, você teria que dar ao servidor da Web a capacidade de percorrer/home/para ver a estrutura do diretório, mas também para/home/$USER/(o diretório inicial do usuário, onde podemos tentar ver o que mais existe no diretório do usuário), bem como outras subpastas lá. Um servidor da Web mal configurado, mal configurado ou não remendado pode causar vazamento maciço de dados dessa maneira ou perda de credenciais, o que colocaria seus dados pessoais e logins em diferentes situações em risco. A abordagem de link simbólico que você está usando não ajuda pelo mesmo motivo que tenta dar permissões ao Apache para ler/home/andre/www/moodle- o servidor da web deve ser capaz de percorrer o diretório inicial para chegar ao local em que o link simbólico /var/www/htmlaponta, o que ainda representa esse risco à segurança.

Em primeiro lugar, use sudo cp -r /home/andre/www/moodle/ /var/www/html/. Isso copiará seus arquivos /var/www/htmle o manterá longe de seu próprio diretório inicial. Em seguida, refazeremos as permissões para que você e o servidor da Web possam acessar tudo nesse diretório e fornecer ao usuário a leitura / gravação completa de todos os arquivos e diretórios. Então, você só precisará trabalhar no /var/www/htmlseu site.

Isso ocorre, quatro etapas, depois que você copia seus dados de volta para /var/www/html:

  1. Conceda ao Apache acesso às pastas e arquivos, para que ele possa servir o site sem erros do 403.
  2. Dê ao seu usuário o 'proprietário' dos arquivos e pastas e leia / grave todos os arquivos e pastas, além da capacidade de percorrer os diretórios.
  3. (Opcional, mas recomendado) Configure-o de forma que todos os arquivos ou pastas criados a partir daqui, em toda a estrutura de diretórios, tenham o grupo definido para ser www-data.
  4. (Opcional) Limpeza de segurança final, onde configuramos permissões para que você e o servidor da Web possam ver os dados do site, mas outros usuários não podem acessar arquivos ou a estrutura de diretórios do site.

(1) Permita que o Apache acesse as pastas e os arquivos.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Isso define recursivamente o 'grupo' www-datapara as pastas e arquivos. Isso então concede ao servidor da Web permissão para recursar e obter acesso à estrutura de diretórios raiz do documento do site ( +xsomente para diretórios). Ele também garante que o servidor da Web tenha permissões de leitura para todos os arquivos, para que os dados do site possam ser recebidos.

Pode haver alguns casos em que você precisa conceder ao servidor da Web permissão de gravação em um arquivo ou diretório - isso pode ser feito executando sudo chmod g+w /var/www/html/PATH(onde PATHestá o caminho para o arquivo ou pasta na estrutura de diretórios em que você deve aplicar o permissões de gravação para o servidor web).

AVISO : Existem muitos casos em que isso pode expor informações 'seguras' sobre a configuração de um site (como credenciais de acesso ao banco de dados, etc.) e você deve remover 'outras' permissões de acesso a esses dados nesses arquivos ou diretórios individuais com o seguinte: sudo chmod o-rwx /var/www/html/FILEPATH(substituindo FILEPATHpelo caminho relativo à /var/www/htmlpasta do arquivo).

Observe também que pode ser necessário executar novamente esses comandos no futuro se 'novos arquivos' tiverem problemas 403, para conceder permissões corretas ao servidor da Web para continuar acessando arquivos e pastas criados ou copiados e não está www-datadefinindo o grupo corretamente.


(2) Conceda ao seu proprietário privilégios de leitura / gravação para as pastas e arquivos e permita que o acesso à pasta percorra a estrutura de diretórios.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Substitua USERno primeiro comando por seu próprio nome de usuário!

Fazemos três coisas aqui. Primeiro, definimos seu usuário como o "Proprietário" de todos os arquivos e diretórios /var/www/html. Em seguida, definimos permissões de leitura e gravação nas pastas e permitimos que você acesse as pastas para entrar nelas (o +xitem nos itens de diretório). Em seguida, configuramos todos os arquivos para terem permissões de leitura / gravação para o proprietário, que acabamos de definir.


(3) (Opcional) Verifique se todos os novos arquivos após a criação são criados www-datacomo o usuário de 'acesso'.

sudo find /var/www/html -type d -exec chmod g+s {} +

Isso define o bit "set gid" para o grupo nos diretórios. Os arquivos e pastas criados dentro desses diretórios sempre terão www-datacomo grupo, permitindo o acesso ao servidor da web.


(4) (Opcional) Limpeza de segurança final, se você não quiser que outros usuários possam ver os dados

Precisamos que seu usuário veja os diretórios e arquivos. Também precisamos do servidor da web. Podemos não querer que outros usuários do sistema (exceto root) vejam os dados. Portanto, não vamos dar a eles esse acesso e torná-lo apenas para que seu usuário e o servidor da web possam ver os dados.

sudo chmod -R o-rwx /var/www/html/

NOTA: Você não precisará executar novamente mais tarde ou editar as permissões para a categoria de outras permissões aqui. Se os 'outros' usuários não puderem acessar /var/www/html/(eles não têm o +xbit necessário /var/www/htmlpara percorrer a estrutura de arquivos e a estrutura de diretórios, nem o +rbit para ler as listas de arquivos), as permissões nos itens abaixo desse diretório para outros usuários ou grupos não vão realmente importar muito.


Também existe uma solução um pouco menos invasiva, embora não seja garantido que funcione para todos os novos arquivos, nem funcione em todos os sistemas de arquivos , envolvendo listas de controle de acesso a arquivos. Isso permite que você deixe a propriedade dos arquivos com www-dataitens, mas concede a você direitos efetivos de proprietário, para todos os efeitos, mesmo que você não os possua pessoalmente.

Essa solução é um pouco menos invasiva e permite que você tenha um diretório e todos os arquivos pertencentes www-data:www-dataou pertencentes a você, root:www-datamas também a você. Ele usa Listas de controle de acesso , que permitem que vários usuários tenham permissões sem configurar grupos individuais. Isso também permite que os usuários do sistema rootou www-datapossuam arquivos, mas também permite que você adicione permissões adicionais caso a caso e ajuste as permissões de determinados usuários para que eles possam ler coisas, mas não editar, e assim por diante.

Supondo que ainda estamos trabalhando /var/www/html/e que não queremos que outros usuários bisbilhotem, além de nós e do sistema (e, claro, da raiz) vejam nossos dados, precisamos fazer o seguinte:

  1. Devolva a propriedade ao usuário do sistema do servidor da web www-data.
sudo chown -R www-data: www-data / var / www / html
  1. Recursivamente, você pode ler / gravar nos arquivos, enquanto dá acesso a outros usuários (excluindo www-datae, é rootclaro).
sudo find / var / www / html -tipo f -exec setfacl -mu: YOURUSERNAME: rw -m outro :: --- {} \;
  1. Recursivamente, leia / escreva / percorra nos diretórios, remova o acesso às pastas para outros usuários (excluindo www-datae root) e configure-o como a ACL 'padrão' para novos arquivos nos diretórios.
sudo find / var / www / html -tipo d -exec setfacl -d -mu: YOURUSERNAME: rwx -mo :: --- {} \;
  1. Também precisamos definir o setgidbit para todos os diretórios, para que, se você criar um arquivo, o servidor da web ainda possa acessá-lo por www-datameio de permissões de grupo.
sudo find / var / www / html -tipo d -exec chmod g + x {} \;

E agora você tem acesso a todos os diretórios e não precisa retirar o acesso, o www-dataque ajuda, pois o servidor da web ainda pode criar arquivos em qualquer lugar que seja necessário (como front-ends baseados em PHP com seus próprios diretórios de cache e precisa ser criado e gravado para uma operação adequada).

A única ressalva: se você criar novos arquivos manualmente, precisará exibi-los de acordo com a propriedade do servidor da web. Isso é simples sudo chown www-data:www-data filename, e as listas de controle de acesso ainda devem permitir que você tenha direitos de proprietário efetivos sobre o arquivo.

Existem vários casos em que tive que fazer isso como administrador de sistema para algum tipo de acesso não padrão sem alterar os proprietários de um determinado arquivo. Isso funciona, mas tem suas próprias dores de cabeça, pois nem todo sistema de arquivos suporta listas de acesso a arquivos.

Thomas Ward
fonte
2
@ AndréCarvalho +xpara arquivos daria permissões executáveis, e não queremos que os arquivos PHP sejam executados, necessariamente, através da linha de comando do PHP ou como executável no próprio servidor - queremos que sejam processados ​​pelo analisador PHP no servidor da Web (e nós não precisa dos arquivos PHP +xpara o analisador PHP ler e processá-los). Os diretórios precisam +xpara permitir a passagem pelos diretórios - ou seja, se um diretório não é +xe eu não sou root, não consigo entrar no diretório, que é o problema que você teve com o Apache não trabalhando com seus links simbólicos e sua casa diretório.
Thomas Ward
1
@ AndréCarvalho www-dataé um grupo de sistemas - não é um grupo para usuários padrão.
Thomas Ward
1
@JunaidQadirShekhanzai Impossível fornecer, pois as configurações das pessoas diferem muito do ambiente de que precisam e de muitos outros fatores. Esse 'arquivo shell' seria impossível de produzir, uma vez que existem componentes opcionais . Eu poderia tentar criar um script Python que pudesse fazer isso, mas ainda encontramos coisas como restrições do sistema, tarefas opcionais, caminhos variados etc.
Thomas Ward
1
@ T.Todua não foi o que eu disse. Eu disse que você nunca deve executar um site fora do diretório "home" (leia-se: de dentro) - ou seja, você não deve executar nada em /home/USER/...um servidor da web. Você interpretou mal e entendeu mal o significado das palavras que uso. /var/www/*é um local relativamente "seguro" para a execução de sites porque é uma pasta / espaço dedicado para ele. No entanto, /var/www/htmlNÃO é seguro, porque é gravado por servidores da Web na instalação e assim por diante e leva à acumulação de dados importantes (então use /var/www/SUBDIRECTORYcom subdiretórios individuais de sites)
Thomas Ward
1
Eu ajustei o texto para maior clareza.
Thomas Ward
2

Toda a idéia de usar links simbólicos para resolver um problema de permissão é falha e não pode funcionar. As permissões mostradas para o próprio link simbólico são principalmente irrelevantes; elas não podem ser usadas para burlar as permissões do diretório "real". Criar um link simbólico de /var/www/html/moodlepara /home/andre/www/moodle/não contorna as permissões para /home/andre/www/moodle/. Qualquer pessoa que queira fazer algo /var/www/html/moodlesó pode fazê-lo, se tiver as permissões necessárias /home/andre/www/moodle/.

Sua execução sudo chmod -R 775 moodle/realmente teve um efeito, mas diferentemente do que você pensou que não mudou a permissão do link simbólico, mas do destino do link simbólico /home/andre/www/moodle/.

O erro 403 que você obtém no servidor da web provavelmente é porque o servidor da web não tem as permissões necessárias para entrar /home/andre. Este não é "um problema adicional", mas devido ao mesmo problema de permissão.

Portanto, em vez de usar links simbólicos, você precisa descobrir permissões que permitem editar os arquivos e o servidor da Web para acessá-los (ou mesmo editá-los, isso depende do aplicativo). O que exatamente são essas permissões depende do seu caso de uso exato (seu aplicativo e configuração do servidor).

Geralmente, acho que é uma boa idéia que você possua os arquivos e tenha permissões rw, o servidor da Web tenha apenas acesso de leitura aos arquivos por meio das permissões de grupo e todos os outros usuários não terão acesso.

Um exemplo de permissão (que pode não funcionar no seu caso de uso devido à falta de informações):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Você pode ver que o diretório tem acesso suficiente para você, como proprietário, para inseri-lo e modificar seu conteúdo. O servidor da Web (no grupo www-data) pode entrar e ler. Os arquivos em si são legíveis e graváveis ​​para você (o proprietário) e legíveis para o servidor web (no grupo www-data). Todos os outros usuários não têm acesso.

Novamente, por favor, tome isso apenas como um exemplo. O usuário / grupo exato do seu servidor web depende da sua configuração. E seu aplicativo (moodle) pode precisar de permissões diferentes, você deve consultar a documentação.

mastov
fonte
Concordou, mas isso não é muito útil se eles não souberem definir as permissões corretamente e também encontrarem outros problemas.
Thomas Ward
@ ThomasW .: A questão de como definir as permissões corretamente deve ser uma nova pergunta, incluindo as informações necessárias, como a configuração do servidor da web, a maneira desejada de editar os arquivos e as necessidades do aplicativo.
Mastov 4/16
ou escrito como uma resposta correta - o que estou fazendo agora. Você também nunca deve executar nada fora de / home / USER / para um site, pois ele tem acesso a muitos outros dados de 'usuário' se o servidor da Web não estiver corretamente corrigido ou configurado.
Thomas Ward
@mastov Entendi. Você resolve muitas perguntas que tive com sua explicação.
André Carvalho
2

Excelente resposta por Thomas ward https://askubuntu.com/a/767534/717860

Você pode executar todas as etapas recomendadas em apenas 3 comandos em vez de 8 comandos:

3 comandos:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

faça o mesmo trabalho que os 8 comandos a seguir:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
vipin mehta
fonte