Installer l'interpréteur Perl dans un chroot Apache
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
Perl, modules, chroot, cage, OpenBSD
Introduction
Ce document décrit comment installer L'interpréteur Perl dans un chroot Apache. Il indique aussi comment déterminer la liste des modules Perl nécessaires à l'exécution d'un script.
Par défaut le système OpenBSD est livré avec un serveur Apache 1.3.x “chrooté” dans le répertoire /var/www.
Présentation de la maquette
Les éléments suivants sont mis en oeuvre :
- un système OpenBSD 3.8
- le serveur Apache 1.3.x d'OpenBSD “chrooté”
- un interpréteur Perl “chrooté”
Note
Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
Le document considère que les éléments suivants sont installés et fonctionnels :
- le système OpenBSD
- le serveur Apache 1.3.x “chrooté” dans
/var/www
Installer l'interpréteur Perl dans le chroot
Pour installer Perl dans un chroot, il faut copier l'interpréteur et ses dépendances externes (binaires, bibliothèques dynamiques, éditeur de liens) dans le répertoire de la cage.
Procédez comme suit :
Déterminer les dépendances
Déterminez les bibliothèques nécessaires :
# ldd /usr/bin/perl
/usr/bin/perl:
Start End Type Ref Name
00000000 00000000 exe 1 /usr/bin/perl
020d6000 220f7000 rlib 1 /usr/lib/libperl.so.10.0
0971f000 29726000 rlib 1 /usr/lib/libm.so.2.0
01b66000 21b6a000 rlib 1 /usr/lib/libutil.so.11.0
07f3a000 27f6b000 rlib 1 /usr/lib/libc.so.38.2
0a4d8000 0a4d8000 rtld 1 /usr/libexec/ld.so
Créer les répertoires
# cd /var/www
# mkdir {tmp,usr}
# chown www:www tmp
# chmod 700 tmp
# cd /var/www/usr
# mkdir -p {bin,lib,libdata/perl5,libexec}
# mkdir -p /var/www/usr/libdata/perl5/`machine`-openbsd/5.8.6
# chown -R root:wheel /var/www/usr
# chmod -R 555 *
Copier l'interpréteur Perl
# cd /var/www/usr/bin # cp /usr/bin/perl . # chown root:wheel perl # chmod 111 perl
Copier les bibliothèques nécessaires
# cd /var/www/usr/lib
# cp /usr/lib/lib{c,m,perl,util}.so* .
# chown root:wheel *
# chmod 444 *
Copier l'éditeur de liens dynamique
# cd /var/www/usr/libexec # cp /usr/libexec/ld.so . # chown root:wheel ld.so # chmod 444 ld.so
Gérer les modules Perl
Déterminer les modules utilisés
Grâce à Mat (de reynerie point org), voici un superbe hack pour déterminer la liste de modules Perl nécessaires à l'exécution d'un script.
# perl -d:DProf script.pl
Un fichier tmon.out est créé dans le répertoire courant. Il contient les traces d'exécution du script. Pour déterminer les modules Perl appelés, il faut faire chauffer la commande grep(1) :
# grep -E '^&' tmon.out| cut -d' ' -f 3| sort| uniq
Les lignes en minuscules sont les chargements des pragma (strict, warnings, …), les autres sont des modules, standards ou non.
Exemple
Voici un exemple tiré d'un script Perl client IRC web, exécuté en CGI.
Déterminer les modules
# cd /var/www/cgiirc # perl -d:DProf irc.cgi # grep -E '^&' tmon.out |cut -d' ' -f 3 |sort |uniq Config default lib main strict vars warnings warnings::register
Copier les modules Perl
Procédez comme suit :
# mkdir -p /var/www/usr/libdata/perl5
# cd /var/www/usr/libdata/perl5
# cp -p /usr/libdata/perl5/{strict,warnings,vars}.pm .
# mkdir /usr/libdata/perl5/warnings
# cp -p /usr/libdata/perl5/warnings/register.pm ./warnings
# cd /var/www/usr/libdata/perl5/i386-openbsd/5.8.6
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.6/Config.pm .
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.6/lib.pm .
Modifier le fichier de configuration d'Apache
Pour que le serveur Apache reconnaisse les extensions .cgi et .pl comme des CGI, et les exécute, il faut ajouter les deux lignes suivantes au fichier /var/www/conf/httpd.conf :
# To use CGI scripts: AddHandler cgi-script .cgi AddHandler cgi-script .pl
Puis, redémarrez Apache pour prendre en compte toutes les modifications.