Installer le client web IRC cgiirc dans un chroot

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

cgiirc, IRC, client, CGI, chroot, cage, https, OpenBSD

Introduction

Ce document décrit comment installer le client web cgiirc dans un environnement à racine déplacé (aussi appelé cage ou chroot) sur un système OpenBSD 4.3.

Par défaut le système OpenBSD est livré avec un serveur Apache 1.3.x “chrooté” dans le répertoire /var/www. Nous allons utiliser ce serveur. Le service cgiirc ne devra être accessible que via le protocole https.

Le produit utilisé, cgiirc, est disponible à l'adresse : http://cgiirc.sourceforge.net.

Présentation de la maquette

Les éléments suivants sont mis en oeuvre :

  • un système OpenBSD 4.3
  • le serveur http/https Apache 1.3.x d'OpenBSD “chrooté”
  • un interpréteur Perl “chrooté”
  • le client web IRC cgiirc
  • un serveur IRC local

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 et qui supporte le protocole https
  • un serveur IRC local (ici ngIRCd)

Installer cgiirc

Présentation des composants

Le produit cgiirc est composé de trois programmes principaux :

  • irc.cgi
  • client-perl.cgi qui peut être remplacé par client.cgi
  • nph-irc.cgi

et de modules Perl spécifiques dans le répertoire modules.

cgiirc offre la possibilité de remplacer le script Perl client-perl.cgi par un programme en C client.c qu'il faut compiler. Cette option est retenue pour la maquette car elle présente deux avantages. Premièrement elle évite de gérer les dépendances de modules pour un script Perl suplémentaire. Deuxièmement elle accélère l'exécution du produit. Un CGI compilé s'exécute toujours plus vite qu'un script. Dans la maquette, le binaire sera compilé statiquement pour éviter la gestion des bibliothèques de fonctions liées et augmenter la sécurité.

Télécharger les sources

Procédez comme suit :

# cd /tmp
# ftp http://prdownloads.sourceforge.net/cgiirc/cgiirc-0.5.9.tar.gz

Installer le produit

Pour installer les scripts Perl et compiler le binaire client.cgi, exécutez les commandes suivantes :

# cd /var/www
# tar xzf /tmp/cgiirc-0.5.9.tar.gz
# mv cgiirc-0.5.9 cgiirc
# cd cgiirc

# gcc -static -o client.cgi client.c

Vérifiez que le binaire est bien compilé statiquement :

# ldd client.cgi
client.cgi:
ldd: client.cgi: not a dynamic executable

Fixez les permissions

# chmod 511 client.cgi

Dernières configurations

Fixer les permissions d'accès

Par défaut, le répertoire cgiirc est accessible à tous. Or, seul les membres du groupe d'exécution du serveur web (ici, www) et l'utilisateur root ont besoin d'accéder à ce répertoire.

Pour limiter les accès au strict nécessaire, exécutez les commandes suivantes :

# chown root:www /var/www/cgiirc
# chmod 710 /var/www/cgiirc

Déplacer les éléments non utilisés

Pour “nettoyer” l'arborescence, exécutez les commandes suivantes :

# cd /var/www/cgiirc
# mkdir NOTUSE
# chmod 700 NOTUSE
# mv cgiirc.config.full client.c client-perl.cgi NOTUSE
# mv README ipaccess.example docs NOTUSE
# cp .htaccess NOTUSE

Installer l'interpréteur Perl dans le chroot

Une fois le produit installé, il faut copier 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 Open Ref GrpRef Name
        00000000 00000000 exe  1    0   0      /usr/bin/perl
        01bb3000 21bd4000 rlib 0    1   0      /usr/lib/libperl.so.10.1
        079c9000 279d0000 rlib 0    1   0      /usr/lib/libm.so.2.3
        0ba06000 2ba0a000 rlib 0    1   0      /usr/lib/libutil.so.11.0
        0b23c000 2b270000 rlib 0    1   0      /usr/lib/libc.so.43.0
        04523000 04523000 rtld 0    1   0      /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.8

# chown -R root:wheel /var/www/usr
# find . -type d -exec chmod 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 nécessaires

Grâce à Mat (de reynerie point org), voici un superbe hack pour déterminer la liste de modules Perl nécessaire à 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.

script irc.cgi

# cd /var/www/cgiirc
# perl -d:DProf irc.cgi
# grep -E '^&' tmon.out |cut -d' ' -f 3 |sort |uniq
Config
DynaLoader
HTML::Entities
HTML::Parser
XSLoader
default
lib
main
strict
utf8
vars
warnings
warnings::register

