Bonjour,
Je sais que c'est bientôt les fêtes et qu'on a tous plein de trucs à faire, mais ça ne coûte rien de poser la question :
J'ai un serveur Apache mutualisé, avec environ 250 sites web. La plupart utilisent PHP. La machine est en FreeBSD, le file system en ZFS, ce qui me permet déjà de gérer certaines choses (userquota/groupquota, noexec, snapshots…). Mais je me retrouve face à l'inévitable merdier lié à php. Apache doit lire partout, et quand une appli moisie genre Joomla se fait hackée le pirate qui pose son webshell accède à l'intégralité des fichiers des autres sites web.
Quelles techniques utilisez-vous avec Apache/PHP quand vous voulez cloisonner des sites web ?
patpro
Le 21/12/2012 18:28, Patrick Proniewski a écrit :
Bonjour,
Je sais que c'est bientôt les fêtes et qu'on a tous plein de trucs à faire, mais ça ne coûte rien de poser la question :
J'ai un serveur Apache mutualisé, avec environ 250 sites web. La plupart utilisent PHP. La machine est en FreeBSD, le file system en ZFS, ce qui me permet déjà de gérer certaines choses (userquota/groupquota, noexec, snapshots…). Mais je me retrouve face à l'inévitable merdier lié à php. Apache doit lire partout, et quand une appli moisie genre Joomla se fait hackée le pirate qui pose son webshell accède à l'intégralité des fichiers des autres sites web.
Quelles techniques utilisez-vous avec Apache/PHP quand vous voulez cloisonner des sites web ?
patpro
mpm-itk ? http://mpm-itk.sesse.net/
JYL
Le 21/12/2012 18:39, jean-yves@lenhof.eu.org a écrit :
mpm-itk ? http://mpm-itk.sesse.net/
Oui bonne solution c'est un peu mieux que suPHP et suexec pour les cgi.
On 21 déc. 2012, at 18:42, Wallace wrote:
Le 21/12/2012 18:39, jean-yves@lenhof.eu.org a écrit :
mpm-itk ? http://mpm-itk.sesse.net/
Oui bonne solution c'est un peu mieux que suPHP et suexec pour les cgi.
Merci pour ces réponses rapides. Malheureusement le problème est un peu complexe : de nombreux sites partagent le même vhost. J'ai 40 vhosts pour plus de 250 sites web. Il faudrait que je change de nombreuses choses pour avoir un vhost par site. Néanmoins, c'est une piste et je peux l'explorer, voire la mettre en prod, avant d'avoir un vhost par site. Ça limiterait déjà les dégâts. Je vais regarder ça de plus près. D'après ce que je vois le port FreeBSD correspondant intègre un patch qui permet de gérer un user par path et non seulement un user par vhost. Ça pourrait bien le faire.
Merci et bonnes fêtes à tous, patpro
Le 21/12/2012 18:42, Wallace a écrit :
Le 21/12/2012 18:39, jean-yves@lenhof.eu.org a écrit :
mpm-itk ? http://mpm-itk.sesse.net/
Oui bonne solution c'est un peu mieux que suPHP et suexec pour les cgi.
Pourquoi/sur quel plan c'est un peu mieux ?
Le 23/12/2012 23:07, Simon Morvan a écrit :
Le 21/12/2012 18:42, Wallace a écrit :
Le 21/12/2012 18:39, jean-yves@lenhof.eu.org a écrit :
mpm-itk ? http://mpm-itk.sesse.net/
Oui bonne solution c'est un peu mieux que suPHP et suexec pour les cgi.
Pourquoi/sur quel plan c'est un peu mieux ?
C'est les process apache qui sont directement exécutés sous l'uid/gid voulu (et donc tous les modules apache et ce qui est exécuté en CGI également) donc possibilité de chmod o-rwx les docroot de chaque utilisateur pour avoir une véritable sécurisation/cloisonnement.
Il est possible, si l'on utilise mod_vhs pour avoir des vhosts en base MySQL de spécifier l'uid et gid de chaque vhost dans la base.
ps: plus besoins de suexec avec itk, à savoir également qu'itk est basé sur prefork donc il y aura un overhead par rapport à du mpm worker ou event avec tous les process exécutés par un même utilisateur en fonction de la taille de la prod mais les bénéfices niveau sécurité en valent bien la peine.
Bonjour,
Le 21/12/2012 18:28, Patrick Proniewski a écrit :
Quelles techniques utilisez-vous avec Apache/PHP quand vous voulez cloisonner des sites web ?
Nous avons développé deux modules PHP :
- un suphp 'light' pour php-fcgi qui set{u,g}id les process php [1] - une surcharge à la volée des fonctions PHP, qui nous permet de modifier le comportement des fonctions sensibles (mail, exec, fopen, fsockopen, ...) [2]
[1]. https://github.com/anotherservice/php5-suphp [2]. https://github.com/anotherservice/php5-override
-- Yann Autissier
A défaut et dans l'urgence (solution absolument pas viable à long terme), il est envisageable de limiter drastiquement l'accès aux fonctions autorisant un fork() et de contraindre PHP à coups de open_basedir.
C'est médiocre point-de-vue isolation, mais le rapport gain/effort n'est pas négligeable dans un premier temps (ça prend quelque chose comme une journée à mettre en place en production, sans franchement de gros risque de se planter). Attention à ne pas oublier : si open_basedir peut être set dans la configuration Apache qui transmet à mod_php, disable_functions est uniquement autorisée dans la configuration native PHP (php.ini et affiliés).
Reste un classique qui tourne de mieux en mieux en production : quite à forker pour séparer les utilisateurs côté Apache, autant se contenter de forker le fautif (PHP) et se tourner vers des technos type fcgi (php-fpm, etc.) qui ont en prime le mérite d'être proprement standardisées et de faciliter grandement la transition de frontend (apache vers nginx est de plus en plus populaire).
J'ai pour ma part en prod un gid par vhost et des utilisateurs rajoutés au cas par cas dans les groupes adéquats.
On Sat, 2012-12-22 at 12:45 +0100, Yann Autissier wrote:
Bonjour,
Le 21/12/2012 18:28, Patrick Proniewski a écrit :
Quelles techniques utilisez-vous avec Apache/PHP quand vous voulez cloisonner des sites web ?
Nous avons développé deux modules PHP :
- un suphp 'light' pour php-fcgi qui set{u,g}id les process php [1]
- une surcharge à la volée des fonctions PHP, qui nous permet de modifier le
comportement des fonctions sensibles (mail, exec, fopen, fsockopen, ...) [2]
[1]. https://github.com/anotherservice/php5-suphp [2]. https://github.com/anotherservice/php5-override
-- Yann Autissier _______________________________________________ Liste de diffusion du FRsAG http://www.frsag.org/
Le 24/12/2012 12:08, Pierre Jaury a écrit :
A défaut et dans l'urgence (solution absolument pas viable à long terme), il est envisageable de limiter drastiquement l'accès aux fonctions autorisant un fork() et de contraindre PHP à coups de open_basedir.
La question portait sur le cloisonnement entre les sites hébergés, open_basedir limitera uniquement l'accès au système, pas aux autres sites web.
Reste un classique qui tourne de mieux en mieux en production : quite à forker pour séparer les utilisateurs côté Apache, autant se contenter de forker le fautif (PHP) et se tourner vers des technos type fcgi (php-fpm, etc.) qui ont en prime le mérite d'être proprement standardisées et de faciliter grandement la transition de frontend (apache vers nginx est de plus en plus populaire).
Nous utilisons php en fcgi, d'où le premier module pour remplacer suexec, qui ne fonctionne qu'en mod apache. Hébergeant plusieurs milliers de sites, nous ne pouvons pas nous permettre de lancer plusieurs milliers de process. Notre site tourne sous nginx, mais la solution apache reste incontournable pour nos utilisateurs à cause des htaccess.
J'ai pour ma part en prod un gid par vhost et des utilisateurs rajoutés au cas par cas dans les groupes adéquats.
Nous ne souhaitons pas créer un vhost par user, le premier module (php5-suphp) nous permet d'utiliser php-fcgi avec l'uid/gid des users, et le second (php5-override) nous permet de limiter l'action des users mal intentionnés (ou hackés).
On Sat, 2012-12-22 at 12:45 +0100, Yann Autissier wrote:
Bonjour,
Le 21/12/2012 18:28, Patrick Proniewski a écrit :
Quelles techniques utilisez-vous avec Apache/PHP quand vous voulez cloisonner des sites web ?
Nous avons développé deux modules PHP :
- un suphp 'light' pour php-fcgi qui set{u,g}id les process php [1]
- une surcharge à la volée des fonctions PHP, qui nous permet de modifier le
comportement des fonctions sensibles (mail, exec, fopen, fsockopen, ...) [2]
[1]. https://github.com/anotherservice/php5-suphp [2]. https://github.com/anotherservice/php5-override
-- Yann Autissier _______________________________________________ Liste de diffusion du FRsAG http://www.frsag.org/
Liste de diffusion du FRsAG http://www.frsag.org/
On Mon, 2012-12-24 at 17:35 +0100, Yann Autissier wrote:
Le 24/12/2012 12:08, Pierre Jaury a écrit :
A défaut et dans l'urgence (solution absolument pas viable à long terme), il est envisageable de limiter drastiquement l'accès aux fonctions autorisant un fork() et de contraindre PHP à coups de open_basedir.
La question portait sur le cloisonnement entre les sites hébergés, open_basedir limitera uniquement l'accès au système, pas aux autres sites web.
J'insiste encore une fois sur la précarité de la solution, mais open_basedir permet d'isoler partiellement les sites Web entre eux puisque surchageable par dossier ou virtual host.