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/html
aponta, 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/html
e 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/html
seu site.
Isso ocorre, quatro etapas, depois que você copia seus dados de volta para /var/www/html
:
- Conceda ao Apache acesso às pastas e arquivos, para que ele possa servir o site sem erros do 403.
- 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.
- (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
.
- (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-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
somente 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 PATH
está 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 FILEPATH
pelo caminho relativo à /var/www/html
pasta 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-data
definindo 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 USER
no 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 +x
item 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-data
como 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-data
como 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 +x
bit necessário /var/www/html
para percorrer a estrutura de arquivos e a estrutura de diretórios, nem o +r
bit 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-data
itens, 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-data
ou pertencentes a você, root:www-data
mas 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 root
ou www-data
possuam 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:
- Devolva a propriedade ao usuário do sistema do servidor da web
www-data
.
sudo chown -R www-data: www-data / var / www / html
- Recursivamente, você pode ler / gravar nos arquivos, enquanto dá acesso a outros usuários (excluindo
www-data
e, é root
claro).
sudo find / var / www / html -tipo f -exec setfacl -mu: YOURUSERNAME: rw -m outro :: --- {} \;
- Recursivamente, leia / escreva / percorra nos diretórios, remova o acesso às pastas para outros usuários (excluindo
www-data
e 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 :: --- {} \;
- 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 por www-data
meio 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-data
que 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.
+x
para 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+x
para o analisador PHP ler e processá-los). Os diretórios precisam+x
para permitir a passagem pelos diretórios - ou seja, se um diretório não é+x
e 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.