Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Limitar a execução do PHP?


Existem várias camadas que você precisa proteger.

Alguns dos hosters incorretamente dependem de "proteções" PHP como open_basedir, safe_mode (PHPs mais antigos), disable_functions etc.

Mesmo o PHP NÃO os considera recursos de segurança - http://php.net/security- note.php

Estes podem ser desabilitados com qualquer exploit para PHP e então todo o sistema está condenado, não faça isso.

Como deve ser feito

a parte inferior

  • Usuário de sistema/nível de SO separado para cada site hospedado
  • permissões corretas (um não pode visualizar/editar a página do outro) - também certifique-se de que os subdiretórios tenham a permissão correta, pois serão semelhantes
  • arquivos de sessão separados (MUITOS webhostings colocam arquivos de sessão de cada site hospedado em PHP no mesmo diretório, isso é ruim ruim ruim!

O Apache finalmente conseguiu seu próprio módulo para isso - Apache MPM-ITK .

Resumindo: imagine isso como você daria ao usuário um shell na máquina (sob seu próprio uid) - ele não pode fazer nada com os outros sites hospedados.
  1. uid/gid diferente
  2. permissões do sistema
  3. estruturas como SELinux, AppArmor e similares
  4. grsecurity se você quiser ser hardcore... mas o sistema será mais difícil de manter.

subindo?


Você pode obter mais hard-core. O melhor que eu vi é uma biblioteca compartilhada para apache (ou o que você usar) - que é usada quando o apache é iniciado usando LD_PRELOAD e implementa todas as chamadas de sistema potencialmente maliciosas como system() , execve() e basicamente qualquer outra chamada que você achar ruim.

Ainda não vi uma boa implementação disso por aí (além das personalizadas em algum lugar) - corrija-me se estiver errado.

Certifique-se de implementar uma lista branca para isso, por exemplo. mail() em PHP executa sendmail por padrão e isso não funcionará mais.

conclusão


Adicione o clássico disable_functions, open_basedir, etc. no php.ini global, adicione session.save_path a cada vhost - coloque as sessões nos diretórios do usuário. Certifique-se de que os usuários não compartilhem nada .

Implemente corretamente a separação no nível do SO subjacente.

Obtenha hardcore com grsec e LD_PRELOAD lib hooking chamadas de sistema.

Separação, separação, separação .. em breve sistemas como o Docker fornecerão contêineres baseados em LXC para separar usuários no nível do kernel, mas ainda não está pronto para produção (imho).