Muitas boas sugestões já estão aqui. Há coisas que foram perdidas na discussão até agora.
Preste atenção aos processos fora deles executados como parte do serviço de páginas da web. ou seja, certifique-se de que todos os seus trabalhos agendados que tocam dados não confiáveis estejam sendo executados como o usuário apropriado e na cadeia apropriada, sejam esses trabalhos definidos pelo usuário ou não.
Na minha experiência, coisas como a análise de logs, quando fornecidas pelo serviço de hospedagem, são executadas como root quase sempre, e o software de análise de logs não recebe tantas auditorias de segurança quanto gostaríamos. Fazer isso bem é um pouco complicado e dependente da configuração. Por um lado, você não quer que o seu processo apache de propriedade da raiz (ou seja, o processo pai) seja gravado em qualquer diretório que o usuário possa comprometer. Isso provavelmente significa não escrever diretamente na prisão. Por outro lado, você precisa disponibilizar esses arquivos para processos na cadeia para análise, e você gostaria que isso fosse o mais próximo possível do tempo real. Se você puder dar aos seus jaulas acesso a uma montagem somente leitura de um sistema de arquivos com os logs, isso deve ser bom.
Os aplicativos PHP normalmente não atendem aos seus próprios arquivos estáticos e, se você tiver um processo apache compartilhado, acredito que o processo do apache esteja lendo as coisas diretamente das prisões do ambiente host? Se assim for, então isso abre uma série de preocupações.
.htaccess
arquivos são óbvios, onde você precisa ter muito cuidado com o que você permite. Muitos, se não, os aplicativos php mais substanciais são muito dependentes dos arranjos de arquivos .htaccess que você provavelmente não pode permitir sem subverter seu esquema planejado.
Menos óbvio é como o apache decide o que é um arquivo estático de qualquer maneira. por exemplo. O que faz com um arquivo *.php.gif
ou *.php.en
? Se esse mecanismo ou outro engana a discriminação sobre o que é um arquivo estático, é possível que o apache execute o PHP de fora da cadeia? Eu configurei um servidor web leve e separado para conteúdo estático, que não é configurado com nenhum módulo para executar conteúdo dinâmico, e tenho um balanceador de carga decidindo quais solicitações enviar para o servidor estático e qual para o dinâmico.
Em relação à sugestão do Stefan Docker, é possível ter um único servidor web que fique fora do contêiner e que converse com daemons do php em cada contêiner para o conteúdo dinâmico, além de ter um segundo servidor web, que fica em uma janela de encaixe contêiner, e que compartilha os volumes que cada um usa para seu conteúdo, e é, portanto, capaz de servir o conteúdo estático, que é muito semelhante ao do parágrafo anterior. Eu recomendo o docker entre as várias abordagens do tipo cadeia, mas com essa ou outras abordagens do tipo cadeia, você terá várias outras questões para resolver. Como funciona o upload de arquivos? Você coloca daemons de transferência de arquivos em cada contêiner? Você adota uma abordagem baseada no estilo PAAS git? Como você torna os logs gerados dentro do contêiner acessíveis e os transfere? Como você gerencia e executa tarefas cron? Você dará aos usuários qualquer tipo de acesso ao shell e, em caso afirmativo, esse outro daemon dentro do contêiner? etc, etc.