Problemas de permissão com /var/www/html e meu próprio diretório inicial para a raiz de um documento de site

Problemas de permissão com /var/www/html e meu próprio diretório inicial para a raiz de um documento de site

eu estou tentandonãodou 777permissão na minha /var/www/htmlpasta, mas quero editar meus arquivos sem a extensão sudo. Então pensei em criar um link simbólico de uma pasta no meu diretório pessoal dentro do arquivo /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 moodlepasta 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 permaneceu com permissões de leitura, gravação e execução para todos. Tentei o mesmo com a moodlepasta em /home/andre/www/moodle, mas permaneceu igual. 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

Portanto, a pasta moodletem /home/andre/www/as permissões que desejo.

Como problema adicional, quando acesso localhost/moodlerecebo o erro 403 Forbidden.

O que estou fazendo de errado aqui?

Responder1

Você nunca deveria ter que administrar um site a partir do seu diretório inicial. SEMPRE. Caso contrário, você teria que dar ao servidor web a capacidade de percorrer /home/para ver a estrutura de diretórios, mas também para /home/$USER/(o diretório inicial do usuário, onde podemos tentar ver o que mais existe em seu diretório de usuário), bem como quaisquer outras subpastas lá. Um servidor web mal configurado, mal configurado ou sem patch pode causar vazamento massivo de dados dessa forma, ou perda de credenciais e coisas assim, o que colocaria em risco seus dados pessoais e logins em diversas coisas. A abordagem de link simbólico que você está usando também não ajuda pelo mesmo motivo que tentar dar permissões de leitura ao Apache /home/andre/www/moodle- o servidor web deve ser capaz de percorrer seu diretório inicial para chegar ao local para o qual o link simbólico /var/www/htmlaponta, que ainda representa esse risco de segurança.

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

Na verdade, isso ocorre em quatro etapas, depois de copiar seus dados de volta para /var/www/html:

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

(1) Permitir acesso do Apache às pastas e 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' para www-datapastas e arquivos. Isso então dá ao servidor da web permissão para recorrer e obter acesso à estrutura de diretórios raiz do documento do site ( +xsomente para diretórios). Em seguida, também garante que o servidor 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 dar permissão de gravação ao servidor web para um arquivo ou diretório - isso pode ser feito fazendo sudo chmod g+w /var/www/html/PATH(onde PATHestá o caminho para o arquivo ou pasta na estrutura de diretório onde você precisa aplicar o permissões de gravação para o servidor web).

PERCEBER: há 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 você pode ter que executar novamente esses comandos no futuro se 'novos arquivos' apresentarem problemas 403, a fim de dar permissões corretas ao servidor web para continuar a poder acessar arquivos e pastas que são criados ou copiados e não estão www-dataconfigurando o grupo corretamente.


(2) Conceda ao seu proprietário privilégios de leitura/gravação nas pastas e arquivos e permita que o acesso às pastas 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 pelo 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 no formato /var/www/html. A seguir, definimos permissões de leitura e gravação nas pastas e permitimos que você acesse as pastas para acessá-las (o +xitem nos itens do diretório). Em seguida, definimos todos os arquivos para terem permissões de leitura/gravação para o proprietário, que acabamos de definir.


(3)(Opcional)Certifique-se de que cada novo arquivo seja criado com www-datao 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. Arquivos e pastas criados dentro desses diretórios sempre terão www-datacomo grupo, permitindo o acesso ao servidor web.


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

Precisamos que seu usuário veja os diretórios e arquivos. Precisamos que o servidor web faça isso também. 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 fazer com que apenas o usuário e o servidor da web possam ver os dados.

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

OBSERVAÇÃO:Você não precisará executar isso novamente posteriormente ou editar as permissões para a categoria 'outras' de permissões aqui. Se os 'outros' usuários não conseguirem /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), então as permissões nos itens abaixo desse diretório para outros usuários ou grupos não vai importar muito.


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

Esta solução é um pouco menos invasiva e permite que você tenha um diretório e todos os arquivos de propriedade www-data:www-dataou root:www-datatambém tenha acesso. Ele usaListas de controle de acesso, que permite que vários usuários tenham permissões sem configurar grupos individuais. Isso também permite que os usuários rootdo www-datasistema possuam arquivos, mas também permite adicionar permissões adicionais caso a caso e ajustar as permissões para determinados usuários para que possam ler coisas, mas não editar, e assim por diante.

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

  1. Devolva a propriedade ao usuário do sistema do servidor web www-data.
sudo chown -R www-data:www-data /var/www/html
  1. Fornece recursivamente leitura/gravação nos arquivos, enquanto não dá a outros usuários (excluindo www-datae, rootclaro) acesso aos arquivos.
sudo find /var/www/html -type f -exec setfacl -mu:SEU NOME DE USUÁRIO:rw -m other::--- {} \;
  1. Recursivamente, leia/grave/atravesse nos diretórios, remova o acesso às pastas para outros usuários (excluindo www-datae root) e defina isso como a ACL 'padrão' para novos arquivos nos diretórios.
sudo find /var/www/html -type d -exec setfacl -d -mu:SEU NOME DE USUÁRIO:rwx -mo::--- {} \;
  1. Também precisamos definir o setgidbit para todos os diretórios, para que, se você criar um arquivo, o servidor web ainda possa acessá-lo por www-datameio de permissões de grupo.
sudo find /var/www/html -type d -exec chmod g+s {} \;

E agora você tem acesso a todos os diretórios,evocê não precisava tirar o acesso, www-datao que ajuda, pois o servidor da web ainda pode criar arquivos em qualquer lugar que for necessário (como front-ends baseados em PHP com seus próprios diretórios de cache e que precisam ser criados e gravados para operação adequada).

A única ressalva: se você criar novos arquivos manualmente, será necessário alterá-los adequadamente para conceder propriedade ao servidor 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 arquivosapoialistas de acesso a arquivos.

Responder2

Excelente resposta de 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 dos 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/

Responder3

Toda a ideia de usar links simbólicos para resolver um problema de permissão é falha e não pode funcionar. As permissões mostradas para o link simbólico em si são em sua maioria irrelevantes; elas não podem ser usadas para contornar 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 coisas /var/www/html/moodlesó poderá fazê-lo se tiver as permissões necessárias para /home/andre/www/moodle/.

Sua execução de sudo chmod -R 775 moodle/fatofezteve efeito, mas diferente do que você pensava não alterou a permissão do link simbólico, mas sim do link simbólico target /home/andre/www/moodle/.

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

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

Geralmente, acho uma boa ideia que você possua os arquivos e tenha permissões rw, o servidor web só tenha acesso de leitura aos arquivos por meio das permissões de grupo e todos os outros usuários não tenham nenhum acesso.

Um exemplo de permissão (que pode não funcionar para o 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, entrar nele e modificar seu conteúdo, o servidor web (no grupo www-data) pode entrar e ler. Os próprios arquivos 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 algum.

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

informação relacionada