Hay varias capas que necesitas proteger.
Algunos de los anfitriones incorrectamente confíe en las "protecciones" de PHP como open_basedir, safe_mode (PHP más antiguos), disabled_functions, etc.
Incluso PHP NO las considera características de seguridad - http://php.net/security- nota.php
Estos se pueden deshabilitar con cualquier exploit para PHP y luego todo el sistema está condenado, no haz eso.
Cómo debe hacerse
el fondo
- Usuario de sistema/nivel de SO separado para cada sitio alojado
- permisos correctos (uno no puede ver/editar la página del otro) - también asegúrese de que los subdirectorios tengan el permiso correcto ya que van a ser similares
- archivos de sesión separados (MUCHOS alojamientos web colocan archivos de sesión de cada sitio alojado en PHP en el mismo directorio, ¡eso es malo, malo, malo!
Apache finalmente obtuvo su propio módulo para esto - Apache MPM-ITK .
En pocas palabras: Imagínese esto como si le diera al usuario un shell en la máquina (bajo su propio uid); no puede hacer nada con los otros sitios alojados.
- diferente uid/gid
- permisos del sistema
- frameworks como SELinux, AppArmor y similares
- grsecurity si quieres ser duro... pero el sistema será más difícil de mantener.
¿subiendo?
Puedes conseguir más hardcore. Lo mejor que he visto es una biblioteca compartida para apache (o lo que sea que use), que se usa cuando apache se inicia usando LD_PRELOAD
e implementa todas las llamadas al sistema potencialmente maliciosas como system()
, execve()
y básicamente cualquier otra llamada que te parezca mala.
Todavía no he visto una buena implementación de esto (aparte de las personalizadas en algún lugar). Corríjame si me equivoco.
Asegúrese de implementar una lista blanca para esto como, por ejemplo. mail() en PHP ejecuta sendmail por defecto y eso ya no funcionará.
conclusión
Agregue las funciones clásicas disabled_functions, open_basedir, etc. en php.ini global, agregue session.save_path a cada vhost:coloque sesiones en directorios de usuarios. Asegúrese de que los usuarios no compartan nada .
Implemente correctamente la separación subyacente del nivel del sistema operativo.
Ponte duro con grsec y LD_PRELOAD lib llamadas al sistema de enganche.
Separación, separación, separación... Muy pronto, los sistemas como Docker proporcionarán contenedores basados en LXC para separar a los usuarios en el nivel del kernel, pero aún no está listo para la producción (en mi humilde opinión).