$Revision: 1.15 $
$Date: 2004/01/19 10:15:38 $
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 ».
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]
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.
En tant que root, créez le répertoire de la
prison :
mkdir -p /var/chroot/apache
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 ?
Installez Apache de manière classique.
apt-get install apache
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
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
Copiez l'exemple de fichier de config pour Apache.
cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/
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.
Créez l'arborescence de chroot :
makejail /etc/makejail/apache.py
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.
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
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).
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 :
CHRDIR au début du fichier ;start, stop, reload,
etc. ;ajouter une ligne pour monter et démonter l'arborescence /proc
dans la prison.
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.
Dans le fichier /etc/logrotate.d/apache, remplacez
/var/log/apache/*.log
par
/var/chroot/apache/var/log/apache/*.log
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.
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
ls -la /proc/numéro_processus/root/.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
makejail,
script écrit par Alain Tésiomakejail, Pascal Brugier, easter-eggs.org, 21/03/2002
$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