Quelques précautions pour éviter que votre serveur Web ne soit compromis, ou s’il l’était, pour en limiter les conséquences.
Si votre serveur Web est compromis, par exemple à cause d’une faille dans une application PHP, l’attaquant peut avoir accès au système.
Une façon de l’empêcher d’avoir ce genre d’accès est d’isoler le programme Apache dans une sorte de prison, un environnement uniquement réservé sans possibilité d’en sortir.
La solution s’appelle CHROOT.
En très résumé, “chroot” change la root, cad qu’il modifie pour le programme en question, la racine de l’arborescence de fichiers.
Sans chroot, un attaquant peut remonter à la racine / , et évidemment à tous les dossiers /usr/bin, /etc, /var …
Avec chroot, si par exemple nous emprisonnons Apache dans un environnement où SA racine / est en fait le dossier /var/www (par exemple), il est clair qu’un attaquant ne pourra avoir accès à rien qui se trouve plus bas que /var/www.
Beaucoup de documentations, explications et exemples que j’utilise ici viennent du site The Journal Of A Linux Sysadmin.
Comment faire tourner Apache en chroot ?
On peut faire la configuration à la main, mais il existe une façon plus simple de faire.
On peut ajouter des modules à Apache. En Debian et Ubuntu, une série de modules existent et sont directement installables de la façon la plus classique.
Un de ces modules est justement conçu pour isoler Apache dans un chroot :
Vérifions d’abord les modules déjà inclus dans Apache2.
Ces modules sont compilés avec Apache2 et il est impossible de les désactiver, sauf en recompilant Apache2 :
$ apache2 -l Compiled in modules: core.c mod_log_config.c mod_logio.c prefork.c http_core.c mod_so.c
Cela ne nous renseigne pas beaucoup…
Vous pouvez avoir plus d’information au sujet de ces modules statiques ici : Debian Apache2 modules: Appendix 1 - Statically build-in modules
Certains modules sont déjà installés par Debian ou Ubuntu, mais pas nécessairement actifs.
On peut voir la liste des modules dans les dossiers d’Apache2.
Les modules disponibles :
$ cd /etc/apache2/mods-available/ :/etc/apache2/mods-available$ ls actions.conf dav_fs.load mime_magic.load actions.load dav.load negotiation.conf alias.conf dav_lock.load negotiation.load alias.load dbd.load php5.conf asis.load deflate.conf php5.load auth_basic.load deflate.load proxy_ajp.load auth_digest.load dir.conf proxy_balancer.load authn_alias.load dir.load proxy.conf authn_anon.load disk_cache.conf proxy_connect.load authn_dbd.load disk_cache.load proxy_ftp.load authn_dbm.load dump_io.load proxy_http.load authn_default.load env.load proxy.load authn_file.load expires.load rewrite.load authnz_ldap.load ext_filter.load setenvif.conf authz_dbm.load file_cache.load setenvif.load authz_default.load filter.load speling.load authz_groupfile.load headers.load ssl.conf authz_host.load ident.load ssl.load authz_owner.load imagemap.load status.conf authz_user.load include.load status.load autoindex.conf info.conf suexec.load autoindex.load info.load unique_id.load cache.load ldap.load userdir.conf cern_meta.load log_forensic.load userdir.load cgid.conf mem_cache.conf usertrack.load cgid.load mem_cache.load version.load cgi.load mime.conf vhost_alias.load charset_lite.load mime.load dav_fs.conf mime_magic.conf
Si vous voulez en savoir plus sur les modules déjà installés : Debian Apache2 modules: Appendix 2 - Standard modules installed
Mais tous ces modules ne sont pas activés (avec un lien logique vers le dossier mods-enabled) :
$ cd /etc/apache2/mods-enabled/ :/etc/apache2/mods-enabled$ ls alias.conf autoindex.conf negotiation.conf alias.load autoindex.load negotiation.load auth_basic.load cgi.load php5.conf authn_file.load dir.conf php5.load authz_default.load dir.load setenvif.conf authz_groupfile.load env.load setenvif.load authz_host.load mime.conf status.conf authz_user.load mime.load status.load
Le module qui nous intéresse pour chroot n’est pas dans cette liste. Une petite recherche dans la liste des paquets :
$ aptitude search chroot p chrootuid - Exécute des commandes dans un environnement restreint p dchroot - Execute commands in a chroot environment p dchroot-dsa - Execute commands in a chroot environment p fakechroot - gives a fake chroot environment p libapache2-mod-chroot - run Apache in a secure chroot environment p libpam-chroot - Chroot Pluggable Authentication Module for PAM p mod-chroot-common - run Apache in a secure chroot environment p schroot - Execute commands in a chroot environment p schroot-common - common files for schroot
Celui qui nous intéresse est libapache2-mod-chroot.
Il s’installe de façon classique sous Debian et Ubuntu :
$ sudo aptitude install libapache2-mod-chroot [sudo] password for didier: Lecture des listes de paquets... Fait Construction de l'arbre des dépendances Lecture des informations d'état... Fait Lecture de l'information d'état étendu Initialisation de l'état des paquets... Fait Construction de la base de données des étiquettes... Fait Les NOUVEAUX paquets suivants vont être automatiquement installés : mod-chroot-common Les NOUVEAUX paquets suivants vont être installés : libapache2-mod-chroot mod-chroot-common 0 paquets mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour. Il est nécessaire de télécharger 12,7ko d'archives. Après dépaquetage, 115ko seront utilisés. Voulez-vous continuer ? [Y/n/?] Écriture de l'information d'état étendu... Fait Prendre :1 http://be.archive.ubuntu.com gutsy/universe mod-chroot-common 0.5-7 [9196B] Prendre :2 http://be.archive.ubuntu.com gutsy/universe libapache2-mod-chroot 0.5-7 [3482B] 12,7ko téléchargés en 0s (122ko/s)
Le module est maintenant dans la liste des modules disponibles :
$ ls /etc/apache2/mods-available/mod* /etc/apache2/mods-available/mod_chroot.load
mais pas activé.
Nous pourrions le mettre dans le dossier “enable” avec un lien symbolique :
$ cd /etc/apache2/mods-enabled/ :/etc/apache2/mods-enabled$ ln -s ../mods-available/mod_chroot.load mod_chroot.load
Nous pourrions…
mais Debian et Ubuntu ont une méthode plus facile pour gérer les modules disponibles.
La commande a2enmod, pour Apache2 Enable Module permet… d’activer un module
$ sudo a2enmod Which module would you like to enable? Your choices are: actions alias asis auth_basic auth_digest authn_alias authn_anon authn_dbd authn_dbm authn_default authn_file authnz_ldap authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cern_meta cgid cgi charset_lite dav_fs dav dav_lock dbd deflate dir disk_cache dump_io env expires ext_filter file_cache filter headers ident imagemap include info ldap log_forensic mem_cache mime mime_magic mod_chroot negotiation php5 proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http proxy rewrite setenvif speling ssl status suexec unique_id userdir usertrack version vhost_alias Module name?
On peut répondre en tapant le nom du module à activer,
mais il est évidemment plus simple de l’inclure directement dans la commande :
$ sudo a2enmod mod_chroot
[sudo] password for didier:
Module mod_chroot installed;
run /etc/init.d/apache2 force-reload to enable.
On peut vérifier qu’en effet le module est maintenant dans la liste des modules qui seront actifs au prochain chargement d’Apache2 :
ls -l /etc/apache2/mods-enabled/mod* lrwxrwxrwx 1 root root 33 2007-11-25 02:44 /etc/apache2/mods-enabled/mod_chroot.load -> ../mods-available/mod_chroot.load
A noter qu’il existe une commande du même genre pour désactiver un module : “a2dismod“. Le nouveau module n’est actif qu’après avoir rechargé Apache2 :
$ sudo /etc/init.d/apache2 force-reload * Reloading web server config apache2
On peut vérifier le log :
$ less /var/log/apache2/error.log [Sun Nov 25 02:45:35 2007] [notice] Graceful restart requested, doing restart [Sun Nov 25 02:45:35 2007] [notice] Apache/2.2.4 (Ubuntu) mod_chroot/0.5 configured -- resuming normal operations
Voilà ![]()
Vérifiez quand même que votre serveur Web tourne normalement,
le “chroot” ne devrait rien changer au fonctionnement,
mais à la sécurité, oui !





