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.

 
doc/openbsd/perl_chroot.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page