Chroot avec Nginx et php5-FPM

C’est quoi le chroot ?

Qu’est ce que j’en sais moi … je t’en pose des questions ????

Hum, pardon, le chroot c’est comme une prison c’est enfermer un processus dans un repertoire lui donnant se répertoire comme base par exemple si vous pouvez crée un dossier /var/www/chroot-mon-site est chrooté php dedans, pour php et les scripts qu’il exécutera ce dossier sera son / et il ne pourra pas accéder à autre chose que ce qui est dans ce répertoire.

L’interêt du chroot

Comme je l’ai dis plus haut « il ne pourra pas accéder à autre chose que ce qui est dans ce répertoire » ça veut donc dire que si une faille existe dans le script php que vous hébergez au pire un pirate n’aura accès qu’a ce site et non au reste du serveur, les sites sont isolés les uns des autres si un site est compromis les dégâts seront limité à ce site et sa base de donnée (Si vous n’utilisez pas root pour vous connecter à votre base de donnée évidemment ! Sérieusement des gens font ça ? BANDE DE MALADE TOUS DES FOUS). bref en clair ça permet un niveau de sécurité plus accru sur votre infrastructure.

Inconvénient du chroot

Pour commencer je déconseille au débutant le chroot pour la bonne est simple raison qu’il vaut mieux bien connaitre son OS pour le pratiquer sans bug, je m’explique :

Quand vous utilisez une simple fonction en php par exemple l’ancienne méthode pour se connecter à une bdd mysql avec PHP :

Sur ce pauvre bous de code hormis le fait que j’utilise une fonction qui n’existera bientôt plus dans PHP et que je me log en root sans mdp, cette fonction ne marchera jamais sur un environnement chrooté de base :p

Pourquoi ?

A cause de ça « localhost », la résolution DNS « localhost » -> 127.0.0.1 ne se fait pas par magie cette information est dans un fichier ce fichier sur la plupart des systèmes Unix / Linux c’est « /etc/hosts » ouvrez le fichier et regardez :

Le voilà le lien entre « localhost » et 127.0.0.1.

Et donc qu’est ce qu’il se passe en chroot ? eh bien pour php chrooté /etc/hots n’existe simplement pas en effet le fichier « /var/www/chroot-mon-site-fr/etc/hosts » n’existe pas !

le résultat est donc que si vous utilisez « localhost » comme hôte de base de donnée la connexion a MYSQL échouera, bien-sure c’est « réparable » et nous verrons ça en fin de tuto car il y a d’autres problèmes plus « embêtant » ici ce n’est qu’une introduction aux problèmes qui peuvent exister.

Mettre en place un chroot

Allez c’est partie, on va prendre un cas concret : http://guilde-vindicta.fr

Ce site est un site de guilde sur World of Warcraft, si vous faites un nslookup (dig sur Unix / Linux) vous verrez que ce site est héberger sur la même adresse IP que ce blog.

Pour commencer pourquoi j’ai choisit de faire tourner ce site en chroot ?

Ce site utilise Simple Forum Machine comme base, un CMS permettant de faire des forums, hors je trouve que niveau sécurité ce n’est pas vraiment top pour les raisons suivantes :

  • il y a déjà eu plusieurs fois des mises à jour de sécurité pour corriger des failles critiques (en même temps c’est le cas dans tous les CMS).
  • Un simple administrateur peut modifier les fichiers php voir même en ajouter (avec leurs systèmes de paquet), il est possible de jouer avec le chmod mais ça rend l’administration moins flexible.
  • Les développeurs de ce CMS trouvent intelligent l’idée de mettre le numero de version dans le pied de page (sur Vindicta je l’ai enlevé pour des raisons évidentes de sécurité …) mais regardez n’importe quel autre site utilisant SMF il y aura le numero de version.

Pour revenir par exemple sur ce derniers point regardez ce site, il utilise effectivement le même thème que Vindicta mais ce n’est pas ce qui nous intéresse ici, regardez le pied de page et voyez « SMF 2.0.6 » (à l’heure ou j’écris ces lignes bien sure) hors juste avant il était en 2.0.5 et le patch 2.0.6 corrigeait une faille de sécurité donc pour un pirate même pas besoin de « chercher » la version utilisé il à juste à regarder en bas de page.

