Esquema de permissões ideais para vários sites Apache / PHP

4

Estou hospedando vários sites em um servidor, onde cada site tem seu próprio usuário e o diretório www em seu diretório inicial. Atualmente, nosso servidor web é executado como usuário nobody (99). Estamos percebendo que para executar vários scripts e mecanismos populares, eles exigem acesso de gravação a seus próprios arquivos.

Como o diretório pessoal é de propriedade do usuário, não de ninguém (99), qual é a melhor política ou a alteração na configuração de hospedagem que:

  • ... faz com que todos os vários mecanismos e plataformas funcionem?
  • ... ainda nos permite trabalhar com arquivos e editá-los sem ter que atrapalhar com permissões como root?
  • Não exige que eu faça massagens de permissões e / ou propriedade em cada alteração de arquivo.

Obrigado pelo conselho!

    
por Omega 07.01.2011 / 22:20

5 respostas

1

Você deve considerar as ACLs estendidas. Suportado no FreeBSD e no linux, o comando setfacl permite que você defina mais de um usuário / grupo que tenha acesso a cada arquivo / diretório. Você pode então dar ao usuário / grupo nobody a permissão 'execute' de / home / home / user. em seguida, leia e escreva apenas na raiz do documento dos sites em que eles precisam.

Se isso não for feito, você pode simplesmente alterar o grupo do diretório home de cada usuário para nobody e usar as permissões 710 em / home / username e, em seguida, chown user: nobody e chmod 770 na raiz do documento.

Lembre-se de que o usuário 'nobody' exigirá a permissão 'execute' em todos os diretórios entre / e a raiz do documento (visualize uma permissão específica ou o campo 'other') e, em seguida, leia (e escreva opcionalmente) raiz do documento. Você pode impedir que todos os outros usuários leiam ou executem no diretório de usuários ou no diretório raiz do documento. Não é incomum ver / home onde ninguém além do root tenha acesso de leitura, e todos os usuários só tenham executado. então eles podem chegar ao / home / nome de usuário, mas eles não podem obter uma lista de quais outros usuários existem no servidor

    
por 31.01.2011 / 23:24
0
chown -R :nobody root_of_all_sites
chmod g+rw -R root_of_all_sites

basicamente você torna o grupo de sites gravável e você não atribui nenhum grupo para ler e escrever nele. talvez seja necessário definir isso periodicamente (se os usuários fizerem upload de novos arquivos ou tiverem um mecanismo diferente para isso - umask etc)

    
por 07.01.2011 / 23:24
0

Os usuários desses vários sites confiam uns nos outros? Se assim for, é muito fácil para os usuários lidarem com isso sozinhos. Tudo o que o usuário deve fazer é tornar o diretório apropriado acessível para o mundo / gravável com

chmod o+wx dir
chmod o+w dir/files_webserver_should_edit*

Se o usuário quiser ter certeza de ter acesso aos arquivos criados nesse diretório, o usuário também poderá executar

chmod g+s dir

para que os arquivos criados pelo servidor da Web sejam de propriedade de ninguém, mas estejam no grupo do usuário (embora o script PHP precise garantir a criação de arquivos com acesso de grupo). o+s criaria arquivos de propriedade do usuário, mas isso pode impedir o acesso do servidor aos arquivos criados, caso as permissões do arquivo não estejam corretas. Se alguns arquivos não podem ser gravados pelo servidor, você pode ir além e

chmod o+t dir
chmod g-w dir/files_not_to_be_altered*

Se um usuário tiver acesso de gravação a um diretório, mas não a um arquivo nesse diretório, ele poderá excluir o arquivo do diretório e criar um novo que tenha acesso de gravação. O sticky bit (o + t) impede que um usuário remova um arquivo que não possui em um diretório. Com estes combinados, um script PHP pode criar novos arquivos e atualizar e excluir os arquivos que eles criam (já que eles serão de propriedade de "nobody"), mas não podem editar "files_not_to_be_altered" e não podem apagá-los, pois são de propriedade de "usuário").

Isso dá ao usuário o controle sobre quais diretórios são realmente graváveis pelo servidor web, e não requer acesso root, já que não está alterando a propriedade.

Se os usuários não confiam uns nos outros , você precisará de uma pequena intervenção de raiz. A estrutura de diretórios de cada site precisará ser ajustada uma vez para converter sua propriedade:
Observação: essas instruções presumem que o grupo de ninguém também é ninguém, mas alguns sistemas usam nogroup

chown -R user:nobody /some/website
chmod -R g+rX,o-rwx /some/website

(o capital X adiciona x acesso aos diretórios)

Isso tornará a árvore de diretórios acessível ao usuário e a ninguém e removerá o acesso de todas as outras pessoas. Os usuários podem proceder por conta própria, concedendo g+w access onde desejarem, mas terão que usar u+s em vez de g+s para garantir que tenham acesso aos arquivos criados pelo servidor da web. o+t funcionará como pretendido.

Como um aparte, você pode ter outros servidores usando nobody / nogroup ... para minimizar métodos alternativos de ataque (uma exploração em algum outro serviço em execução, pois ninguém permite que um atacante grave nesses sites). usuário / grupo do servidor web que somente o servidor da Web executa como.

    
por 07.01.2011 / 23:58
0

Provavelmente, a maneira mais fácil de fazer isso é usar mpm-itk - ele exigirá que você alterne mpms e incorrer em um impacto no desempenho. No entanto, isso permitirá que você configure um usuário diferente para o Apache usar por VirtualHost e não precisará de outras alterações de configuração. Eu tentei, e é muito fácil de usar, e o impacto no desempenho não é horrível . YMMV claro ...

    
por 01.02.2011 / 02:50
0

Para um melhor desempenho, você deve executar os scripts PHP como um usuário separado e chown os arquivos para que o usuário do Apache só tenha acesso de leitura a eles.

O mais fácil é usar o SuPHP: link

Outra opção é executar o PHP no modo CGI e certificar-se de que o Apache esteja configurado para exec () em cada CGI sob seu próprio userid. Instruções aqui:

link

    
por 08.02.2011 / 10:28