Ao decidir quais permissões usar, você precisa saber exatamente quem são seus usuários e o que eles precisam. Um servidor da web interage com dois tipos de usuário.
Usuários autenticados têm uma conta de usuário no servidor e podem receber privilégios específicos. Isso geralmente inclui administradores de sistema, desenvolvedores e contas de serviço. Eles geralmente fazem alterações no sistema usando SSH ou SFTP.
Usuários anônimos são os visitantes do seu site. Embora eles não tenham permissões para acessar arquivos diretamente, eles podem solicitar uma página da Web e o servidor da Web age em seu nome. Você pode limitar o acesso de usuários anônimos, tomando cuidado com as permissões que o processo do servidor da web possui. Em muitas distribuições Linux, o Apache é executado como www-data
usuário, mas pode ser diferente. Use ps aux | grep httpd
ou ps aux | grep apache
para ver qual usuário o Apache está usando no seu sistema.
Notas sobre permissões linux
Linux e outros sistemas compatíveis com POSIX usam permissões unix tradicionais. Há um excelente artigo na Wikipedia sobre permissões do sistema de arquivos, para não repetir tudo aqui. Mas há algumas coisas que você deve estar ciente.
Os
scripts interpretados do bit de execução (por exemplo, Ruby, PHP) funcionam muito bem sem a permissão de execução. Somente binários e scripts de shell precisam do bit de execução. Para percorrer (inserir) um diretório, você precisa ter permissão de execução nesse diretório. O servidor da web precisa dessa permissão para listar um diretório ou servir qualquer arquivo dentro dele.
Permissões de novo arquivo padrão
Quando um arquivo é criado, ele normalmente herda a ID do grupo de quem o criou. Mas, às vezes, você deseja que novos arquivos herdem o ID do grupo da pasta em que são criados, para ativar o bit SGID na pasta pai.
Os valores de permissão padrão dependem do seu umask. O umask subtrai permissões de arquivos recém-criados, portanto, o valor comum de 022 resulta na criação de arquivos com o 755. Ao colaborar com um grupo, é útil alterar o seu umask para 002 para que os arquivos criados possam ser modificados pelos membros do grupo. E se você deseja personalizar as permissões dos arquivos carregados, é necessário alterar o umask para o apache ou executar o chmod após o upload do arquivo.
O problema com o 777
Quando você chmod 777
cria seu site, você não tem nenhuma segurança. Qualquer usuário do sistema pode alterar ou excluir qualquer arquivo no seu site. Mas, mais sério, lembre-se de que o servidor da web age em nome dos visitantes do seu site e agora o servidor da web pode alterar os mesmos arquivos que está executando. Se houver vulnerabilidades de programação em seu site, elas poderão ser exploradas para desfigurá-lo, inserir ataques de phishing ou roubar informações do servidor sem que você saiba.
Além disso, se o servidor for executado em uma porta conhecida (o que deve impedir que usuários não raiz gerem serviços de escuta acessíveis ao mundo), isso significa que o servidor deve ser iniciado pela raiz (embora qualquer servidor sã caia imediatamente para uma conta menos privilegiada quando a porta estiver vinculada). Em outras palavras, se você estiver executando um servidor da web em que o executável principal faz parte do controle de versão (por exemplo, um aplicativo CGI), deixe suas permissões (ou, nesse caso, as permissões do diretório que contém, pois o usuário poderá renomear o executável) em 777 permite que qualquer usuário execute qualquer executável como root.
Definir os requisitos
- Os desenvolvedores precisam de acesso de leitura / gravação aos arquivos para que possam atualizar o site
- Os desenvolvedores precisam ler / escrever / executar nos diretórios para que possam navegar
- O Apache precisa de acesso de leitura a arquivos e scripts interpretados
- O Apache precisa de acesso de leitura / execução a diretórios úteis
- O Apache precisa de acesso de leitura / gravação / execução aos diretórios para o conteúdo carregado
Mantido por um único usuário
Se apenas um usuário for responsável pela manutenção do site, defina-o como proprietário do usuário no diretório do site e conceda ao usuário permissões completas de rwx. O Apache ainda precisa de acesso para poder servir os arquivos, então defina www-data como o proprietário do grupo e dê permissões ao grupo rx.
No seu caso, Eve, cujo nome de usuário pode ser eve
, é o único usuário que mantém contoso.com
:
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
Se você possui pastas que precisam ser graváveis pelo Apache, você pode modificar os valores de permissão do proprietário do grupo para que www-data tenha acesso de gravação.
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
O benefício dessa configuração é que fica mais difícil (mas não impossível *) para outros usuários no sistema bisbilhotar, já que apenas o usuário e o proprietário do grupo podem navegar no diretório do site. Isso é útil se você tiver dados secretos em seus arquivos de configuração. Tenha cuidado com o seu umask! Se você criar um novo arquivo aqui, os valores de permissão provavelmente serão padronizados para 755. Você pode executar umask 027
para que os novos arquivos sejam padronizados para 640 ( rw- r-- ---
).
Mantido por um grupo de usuários
Se mais de um usuário for responsável pela manutenção do site, você precisará criar um grupo para usar na atribuição de permissões. É uma boa prática criar um grupo separado para cada site e nomear o grupo depois desse site.
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
No exemplo anterior, usamos o proprietário do grupo para conceder privilégios ao Apache, mas agora isso é usado para o grupo de desenvolvedores. Como o proprietário do usuário não é mais útil para nós, configurá-lo como root é uma maneira simples de garantir que nenhum privilégio seja vazado. O Apache ainda precisa de acesso, por isso, damos acesso de leitura ao resto do mundo.
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Se você possui pastas que precisam ser graváveis pelo Apache, você pode tornar o Apache o proprietário do usuário ou o proprietário do grupo. De qualquer forma, ele terá todo o acesso necessário. Pessoalmente, prefiro torná-lo o proprietário do usuário para que os desenvolvedores ainda possam navegar e modificar o conteúdo das pastas de upload.
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
Embora essa seja uma abordagem comum, há uma desvantagem. Como todos os outros usuários do sistema têm os mesmos privilégios do site que o Apache, é fácil para outros usuários navegar no site e ler arquivos que podem conter dados secretos, como os arquivos de configuração.
Você pode ter seu bolo e comê-lo também
Isso pode ser melhorado ainda mais. É perfeitamente legal que o proprietário tenha menos privilégios que o grupo. Portanto, em vez de desperdiçar o proprietário do usuário atribuindo-o ao root, podemos tornar o Apache o proprietário do usuário nos diretórios e arquivos do seu site. Isso é uma reversão do cenário de mantenedor único, mas funciona igualmente bem.
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Se você possui pastas que precisam ser graváveis pelo Apache, você pode modificar os valores de permissão do proprietário do usuário para que www-data tenha acesso de gravação.
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Uma coisa a ter cuidado com esta solução é que o proprietário do usuário de novos arquivos corresponderá ao criador em vez de ser definido como www-data. Portanto, quaisquer novos arquivos que você criar não serão legíveis pelo Apache até que você os reproduza.
* Separação de privilégios do Apache
Eu mencionei anteriormente que é realmente possível que outros usuários bisbilhotem seu site, independentemente dos tipos de privilégios que você está usando. Por padrão, todos os processos do Apache são executados como o mesmo usuário de dados www, portanto, qualquer processo do Apache pode ler arquivos de todos os outros sites configurados no mesmo servidor e, às vezes, até fazer alterações. Qualquer usuário que pode fazer com que o Apache execute um script pode obter o mesmo acesso que o próprio Apache possui.
Para combater esse problema, existem várias abordagens para a separação de privilégios no Apache. No entanto, cada abordagem vem com várias desvantagens de desempenho e segurança. Na minha opinião, qualquer site com requisitos de segurança mais altos deve ser executado em um servidor dedicado, em vez de usar o VirtualHosts em um servidor compartilhado.
Considerações adicionais
Eu não mencionei isso antes, mas geralmente é uma prática ruim ter desenvolvedores editando o site diretamente. Para sites maiores, é muito melhor ter algum tipo de sistema de lançamento que atualize o servidor da Web a partir do conteúdo de um sistema de controle de versão. A abordagem de um único mantenedor é provavelmente ideal, mas em vez de uma pessoa, você tem um software automatizado.
Se o seu site permitir envios que não precisam ser veiculados, esses envios deverão ser armazenados em algum lugar fora da raiz da web. Caso contrário, você pode achar que as pessoas estão baixando arquivos que deveriam ser secretos. Por exemplo, se você permitir que os alunos enviem tarefas, eles deverão ser salvos em um diretório que não seja atendido pelo Apache. Essa também é uma boa abordagem para arquivos de configuração que contêm segredos.
Para um site com requisitos mais complexos, convém examinar o uso das Listas de controle de acesso . Isso permite um controle de privilégios muito mais sofisticado.
Se o seu site tiver requisitos complexos, convém escrever um script que configure todas as permissões. Teste-o cuidadosamente e mantenha-o em segurança. Pode valer seu peso em ouro se você precisar reconstruir o site por algum motivo.