[Accueil] alex / doc / apache confiné


Installation d'un serveur Apache confiné
avec chroot et makejail sur Debian Woody

$Revision: 1.15 $
$Date: 2004/01/19 10:15:38 $

ENGLISH

Introduction

L'utilitaire chroot permet d'enfermer un démon dans une arborescence limitée. L'objectif est de cloisonner les services offerts, pour que les failles d'un logiciel risquent moins de compromettre la sécurité de toute la machine. Le script makejail simplifie beaucoup la création et la mise à jour de l'arborescence de la « prison ».

Licence

Copyright 2002-2004 Alexandre Ratti. Document diffusé dans les conditions des licences GPL 2 (GNU General Public License) et GFDL 1.2 (GNU Free Documentation License). [Explications]

Installation du serveur

Toutes les manips ont été faites sur Debian GNU/Linux 3.0 (Woody). J'ai utilisé la version 0.0.4-1 (Debian/testing) de makejail.

  1. En tant que root, créez le répertoire de la prison :

    mkdir -p /var/chroot/apache

  2. Créez un utilisateur et un groupe ; le serveur Apache confiné (chrooté) tournera sous cette identité, qui n'est pas utilisée ailleurs. Ici, l'utilisateur et le groupe s'appellent chrapach.

    adduser --home /var/chroot/apache --disabled-login --no-create-home \
    --system --group chrapach


    À revoir : j'ai créé un utilisateur système ; est-ce une bonne idée ?

  3. Installez Apache de manière classique.

    apt-get install apache

  4. Configurez Apache (sous-domaines, etc.). Dans le fichier /etc/apache/httpd.conf, donnez la valeur chrapach aux options User et Group. puis redémarrez Apache et vérifiez que le serveur fonctionne correctement. Ensuite, arrêtez le démon Apache.

    User chrapach
    Group chrapach

    /etc/init.d/apache restart
    ...
    /etc/init.d/apache stop

  5. Installez makejail (proposé dans Debian/testing à l'heure actuelle). Installez aussi wget et lynx, qui sont utilisés par makejail pour tester le serveur.

    apt-get install makejail wget lynx

  6. Copiez l'exemple de fichier de config pour Apache.

    cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/

  7. Modifiez le fichier /etc/makejail/apache.py. Vous devez définir les valeurs chroot, users et groups. Pour faire fonctionner cette version de makejail, j'ai également dû ajouter une option packages. Voir la doc de makejail. Contenu de mon fichier :

    chroot="/var/chroot/apache"
    testCommandsInsideJail=["/usr/sbin/apachectl start"]
    processNames=["apache"]
    testCommandsOutsideJail=["wget -r --spider http://localhost/",
                             "lynx --source https://localhost/"]
    preserve=["/var/www",
              "/var/log/apache",
              "/dev/log"]
    users=["chrapach"]
    groups=["chrapach"]
    packages=["apache", "apache-common"]
    userFiles=["/etc/password",
               "/etc/shadow"]
    groupFiles=["/etc/group",
                "/etc/gshadow"]
    forceCopy=["/etc/hosts",
               "/etc/mime.types"]
    

    À revoir : certaines options semblent ne pas fonctionner correctement. Par exemple, /etc/shadow et /etc/gshadow ne sont pas copiés ; /etc/password et /etc/group sont copiés intégralement, au lieu d'être filtrés.

  8. Créez l'arborescence de chroot :

    makejail /etc/makejail/apache.py

  9. Si les fichiers /etc/password et /etc/group ont été copiés intégralement, entrer

    grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd
    grep chrapach /etc/group > /var/chroot/apache/etc/group


    pour les remplacer par des fichiers filtrés.

  10. Copiez les pages du site et les journaux dans la prison. Ces pages ne sont pas copiées automatiquement (voir l'option preserve du fichier de config).

    cp -Rp /var/www /var/chroot/apache/var
    cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache

  11. Modifiez le script de démarrage du démon de journalisation pour qu'il écoute aussi le socket /var/chroot/apache/dev/log. Dans /etc/init.d/sysklogd, remplacez :

    SYSLOGD=""

    par

    SYSLOGD=" -a /var/chroot/apache/dev/log"

    et redémarrez le service (/etc/init.d/sysklogd restart).

  12. Modifiez le script de démarrage d'Apache (/etc/init.d/apache). J'ai dû le bricoler pour le faire fonctionner avec l'arborescence de chroot. Il faut :

    Voir mon fichier.
    À revoir : est-il utile d'exécuter le premier processus d'Apache sous une autre identité que root (ajouter --chuid chrapach:chrapach) ? Inconvénients : chrapach devra avoir un droit d'écriture dans les journaux, ce qui peut poser problème.

  13. Dans le fichier /etc/logrotate.d/apache, remplacez

    /var/log/apache/*.log

    par

    /var/chroot/apache/var/log/apache/*.log

  14. Lancez Apache (/etc/init.d/apache start) et regardez ce qui se passe dans le journal de la prison (/var/chroot/apache/var/log/apache/error.log). Si vous avez une configuration plus complexe (PHP et MySQL, au hasard), il va vous manquer des fichiers. Si des fichiers ne sont pas copiés automatiquement par makejail, vous pouvez les ajouter à l'option forceCopy du fichier /etc/makejail/apache.py.

  15. Vérifiez qu'Apache est lancé en tapant "ps aux | grep apache". Vous devriez voir :

    root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache
    chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
    chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
    chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
    chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
    chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache

  16. Vérifiez que les processus sont bien enfermés dans la prison en tapant :

    ls -la /proc/numéro_processus/root/.

    ou numéro_processus est remplacé par l'un des numéros ci-dessus (2ème colonne ; 189 par exemple). Vous devriez voir une arborescence limitée :

    drwxr-sr-x 10 root staff 240 Dec 2 16:06 .
    drwxrwsr-x 4 root staff 72 Dec 2 08:07 ..
    drwxr-xr-x 2 root root 144 Dec 2 16:05 bin
    drwxr-xr-x 2 root root 120 Dec 3 04:03 dev
    drwxr-xr-x 5 root root 408 Dec 3 04:03 etc
    drwxr-xr-x 2 root root 800 Dec 2 16:06 lib
    dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc
    drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin
    drwxr-xr-x 6 root root 144 Dec 2 16:04 usr
    drwxr-xr-x 7 root root 168 Dec 2 16:06 var

    Pour automatiser ce test, on peut taper :

    ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/.

    À revoir : quels autres tests peut-on faire pour vérifier que la cellule est bien fermée ?

Intérêt de ce système : la mise en place de la prison n'est pas trop pénible et vous devriez pouvoir actualiser le serveur en deux commandes et demi :

apt-get update && apt-get install apache
makejail /etc/makejail/apache.py

Documentation


$Id: index.html,v 1.15 2004/01/19 10:15:38 alex Exp $
http://www.gabuzomeu.net/alex/doc/apache/index.html
courrier électronique | e-mail  Alexandre Ratti