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
:
- Conceda acesso ao Apache às pastas e arquivos, para que ele possa veicular o site sem erros 403.
- 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.
-
(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
. - (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:
- Conceder a propriedade ao usuário do sistema do servidor da Web
www-data
.
sudo chown -R www-data:www-data /var/www/html
- De forma recursiva, você lê / escreve nos arquivos, enquanto dá a outros usuários (excluindo
www-data
eroot
, é claro) nenhum acesso aos arquivos.
sudo find /var/www/html -type f -exec setfacl -m u:YOURUSERNAME:rw -m other::--- {} \;
- Recursivamente, leia-se / escreva / percorra nos diretórios, remova o acesso às pastas de outros usuários (excluindo
www-data
eroot
) 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::--- {} \;
- 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 comowww-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.