Permissões problemas com / var / www / html e meu próprio diretório home para um site document root

16

Estou tentando não dar permissão 777 na minha pasta /var/www/html , mas quero editar meus arquivos sem sudo . Então eu pensei em criar um link simbólico de uma pasta no meu diretório home em /var/www/html . Eu criei usando sudo ln -sT /home/andre/www/moodle/ moodle , e a saída ls -la é 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 moodle leu, escreveu e executou permissões para todos, e não é isso que eu quero. Eu usei o comando sudo chmod -R 775 moodle/ tentando alterá-lo, mas ele ficou com permissões de leitura, gravação e execução para todos. Eu tentei o mesmo com a pasta moodle em /home/andre/www/moodle , mas permaneceu o mesmo. A saída de ls -la em /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 moodle in /home/andre/www/ tem as permissões que eu quero.

Como um problema adicional, quando eu acesso localhost/moodle eu recebo 403 Erro Proibido.

O que estou fazendo de errado aqui?

    
por André Carvalho 04.05.2016 / 15:53

3 respostas

34

Você nunca deve precisar executar um site fora de seu diretório pessoal . EVER. Você teria que dar ao servidor web a capacidade de percorrer /home/ para ver a estrutura de diretórios, mas também em /home/$USER/ (o diretório inicial do usuário , onde podemos tentar ver o que mais existe em seu diretório de usuários), bem como quaisquer outras subpastas de lá. Um servidor web mal configurado ou mal configurado pode causar vazamento massivo de dados, ou perda de credenciais, o que colocaria seus dados pessoais e logins em riscos diferentes. A abordagem do symlink que você está usando não ajuda pelo mesmo motivo que tentar dar permissões ao Apache para ler /home/andre/www/moodle - o servidor web precisa ser capaz de atravessar seu diretório home para chegar ao local onde o link simbólico em /var/www/html aponta para, o que ainda representa esse risco de segurança.

Primeiramente, use sudo cp -r /home/andre/www/moodle/ /var/www/html/ . Isso irá copiar seus arquivos para /var/www/html e mantê-los longe de seu próprio diretório pessoal. Em seguida, refazeremos as permissões para que você e o servidor da Web possam acessar tudo nesse diretório e dar ao usuário uma leitura / gravação completa em todos os arquivos e diretórios. Então, você só terá que trabalhar com /var/www/html para seu site.

Em vigor, quatro etapas, depois de copiar seus dados de volta para /var/www/html :

  1. Conceda acesso ao Apache às pastas e arquivos, para que ele possa veicular o site sem erros 403.
  2. Dê ao seu usuário 'proprietário' os arquivos e pastas, e dê a você mesmo leitura / gravação em todos os arquivos e pastas, bem como a capacidade de percorrer os diretórios.
  3. (Opcional, mas recomendado) Configure-o de modo que quaisquer arquivos ou pastas criados a partir dele na totalidade da estrutura de diretórios tenham o grupo configurado como www-data .
  4. (Opcional) Limpeza de segurança final, onde configuramos as 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) Permite o 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' como www-data para 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 ( +x apenas para diretórios). Em seguida, ele também garante que o servidor da Web tenha permissões de leitura para todos os arquivos, portanto, os dados do site podem ser recebidos.

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

AVISO : 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 para esses dados nesses arquivos ou diretórios individuais com o seguinte: sudo chmod o-rwx /var/www/html/FILEPATH (substituindo FILEPATH pelo caminho relativo à pasta /var/www/html do arquivo).

Note também que você pode ter que re-executar estes comandos no futuro se 'novos arquivos' obtiverem 403 problemas, para dar permissões corretas ao servidor web para continuar podendo acessar arquivos e pastas que são criados ou copiados e não estão recebendo o grupo www-data definido corretamente.

(2) Dê ao seu proprietário privilégios de leitura / gravação para as pastas e arquivos, e permita que o acesso à pasta atravesse 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 USER no primeiro comando pelo seu próprio nome de usuário!

Nós fazemos três coisas aqui. Primeiro, definimos seu usuário como o "Proprietário" de todos os arquivos e diretórios em /var/www/html . Em seguida, definimos permissões de leitura e gravação nas pastas e permitimos que você acesse as pastas para acessá-las (o item +x nos itens de diretório). Em seguida, definimos todos os arquivos para ter permissões de leitura / gravação para o proprietário, o que acabamos de definir.

(3) (Opcional) Certifique-se de que cada novo arquivo depois disso seja criado com www-data como o usuário 'access'.

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-data como o 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. Precisamos que o servidor da Web também o faça. Podemos não querer que outros usuários do sistema (exceto o root) vejam os dados. Então, não vamos dar a eles esse acesso e fazer com que apenas seu 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á mais executar isso mais tarde ou editar as permissões para a categoria 'outras' de permissões aqui.Se os "outros" usuários não puderem acessar /var/www/html/ (eles não têm o +x necessário em /var/www/html para percorrer a estrutura de arquivos e diretórios, nem o +r para ler as listas de arquivos) , então as permissões em itens abaixo desse diretório para outros usuários ou grupos não vão importar muito.

