Mysql
 sql >> Base de données >  >> RDS >> Mysql

Limiter l'exécution de PHP ?

Il y a plusieurs couches que vous devez protéger.

Certains des hébergeurs incorrectement compter sur les "protections" PHP comme open_basedir, safe_mode (anciens PHP), disable_functions etc.

Même PHP ne les considère PAS comme des fonctions de sécurité - http://php.net/security- note.php

Ceux-ci peuvent être désactivés avec n'importe quel exploit pour PHP, puis tout le système est condamné, ne le faites pas fais ça.

Comment cela devrait être fait

le bas

  • Utilisateur distinct au niveau du système d'exploitation/système pour chaque site hébergé
  • autorisations correctes (l'un ne peut pas afficher/modifier la page de l'autre) - assurez-vous également que les sous-répertoires ont les autorisations correctes car ils seront similaires
  • fichiers de session séparés (BEAUCOUP d'hébergements Web placent les fichiers de session de chaque site hébergé en PHP dans le même répertoire, c'est mauvais mauvais mauvais !

Apache a finalement obtenu son propre module pour cela - Apache MPM-ITK .

Pour faire court : imaginez cela comme si vous donniez à l'utilisateur un shell sur la machine (sous son propre uid) - il ne peut rien faire sur les autres sites hébergés.

  1. uid/gid différent
  2. autorisations système
  3. frameworks comme SELinux, AppArmor et similaires
  4. grsécurité si vous voulez être inconditionnel... mais le système sera plus difficile à maintenir.

monter ?

Vous pouvez obtenir plus de noyau dur. Le meilleur que j'ai vu est une bibliothèque partagée pour apache (ou tout ce que vous utilisez) - qui est utilisée lorsque apache est démarré en utilisant LD_PRELOAD et il implémente tous les appels système potentiellement malveillants comme system() , execve() et essentiellement tout autre appel que vous trouvez mauvais.

Je n'ai pas encore vu de bonne implémentation de cela (autre que des implémentations personnalisées quelque part) - corrigez-moi si je me trompe.

Assurez-vous d'implémenter une liste blanche pour cela, par exemple. mail() en PHP exécute sendmail par défaut et cela ne fonctionnera plus.

conclusion

Ajoutez les fonctions classiques disable_functions, open_basedir, etc. dans le php.ini global, ajoutez session.save_path à chaque vhost - placez les sessions dans les répertoires des utilisateurs. Assurez-vous que les utilisateurs ne partagent rien .

Implémentez correctement la séparation sous-jacente au niveau du système d'exploitation.

Devenez hardcore avec les appels système grsec et LD_PRELOAD lib hooking.

Séparation, séparation, séparation... Bientôt, des systèmes comme Docker fourniront des conteneurs basés sur LXC pour séparer les utilisateurs au niveau du noyau, mais ce n'est pas encore tout à fait prêt pour la production (à mon humble avis).