Auteur : Didier Misson
• 25 novembre 2007

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 !
;-)

Catégorie: Serveurs | Tags : , ,
Vous pouvez suivre toutes les réponses à à ce billet via le flux RSS 2.0. Les commentaires et la notification par ping sont désactivés.

Les commentaires sont désactivés.