script nph-irc.cgi

# cd /var/www/cgiirc
# perl -d:DProf nph-irc.cgi
# grep -E '^&' tmon.out |cut -d' ' -f 3 |sort| uniq
Command
Config
DynaLoader
Encode
Encode::Alias
Encode::Config
Encode::Encoding
Encode::utf8
Event
Exporter
IRC
IRC::Channel
IRC::Channel::Nick
IRC::RawCommands
IRC::UniqueHash
IRC::Util
Socket
Symbol
Timer
UNIVERSAL
XSLoader
base
bytes
lib
main
strict
vars
warnings
warnings::register

Copier les modules Perl nécessaires

Procédez comme suit :

# cd /var/www/usr/libdata/perl5
# cp -p /usr/libdata/perl5/{strict,warnings,vars,base,Exporter,Symbol}.pm .
# cp -p /usr/libdata/perl5/warnings/register.pm ./warnings
# cp -p /usr/libdata/perl5/{AutoLoader.pm,utf8.pm,utf8_heavy.pl} .
# cp -rp /usr/libdata/perl5/unicore .

# cd /var/www/usr/libdata/perl5/i386-openbsd/5.8.8
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.8/lib.pm .
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.8/Socket.pm .
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.8/XSLoader.pm .
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.8/Config.pm .
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.8/DynaLoader.pm .
# cp -p /usr/libdata/perl5/i386-openbsd/5.8.8/Encode.pm .

# mkdir /var/www/usr/libdata/perl5/i386-openbsd/5.8.8/auto
# cd /var/www/usr/libdata/perl5/i386-openbsd/5.8.8/auto
# cp -rp /usr/libdata/perl5/i386-openbsd/5.8.8/auto/Socket .
# cp -rp /usr/libdata/perl5/i386-openbsd/5.8.8/auto/DynaLoader .
# cp -rp /usr/libdata/perl5/i386-openbsd/5.8.8/auto/Encode .

Configurer le produit cgiirc

La configuration du produit s'effectue via le fichier /var/www/cgiirc/cgiirc.config. Modifiez-le comme suit :

# /var/www/cgiirc/cgiirc.config
# This is the default configuration file for CGI:IRC 0.5
# See http://cgiirc.sourceforge.net/docs/config.php

# -----
# These are the default settings to show on the login form

# default server(s) to connect to, more than one server can
# be entered as a comma seperated list
default_server = 127.0.0.1
default_port = 6667

# Channel(s) to allow access to, a comma seperated list
default_channel = #leaves

# Realname to use (in /whois)
default_name = CGI:IRC User

# default nickname, a ? is replaced with a random number
default_nick = CGI???


# -----
# System setup options

# The path to images for the browser
image_path = images

# You can change the default locations of the scripts with these
# settings, generally they don't need to be changed
script_nph = nph-irc.cgi
#script_form = client-perl.cgi
script_form = client.cgi
script_login = irc.cgi


# ----
# Interface settings
# These control the options for the user - the user can change these via the
# options dialog.
# Uncommenting the options below will change from the default value.

# Enable Timestamps for all text
interface timestamp = 1

# Convert :-) and so on into smilie images
interface smilies = 0

# Default font to use
interface font = monospace

# Show users nickname next to text entry area
interface shownick = 1

#EOF

Personnaliser la page de connexion

Modifiez selon vos souhaits le fichier /var/www/cgiirc/interfaces/default.pm

Modifier le fichier de configuration d'Apache

La configuration du serveur Apache doit être modifiée pour :

  • définir le chemin physique de l'url
  • forcer l'utilisation du protocole https pour l'accès à l'interface cgiirc
  • fixer les permissions d'accès au produit cgiirc
  • autoriser l'exécution des CGI installés

Modifiez comme suit le fichier /var/www/conf/httpd.conf

Alias /cgiirc "/var/www/cgiirc"

<Directory "/var/www/cgiirc">
        # Enable SSL for cgiirc engine
        SSLVerifyClient none
        SSLRequireSSL
        Options +ExecCGI
        DirectoryIndex irc.cgi
        AllowOverride None
        Order allow,deny
        Allow from all
</Directory>

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.

Accéder au client cgiirc

Pour accéder au client cgiirc, ouvrez votre navigateur préféré, et saisissez l'url suivante :

https://leaves.org/cgiirc

La page de connexion s'affiche alors.

Liens

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