La suite du tuto se déroule sur Debian mais ça doit être à peut prêt pareil sur les autres distributions.

Configuration de PHP-FPM

On va donc crée un nouveau pool PHP-FPM qui sera chrooté dans le dossier qui nous « /etc/php5/fpm/pool.d »

Dans ce fichier il faudra mettre :

Vous pouvez enregistrer le fichier et relance php5-fpm la config du pool est terminer, maintenant il faut configurer nginx pour utiliser ce pool

donc :

 

 

A ce stade vous pouvez relancer Nginx et votre chroot devrait fonctionner.

Régler les problèmes

Résolution du problème de crash du session_start();, php écrit les données des session dans un dossier sur le disque, si ce dossier n’existe pas … bah il n’écrit pas 🙁

 

Résolution de localhost :

Déjà pour régler le soucis que j’ai exposé dans l’introduction il suffit de faire un petit

Eh oui il suffit de mettre le fichier qui contient le liens dans le chroot et voilà.

Résolution DNS d’autre site

Pour les système de mise à jour ou encore d’envoi de mail via serveur smtp externe php doit pouvoir résoudre un nom de domaine, par défaut vous verrez que ça ne fonctionne pas, eh oui php ne peut pas accéder à la lib de résolution DNS

Pour régler ça il faut mettre les bonnes lib dans le dossier du chroot

Les mails

la fonction php mail(); utilisé par certains CMS est gourmande en composant nécessaire, il lui faut un shell car pour utiliser sendmail php utilise shell (shellshock, salut :D)

Du coup il va falloir mettre bash (ou un autre shell) dans le chroot mais évidement bash a besoin de lib pour fonctionner on va utiliser ce script  pour installer bash dans notre chroot

Téléchargez ce fichier sur votre serveur et modifiez la ligne :

 

Remplacez « /webroot » par /var/www/chroot-mon-site-fr sauvegardez le fichier et rendez le executable (chmod +x)

Sh devrait maintenant être installer dans votre environnement chrooté.

Maintenant il va falloir mettre sendmail dans l’environnement, le problème c’est que le vrai sendmail dépend d’énormément de lib et de fichier de config, du coup … gros bordel

On va donc utiliser mini_sendmail a la place il va falloir le compilez, placez vous dans un dossier de travail puis :

Les mails avec mail(); devraient fonctionner.

Conclusion

Le chroot est une bonne technique pour améliorer la sécurité de votre serveur mais comme vous pouvez le constater vous devez connaitre le fonctionnement de votre distribution (et plus particulièrement quelle lib fait quoi) pour que cela fonctionne correctement.

 

 

Vous avez aimé cet article ? Partagez-le :)

Facebook Google Plus Twitter Linkedin email

3 réflexions au sujet de « Chroot avec Nginx et php5-FPM »

  1. Pas mal d’erreurs de frappe, comme :
    ‘/var/www/chroot-mon-site-fr/lib/x86_64-linux-gn’ qui devrait etre ‘/var/www/chroot-mon-site-fr/lib/x86_64-linux-gnu’,
    ainsi que:
    ‘cp mini_sendmail /var/www/chroot-mon-site/sbin/sendmail’ qui devrai etre ‘cp mini_sendmail /var/www/chroot-mon-site/usr/sbin/sendmail’.

    Sinon m’as apporté de l’aide ^^

  2. plutôt que de copier les librairies dans le chroot… on peu utiliser la variable d’environnement LD_PRELOAD pour pre-charger les librairies comme la librairie dns qui elle est charger dynamiquement a la première résolution dns…

    http://man7.org/linux/man-pages/man8/ld.so.8.html

    genre (a intègré dans le script init ou dans le fichier service de systemd) :
    # LD_PRELOAD=/lib/x86_64-linux-gnu/libnss_dns.so.2 /sbin/php-fpm

    pour le mail l’idéal est d’utiliser une librairie php qui accède directement en protocole smtp ce qui évite d’ajoute un mini sendmail dans le chroot.

    on peu utiliser strace pour identifier les librairies utilisé dynamiquement par php par le pool php-fpm.

    curl par exemple charge des librairies lier a nss quand on fait du tls/ssl.

    avec mod_chroot pour apache il y a un certain nombre d’exemple de contournement pour ces problèmes:
    https://zenprojects.github.io/Apache-mod-chroot/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *