Serveur Web · 4 min read · Dec 26, 2025
Chrooting Apache 2.4 avec mod_unixd sur Debian 8 (Jessie)
Ce guide explique comment configurer mod_unixd avec Apache 2.4 sur un système Debian Jessie. Avec mod_unixd, vous pouvez exécuter Apache dans un environnement chroot sécurisé et rendre votre serveur moins vulnérable aux tentatives d’intrusion qui tentent d’exploiter des vulnérabilités dans Apache ou vos applications web installées. Le module mod_unixd est un remplacement du module mod_chroot, qui était utilisé dans l’ancien apache 2.2.
1 Remarque Préliminaire
Je suppose que vous avez un système Debian 8 en cours d’exécution avec un Apache fonctionnel, par exemple comme indiqué dans ce tutoriel : Tutoriel serveur LAMP Debian 8 Jessie avec Apache 2, PHP 5 et MariaDB. En plus de cela, je suppose que vous avez un ou plusieurs sites web configurés dans le répertoire /var/www (par exemple, si vous utilisez ISPConfig).
Le serveur que j’utilise ici a l’adresse IP 192.168.1.100 et le nom d’hôte server1.example.com. Veuillez remplacer ces valeurs par l’adresse IP et le nom d’hôte de votre serveur chaque fois qu’elles apparaissent dans le tutoriel.
2 Configuration d’Apache
Le module apache mod_unixd qui offre la fonction Chroot dans Apache 2.4 fait partie des modules de base d’Apache et est compilé statiquement dans le binaire d’Apache sur Debian 8, donc nous n’avons pas besoin d’installer de logiciels supplémentaires pour l’utiliser.
Je veux utiliser le répertoire /var/www comme le répertoire contenant la prison chroot. L’Apache de Debian utilise le fichier PID /var/run/apache2.pid ; lorsque Apache est chrooté à /var/www, /var/run/apache2.pid se traduit par /var/www/var/run/apache2.pid. Par conséquent, nous créons ce répertoire maintenant :
mkdir -p /var/www/var/run
chown -R root:root /var/www/var/runMaintenant, nous devons dire à Apache que nous voulons utiliser /var/www comme notre répertoire chroot. Nous ouvrons /etc/apache2/apache2.conf, et juste en dessous de la ligne PidFile, nous ajoutons une ligne ChrootDir :
nano /etc/apache2/apache2.conf[...]
#
# PidFile : Le fichier dans lequel le serveur doit enregistrer son numéro
# d'identification de processus lorsqu'il démarre.
# Cela doit être défini dans /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
ChrootDir /var/www
[...] Ensuite, nous devons dire à nos vhosts que le document root a changé (par exemple, un DocumentRoot /var/www se traduit maintenant par DocumentRoot /). Nous pouvons le faire soit en changeant la directive DocumentRoot de chaque vhost, soit plus facilement, en créant un lien symbolique dans le système de fichiers.
2.1 Première Méthode : Changer le DocumentRoot
Supposons que nous avons un vhost avec DocumentRoot /var/www. Nous devons maintenant ouvrir la configuration du vhost de ce vhost et changer DocumentRoot /var/www en DocumentRoot /. En conséquence, DocumentRoot /var/www/web1/web se traduira maintenant par DocumentRoot /web1/web, et ainsi de suite. Si vous souhaitez utiliser cette méthode, vous devez changer le DocumentRoot pour chaque vhost.
2.2 Deuxième Méthode : Créer un Lien Symbolique dans le Système de Fichiers
Cette méthode est plus facile, car vous devez le faire une seule fois et vous n’avez pas à modifier la configuration de chaque vhost. Nous créons un lien symbolique pointant de /var/www/var/www à /var/www :
mkdir -p /var/www/var
cd /var/www/var
ln -s ../../ wwwEnfin, nous devons arrêter Apache, créer un lien symbolique de /var/run/apache2.pid à /var/www/var/run/apache2.pid, et le redémarrer :
service apache2 stopln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
service apache2 startC’est tout. Vous pouvez maintenant appeler vos pages web comme avant, et elles devraient être servies sans problèmes, tant qu’elles sont des fichiers HTML statiques ou utilisent mod_php.
Je vais tester cela maintenant avec une page phpinfo(). Ouvrez un nouveau fichier info.php avec nano dans le document root du site web par défaut :
nano /var/www/html/info.phpet ajoutez le contenu suivant :
Enregistrez le fichier et ouvrez le nom d’hôte de votre serveur ou l’adresse IP dans le navigateur, suivi de /info.php. Exemple :
La page suivante devrait s’afficher maintenant lorsque PHP fonctionne correctement :

Jusqu’ici tout va bien, mais comment savons-nous si Apache est vraiment chrooté ? Essayons d’accéder à un fichier qui est en dehors du chroot, je vais utiliser /etc/hosts ici par exemple.
nano /var/www/html/testchroot.phpavec ce contenu :
' . $var;et ouvrez l’URL du fichier de test dans un navigateur. Le résultat est :

Comme vous pouvez le voir, le contenu du fichier /etc/hosts ne peut plus être accessible depuis ce script PHP.
Supprimez les fichiers de test si vous n’en avez plus besoin :
rm /var/www/html/testchroot.php
rm /var/www/html/info.phpSi vous utilisez CGI, par exemple Perl, Ruby, etc., vous devez alors copier l’interpréteur (par exemple /usr/bin/perl, etc.) dans la prison chroot avec toutes les bibliothèques nécessaires à l’interpréteur. Vous pouvez découvrir les bibliothèques requises avec la commande ldd, par exemple :
ldd /usr/bin/perlroot@server1:/var/www/html# ldd /usr/bin/perl
linux-vdso.so.1 (0x00007ffe951f4000)
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)
root@server1:/var/www/html#ou utilisez les outils jailkit pour construire l’environnement de prison. Si vous avez copié tous les fichiers requis, mais que la page ne fonctionne toujours pas, vous devriez jeter un œil au journal des erreurs d’Apache /var/log/apache2/error.log. En général, il vous indique où se trouve le problème.
3 Liens
- mod_unixd : https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
- Apache : http://httpd.apache.org/
- Debian : http://www.debian.org/
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.