Um caminho seria este:
- Tenha um grupo para cada site, faça com que as pessoas desse grupo usem
umask 0002
, para que os arquivos criados por eles sejam de leitura / gravação para o grupo e legíveis para outros por padrão. -
chmod a-rwx
do diretório raiz de cada site, para impedir o acesso de pessoas fora do grupo permitido. - Ative as ACLs para o seu sistema de arquivos e
setfacl -m user:apache:rx
esse diretório para conceder acesso de leitura ao usuárioapache
, além das outras permissões.
Quanto aos arquivos criados pelo processo do apache:
- A leitura de arquivos criados pelo usuário do apache deve ser possível para o grupo relevante, desde que sejam criados legíveis pelo mundo.
- A exclusão de arquivos é possível desde que eles residam em um diretório gravável em grupo.
- Se isso não for suficiente, você poderá permitir que seus usuários atinjam
sudo
para o usuário do apache. Talvez apenas para executar comandos específicos, por ex. adicione permissões de gravação de grupo usando ACLs.
Mas, como você afirmou, todas as restrições de leitura podem ser contornadas se os usuários puderem executar scripts arbitrários como o usuário do apache. Para combater isso, você poderia tentar ter os scripts de um site executados como um usuário específico no grupo correspondente. Eu acredito que há uma maneira de configurar isso usando mod_fcgid
. Caso contrário, apache[suexec]
e php[cgi]
podem funcionar para você.
Para obter um isolamento ainda melhor, você teria que ter vários processos do apache, executados como usuários diferentes e talvez até mesmo chrooted para diretórios diferentes. Ou em diferentes unidades OpenVZ, ou diferentes domes Xen, ou em hardware diferente. Como você pode ver, há vários níveis de isolamento diferentes, cada um fornecendo melhor isolamento do que o anterior, às custas das demandas de recursos.