eu estou tentandonãodou 777
permissão na minha /var/www/html
pasta, 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 -la
saí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 moodle
pasta 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 moodle
pasta em /home/andre/www/moodle
, mas permaneceu igual. A saída de ls -la
in /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
tem /home/andre/www/
as permissões que desejo.
Como problema adicional, quando acesso localhost/moodle
recebo 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/html
aponta, 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/html
e 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/html
seu site.
Na verdade, isso ocorre em quatro etapas, depois de copiar seus dados de volta para /var/www/html
:
- Dê ao Apache acesso às pastas e arquivos, para que ele possa servir o site sem erros 403.
- 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.
- (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
. - (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-data
pastas 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 ( +x
somente 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 PATH
está 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 FILEPATH
pelo caminho relativo à /var/www/html
pasta 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-data
configurando 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 USER
no 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 +x
item 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-data
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. Arquivos e pastas criados dentro desses diretórios sempre terão www-data
como 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 +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), 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-data
ou root:www-data
també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 root
do www-data
sistema 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:
- Devolva a propriedade ao usuário do sistema do servidor web
www-data
.
sudo chown -R www-data:www-data /var/www/html
- Fornece recursivamente leitura/gravação nos arquivos, enquanto não dá a outros usuários (excluindo
www-data
e,root
claro) acesso aos arquivos.
sudo find /var/www/html -type f -exec setfacl -mu:SEU NOME DE USUÁRIO:rw -m other::--- {} \;
- Recursivamente, leia/grave/atravesse nos diretórios, remova o acesso às pastas para outros usuários (excluindo
www-data
eroot
) 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::--- {} \;
- Também precisamos definir o
setgid
bit para todos os diretórios, para que, se você criar um arquivo, o servidor web ainda possa acessá-lo porwww-data
meio 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-data
o 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/moodle
para /home/andre/www/moodle/
não contorna as permissões para /home/andre/www/moodle/
. Qualquer pessoa que queira fazer coisas /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/
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.