Existe também uma solução um pouco menos invasiva, embora não seja garantido que funcione para todos os novos arquivos, nem é garantido 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 com www-data , mas concede direitos efetivos a você, para todos os efeitos, mesmo que não possua os arquivos.

Esta solução é um pouco menos invasiva e permite que você tenha um diretório e todos os arquivos pertencentes a www-data:www-data ou root:www-data , mas também tenha acesso. Ele usa Listas 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 do sistema root ou www-data possuam arquivos, mas também permite que você adicione permissões adicionais caso a caso e ajuste as permissões para certos usuários para que eles possam ler as coisas, mas não editar, e tal.

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

  1. Conceder a propriedade ao usuário do sistema do servidor da Web www-data .
sudo chown -R www-data:www-data /var/www/html
  1. De forma recursiva, você lê / escreve nos arquivos, enquanto dá a outros usuários (excluindo www-data e root , é claro) nenhum acesso aos arquivos.
sudo find /var/www/html -type f -exec setfacl -m u:YOURUSERNAME:rw -m other::--- {} \;
  1. Recursivamente, leia-se / escreva / percorra nos diretórios, remova o acesso às pastas de outros usuários (excluindo www-data e root ) e defina isso como a ACL 'padrão' para novos arquivos nos diretórios. / li>
sudo find /var/www/html -type d -exec setfacl -d -m u:YOURUSERNAME:rwx -m o::--- {} \;
  1. Também precisamos definir o setgid bit para todos os diretórios, para que, se você criar um arquivo, o servidor da Web ainda possa acessá-lo como www-data por meio de permissões de grupo.
sudo find /var/www/html -type d -exec chmod g+x {} \;

E agora que você tem acesso a todos os diretórios, e você não precisou tirar o acesso de www-data , o que ajuda, já que o servidor da Web ainda pode criar arquivos em qualquer lugar, (como frontends baseados em PHP que possuem seus próprios diretórios de cache e precisam ser criados e gravados para uma operação adequada).

A única ressalva: se você criar manualmente novos arquivos, precisará criá-los adequadamente para dar a propriedade ao servidor da Web. Isso é um simples sudo chown www-data:www-data filename , e as listas de controle de acesso ainda devem permitir que você tenha direitos de propriedade efetivos sobre o arquivo.

Existem vários casos em que tive que fazer isso como um 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, já que nem todo sistema de arquivos suporta listas de acesso a arquivos.

    
por Thomas Ward 04.05.2016 / 16:22
2

A ideia de usar links simbólicos para resolver um problema de permissão é falha e não funciona. As permissões que são mostradas para o link simbólico em si são na sua maioria irrelevantes, elas não podem ser usadas para contornar as permissões do diretório "real". A criação de um link simbólico de /var/www/html/moodle para /home/andre/www/moodle/ não contorna as permissões para /home/andre/www/moodle/ . Qualquer pessoa que queira fazer algo em /var/www/html/moodle só poderá fazê-lo, se tiver as permissões necessárias para /home/andre/www/moodle/ .

Sua execução de sudo chmod -R 775 moodle/ na verdade fez ter um efeito, mas diferentemente do que você achou que não alterou a permissão do symlink, mas do destino do symlink /home/andre/www/moodle/ .

O erro 403 que você recebe no servidor da Web provavelmente é porque seu servidor da web não tem as permissões necessárias para inserir /home/andre . Isso 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 permitam editar os arquivos e o servidor da Web para acessá-los (ou até mesmo editá-los, dependendo do aplicativo). O que exatamente são essas permissões depende do seu caso de uso exato (o aplicativo e a configuração do servidor).

Geralmente eu acho que é uma boa idéia que você possui os arquivos e tem permissões de rw, o servidor web só tem acesso de leitura aos arquivos via permissões de grupo, e todos os outros usuários não têm acesso.

Um exemplo de permissão (que pode não funcionar para 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, 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 podem ser lidos no servidor da Web (no grupo www-data ). Todos os outros usuários não têm acesso.

Novamente, leve 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ê precisa consultar sua documentação.

    
por mastov 04.05.2016 / 16:16
1

Excelente resposta por Thomas ward link

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 encontrar / var / www -tipo d -exec chmod 2750 {} +

sudo encontrar / var / www -tipo f -exec chmod 640 {} +

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

sudo chgrp -R www-data / var / www

sudo encontrar / var / www -tipo d -exec chmod g + rx {} +

sudo encontrar / var / www -tipo f -exec chmod g + r {} +

sudo chown -R ubuntu / var / www /

sudo encontrar / var / www -tipo d -exec chmod u + rwx {} +

sudo encontrar / var / www -tipo f -exec chmod u + rw {} +

sudo encontrar / var / www -tipo d -exec chmod g + s {} +

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

    
por vipin mehta 26.07.2017 / 12:39