Esta é uma pergunta canônica sobre permissões de arquivo em um servidor da web Linux.
Eu tenho um servidor web Linux executando o Apache2 que hospeda vários sites. Cada site tem sua própria pasta em / var / www /.
/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/
O diretório base / var / www / pertence a root: root. O Apache está sendo executado como www-data: www-data. O site da Fabrikam é mantido por dois desenvolvedores, Alice e Bob. Ambos os sites da Contoso são mantidos por um desenvolvedor, Eve. Todos os sites permitem que os usuários enviem imagens. Se um site estiver comprometido, o impacto deve ser o mais limitado possível.
Eu quero saber a melhor maneira de configurar permissões para que o Apache possa veicular o conteúdo, o site esteja protegido contra ataques e os desenvolvedores ainda possam fazer alterações. Um dos sites está estruturado da seguinte maneira:
/var/www/fabrikam.com
/cache
/modules
/styles
/uploads
/index.php
Como as permissões devem ser definidas nesses diretórios e arquivos? Li em algum lugar que você nunca deve usar permissões 777 em um site, mas não entendo quais problemas podem causar. Durante os períodos de maior movimento, o site armazena em cache automaticamente algumas páginas e armazena os resultados na pasta de cache. Todo o conteúdo enviado pelos visitantes do site é salvo na pasta de uploads.
Respostas:
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. Useps aux | grep httpd
oups 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
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émcontoso.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.
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.
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.
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.
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.
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.
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.
fonte
apache
em sistemas derivados da Red Hat.Estou me perguntando por que tantas pessoas usam (ou recomendam) a "outra" (o) parte dos direitos do Linux para controlar o que pode fazer o Apache (e / ou PHP). Ao definir esta parte correta para algo diferente de "0", você apenas permite que o mundo inteiro faça algo no arquivo / diretório.
Minha abordagem é a seguinte:
cache/
ouuploads/
onde a permissão de "gravação" também é necessária. Para dar ao PHP FastCGI essa capacidade, ele será executado como bob-www , e bob-www será adicionado ao grupo bob criado automaticamente .AllowOverride
estiver definido como algo diferente deNone
. Para evitar o uso da parte o dos direitos, adiciono o usuário www-data ao grupo bob .Agora:
Esta é uma recapitulação, mas nessa situação, bob está autorizado a fazer o SSH. Se não houver nenhum usuário autorizado a modificar o site (por exemplo, o cliente modifica o site apenas por meio de um painel de administração do CMS e não possui conhecimento do Linux), crie dois usuários de qualquer maneira, mas dê
/bin/false
também o shell para bob e desabilite seu login.Nota: as pessoas tendem a esquecer que limitar os direitos de u (proprietário) é na maioria das vezes inútil e inseguro, já que o proprietário de um arquivo pode executar o
chmod
comando, mesmo os direitos são 000.Diga-me se minha abordagem tem alguns problemas de segurança, porque não tenho 100% de certeza, mas é o que estou usando.
Eu acho que essa configuração tem um problema: quando o PHP / Apache cria um novo arquivo, ele irá pertencer a (por exemplo, fazer upload.) Bob-www: bob , e bob só será capaz de lê-lo. Talvez o setuid no diretório possa resolver o problema.
fonte
setuid
. Novos arquivos sempre pertencem ao criador.bob
. Como você lida com isso? Por exemplo. através do ssh, os dois usuários efetuam login como bob. bob (1) sente que não consegue se lembrar da senha e a altera para outra, mas ainda segura. bob (2) tenta fazer login na próxima vez e não pode.Dada a classificação do Google na excelente resposta acima, acho que há uma coisa que deve ser observada e não consigo deixar uma nota após a resposta.
Continuando com o exemplo, se você planeja usar www-data como proprietário e dev-fabrikam como grupo com 570 permissões no diretório (ou arquivo), é importante observar que o Linux ignora
setuid
, para que todos os novos arquivos sejam de propriedade do usuário que os criou. Isso significa que, após criar novos diretórios e arquivos, você terá que usar algo semelhante a:No Ubuntu 12.04 para Rackspace OpenStack, eu tinha um problema estranho, onde não conseguia obter permissões 570 para funcionar até reiniciar o servidor, o que resolveu magicamente o problema. Estava perdendo pêlos em uma taxa crescente sobre essa questão aparentemente simples ....
fonte
Eu vou com esta configuração:
root
e gruporoot
, com permissões para0755
.root
e gruporoot
, permissões para0644
.root
, grupowww-data
, permissões para1770
. O bit persistente não permite que o proprietário do grupo remova ou renomeie o diretório e os arquivos dentro dele.www-data
usuário e grupo proprietário e0700
permissões para cadawww-data
usuário que envia arquivos.Negar
AllowOverride
eIndex
no diretório de uploads, para que o Apache não leia.htaccess
arquivos e o usuário do Apache não possa indexar o conteúdo da pasta de uploads:6.
php.ini
configuração:Com essa configuração, o
www-data
usuário não poderá acessar diretórios diferentes desiteDir/
/tmp
e/usr/share/phpmyadmin
. Além disso, você pode controlar o tamanho máximo do arquivo, o tamanho máximo da postagem e o máximo de arquivos a serem carregados na mesma solicitação.fonte
Quando você tem um usuário de FTP chamado "leo", precisa fazer upload de arquivos para o diretório da web example.com e também exige que o usuário "apache" seja capaz de criar arquivos uploa-files / sessions / cache no diretório cache, faça o seguinte:
Este comando atribui leo como proprietário e grupo como apache para example.com, apache user faz parte do grupo apache, portanto herdará as permissões do grupo apache
Outro comando que garante a permissão correta e atende também às preocupações de segurança.
Aqui o primeiro número 2 é para diretório e garante que cada novo arquivo criado permaneça nas mesmas permissões de grupo e proprietário. 77 é para proprietário e grupo significa que eles têm acesso total. 4 é para outros significa que eles só podem ler através.
A seguir, é útil entender os números de permissão
fonte
Na IMO é preciso levar em consideração:
Vamos supor que você tenha um servidor com vários dados sob o 'teste' do usuário.
O usuário 'test' possui lá:
$HOMEDIR
$MAIL
/var/www/test
Agora vamos pensar sobre:
test
usuário (PHP-FPM) - ele pode excluir qualquer um dos seus arquivos!test
grupo (PHP-FPM) - ele pode excluir qualquer um de seus arquivos em que o diretório tenha 'w' para o grupo e pode modificar qualquer arquivo que possua 'r' para o grupo; e ainda pode lê-los - suas teclas ssh, por exemplo!Vamos supor que o PHP é buggy, e é, você confia nele
open_basedir
? Você faz ochroot
seu processo PHP? O que você não faz, deseja que ele rastreie todo o sistema de arquivos?Seu processo de aplicativo da web, por exemplo. PHP-FPM, então deve:
chroot
Assim você pode fazer:
test:test
test-www
test-www:test-www
chmod u=rwX,g=rX,o= /var/www/test/public
chmod u=rwX,g=rwXs,o= /var/www/test/public/upload
(assim, o aplicativo criará novos arquivos como:test-www:test-www
- ele terá o grupo test-www por causa do setgid no diretório!)Portanto, se o processo do aplicativo da web for falso, basta ler os arquivos específicos que terão a leitura do grupo e poderá gravar
upload
apenas no diretório. Eu recomendo fortemente ter esseupload
diretório em um sistema de arquivos comnoexec,nodev,nosuid
mount
opções e ter monitoramento constante de quaisquer novos arquivos bizzare nesse diretório, além de também monitorar quaisquer novos processos notest-www
uid.No Linux, pode-se usar a ACL para ajustar melhor as permissões. Se mais de um humano precisar fazer upload de dados da web, seria melhor dividir a conta humana da conta usada para fazer upload de arquivos de dados da web, ou seja. para criar uma nova conta, por exemplo.
test-upload
, e o usuário de teste gerenciaria as chaves ssh para restringir quais humanos poderiam ssh / sftp lá.sshd_config
conhece asExposeAuthInfo
opções, portanto, pode ser configurado para registrar qual chave ssh foi usada para fazer upload dos dados.Eu realmente duvido que a maioria dos serviços de hospedagem de sites se preocupe com a separação de privilégios, quando eles escrevem 'seguro' sem nenhuma informação do que você recebe, eu diria que eles mentem.
fonte
chroot
euser
,group
para ser definido para um pool. mas eu não confiaria naphp_admin_value[open_basedir]
opção. Também li que é melhor ter um mestre PHP-FPM separado por usuário, consulte ma.ttias.be/a-better-way-to-run-php-fpm Para instanciar um daemon é fácil na maioria das distribuições Linux e * BSD.